dsh-composer-plus 1.22.0 → 1.23.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 +39 -11
- package/README.es.md +39 -11
- package/README.fr.md +39 -11
- package/README.hi.md +39 -11
- package/README.id.md +39 -11
- package/README.ja.md +39 -11
- package/README.ko.md +39 -11
- package/README.md +39 -11
- package/README.pt-BR.md +39 -11
- package/README.ru.md +39 -11
- package/README.tr.md +39 -11
- package/README.vi.md +39 -11
- package/README.zh.md +39 -11
- package/assets/features/featureFilter.webp +0 -0
- package/assets/features/issueReport.webp +0 -0
- package/assets/features/previewQuote.webp +0 -0
- package/assets/features/remoteComputers.webp +0 -0
- package/assets/features/turkishSkill.webp +0 -0
- package/assets/features/untangleCodebase.webp +0 -0
- package/assets/features/windowSize.webp +0 -0
- package/assets/skills/untangle-codebase/LICENSE +21 -0
- package/assets/skills/untangle-codebase/SKILL.md +142 -0
- package/client.js +941 -161
- package/index.js +467 -39
- package/package.json +4 -3
- package/release-notes.json +14 -14
- package/tether/gateway/server.mjs +24 -5
package/README.es.md
CHANGED
|
@@ -14,7 +14,7 @@ Mejoras de comodidad al estilo de Codex para la interfaz de escritorio y web de
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness con Composer Plus: el proyecto en ejecución muestra un indicador de carga en la barra lateral y el panel de cambios muestra un diff de git"></p>
|
|
16
16
|
|
|
17
|
-
Plugin comunitario no oficial.
|
|
17
|
+
Plugin comunitario no oficial. La comprobación de actualizaciones hace llamadas de red (las versiones publicadas en GitHub y el registro de npm). Desactiva **Actualizaciones automáticas** para que no se hagan al iniciar. **Paquete de skill en turco** (activado por defecto) descarga turkish-anti-ai-skill de GitHub y busca una versión nueva una vez al día, solo mientras **Idioma de la aplicación** es Türkçe; desactívalo en **Configuración → Composer Plus** para detener estas llamadas. **Ideas de funciones** llama al modelo de tu propio chat solo cuando haces clic en **Sugerir funciones**. **Predicción del siguiente mensaje** (activada de forma predeterminada) llama al modelo elegido en Configuración (el predeterminado de dsh, salvo que elijas otro) una vez después de cada turno terminado, sin ningún clic. Desactívala en **Configuración → Composer Plus** para detener estas llamadas. **Completar al escribir** (desactivado de forma predeterminada) llama al modelo elegido para esta función (de forma predeterminada, el de la predicción) en cada pausa mientras escribes, después de que lo actives. **Mejorar prompt** solo llama a un modelo cuando haces clic en su varita mágica. **Tablero de tareas** llama una vez al modelo del chat nuevo para las etiquetas de cada tarea que inicias en el tablero. Con su ajuste **Resumen con IA** (el predeterminado es **Rápido (sin IA)**), también llama al modelo de un chat en curso para una breve nota de progreso mientras miras el progreso de esa tarea en el tablero o en Tether. **Comprobación del objetivo** (activada de forma predeterminada) llama a un modelo una vez cada vez que el agente marca un `/goal` como completado en una ronda automática. **Conexión móvil** (desactivada de forma predeterminada) acepta conexiones del iPhone desde tu red local o tu tailnet solo después de que la actives.
|
|
18
18
|
|
|
19
19
|
## Instalación
|
|
20
20
|
|
|
@@ -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.23.0`.
|
|
33
33
|
|
|
34
34
|
## Funciones
|
|
35
35
|
|
|
@@ -48,6 +48,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
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
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> |
|
|
50
50
|
| **Ajustar la cabecera del chat a la ventana** | <a id="feature-headerfit"></a>En una ventana estrecha, los botones de la cabecera del chat de dsh (el modo, los subagentes, los trabajos en segundo plano, Abrir en, la etiqueta de rama y la etiqueta de permisos) ya no se tapan entre sí. El título del chat conserva al menos 120 px; los botones que no caben pasan a una segunda línea a la derecha, y todos se pueden pulsar. Cuando todo cabe en una línea (una ventana ancha), la cabecera es exactamente la de dsh. Sin esta función, dsh solo encoge el título: con un subagente y trabajos en segundo plano, sus botones se superponen en una columna de chat estrecha. La etiqueta de rama (**Una rama por chat**) y la de permisos (**Permitir en este chat**) también se ajustan a la cabecera con este interruptor apagado. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Captura: Ajustar la cabecera del chat a la ventana"></a> |
|
|
51
|
+
| **Recordar el tamaño de la ventana** | <a id="feature-windowsize"></a>La app de escritorio de dsh abre su ventana a 1280 × 820 en cada inicio. Con esta función, se abre con el tamaño y la posición que tenía la ventana la última vez. El tamaño se guarda cada vez que cambias el tamaño de la ventana o la mueves, y vuelve cuando el plugin se carga en el siguiente inicio. Una ventana a pantalla completa o minimizada no se guarda; una posición en una pantalla que ya no está conectada vuelve en la pantalla principal. Solo en la app de escritorio: una pestaña del navegador no puede cambiar el tamaño de su ventana. | <a href="assets/features/windowSize.webp"><img src="assets/features/windowSize.webp" width="160" alt="Captura: Recordar el tamaño de la ventana"></a> |
|
|
51
52
|
| **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> |
|
|
52
53
|
| **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> |
|
|
53
54
|
| **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> |
|
|
@@ -69,6 +70,8 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
69
70
|
| **Continuar en un chat nuevo** | <a id="feature-handoffchat"></a>Haz clic derecho en un chat de la barra lateral (o abre su menú **…**) → **Continuar en un chat nuevo…**. Una llamada al propio modelo del chat escribe una nota de traspaso con lo que muestra el chat: Tarea, Resultados, Completado, Decisiones, Problemas abiertos y Siguiente acción (las llamadas a herramientas y sus resultados son la evidencia; los pasos que revertiste se omiten). La nota se abre en un diálogo: léela y edítala. **Volver a escribir** escribe una nota nueva. **Iniciar chat nuevo** (o `Cmd/Ctrl+Enter`) abre un chat nuevo en el mismo proyecto con la nota y un enlace al chat anterior como primer mensaje; el chat anterior queda como está. Úsalo cuando un chat largo esté lleno o lento, o para continuar mañana. No se escribe nada en el proyecto. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Captura: Continuar en un chat nuevo"></a> |
|
|
70
71
|
| **Desglose del contexto** | <a id="feature-contextbreakdown"></a>Barra lateral derecha → `+` → **Contexto**. La página muestra qué llena ahora el contexto del modelo del chat abierto y cuánto de la ventana de contexto usa: el prompt del sistema, las instrucciones del proyecto (AGENTS.md), las skills, tus mensajes, las respuestas del agente y las llamadas a herramientas, los resultados de herramientas (por herramienta), los resultados de MCP (por servidor), las definiciones de herramientas, el resumen de compactación y otras notas de contexto, cada uno con sus tokens y su parte. Haz clic en una parte para ver sus herramientas o servidores. Solo lee el registro del chat, después de `/compact` y de las reversiones, y no llama a ningún modelo; vuelve a leerlo después de cada turno y con **Actualizar**. Úsalo para ver por qué un chat está lento o lleno, por ejemplo por un resultado grande de una herramienta MCP o por muchas definiciones de herramientas. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Captura: Desglose del contexto"></a> |
|
|
71
72
|
| **Pasos planificados** | <a id="feature-plannedsteps"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. El agente recibe la herramienta `plan_next_steps`: en el mismo mensaje que un comando, puede planificar los siguientes comandos con sus argumentos exactos y una condición, por ejemplo «ejecuta `npm test` cuando la compilación pase». Cuando el resultado cumple la condición, Composer Plus ejecuta el siguiente paso por sí mismo, sin una nueva llamada al modelo, así un chat largo usa menos tokens. El paso aparece en el chat como una línea corta, «Composer Plus · Planned steps: ran `test` … without a model call», seguida de su llamada a la herramienta y su resultado. Solo pasos de `bash`, `read`, `grep` y `glob`; las aprobaciones, el sandbox y Archivos protegidos se aplican a cada paso como siempre. El modelo vuelve a responder cuando una condición falla, cuando dos pasos están listos a la vez, después del último paso y cuando envías un mensaje. La idea viene de HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Captura: Pasos planificados"></a> |
|
|
73
|
+
| **Paquete de skill en turco** | <a id="feature-turkishskill"></a>Solo mientras **Idioma de la aplicación** es Türkçe (activado por defecto; desactívalo en **Configuración → Composer Plus**). Composer Plus descarga de GitHub el skill de código abierto [turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) (MIT, de Yüce Zerey) y lo añade a los skills de dsh. Pide al agente que humanice, reescriba o escriba un texto en turco: dsh carga el skill, y sus reglas ayudan al agente a escribir un turco natural, sin patrones de IA. Solo se guardan los archivos Markdown del paquete; cada uno debe coincidir con la lista de archivos de GitHub, y ningún script del paquete se ejecuta. Una vez al día el plugin pregunta a GitHub por una versión nueva y la instala. La fila muestra la versión instalada o por qué no está instalada. En otro idioma el skill no se instala; vuelve a Türkçe y regresa. | <a href="assets/features/turkishSkill.webp"><img src="assets/features/turkishSkill.webp" width="160" alt="Captura: Paquete de skill en turco"></a> |
|
|
74
|
+
| **Desenredar el código** | <a id="feature-untanglecodebase"></a>Activada de forma predeterminada; desactívala en **Configuración → Composer Plus**. Añade la skill `/untangle-codebase` de [caldoai/skills](https://github.com/caldoai/skills) (MIT, © 2026 Maze) a la lista de skills de dsh. En un chat, escribe `/untangle-codebase` (aparece en el menú `/`), si quieres seguido de un área en la que centrarse, por ejemplo `/untangle-codebase src/api`, y envíalo. Primero el agente pregunta si también debe quitar los comentarios que solo repiten el código y las pruebas que no pueden detectar un error real. Después enumera cada copia, vínculo oculto, vínculo innecesario, envoltorio que solo reenvía, código muerto y caso especial puntual, planifica las correcciones desde los principios básicos, las hace como un objetivo y vuelve a comprobar con subagentes hasta que no queda nada que valga la pena corregir. Solo tú puedes iniciarla: el modelo no la ve en su lista de skills, así que no gasta tokens en otros chats. Una skill con el mismo nombre en el proyecto o en `~/.dsh/skills` tiene prioridad. Iníciala en un chat de **Una rama por chat** y revisa el resultado en **Panel de cambios**. En Tether: escribe `/untangle-codebase` en el campo del mensaje. | <a href="assets/features/untangleCodebase.webp"><img src="assets/features/untangleCodebase.webp" width="160" alt="Captura: Desenredar el código"></a> |
|
|
72
75
|
| **Archivos protegidos** | <a id="feature-protectedfiles"></a>Activado de forma predeterminada. Las herramientas de archivos propias del agente no pueden leer ni cambiar los archivos que coinciden con tus patrones: `read`, `read_image` y `grep` sobre un archivo se rechazan con los patrones de **lectura y escritura**, y `write`, `edit` y `str_replace_editor` con los dos tipos. El agente lee el motivo y se le indica que te pregunte. Los patrones predeterminados son `.env*`, `*.pem` y `*.key`. Configuración → Composer Plus → **Archivos protegidos**: añade un patrón (por ejemplo `published/**` o `config/*.yml`), haz clic en su tipo para cambiar entre **lectura y escritura** y **solo escritura**, quítalo con ✕ o haz clic en **Usar los valores predeterminados**. Un patrón sin `/` coincide con un nombre de archivo en cualquier carpeta. Es una barrera de protección, no un sandbox: un comando de shell (`cat .env`), un script o una herramienta MCP aún pueden llegar al archivo (consulta Límites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Captura: Archivos protegidos"></a> |
|
|
73
76
|
| **Comandos bloqueados** | <a id="feature-blockedcommands"></a>Activado de forma predeterminada, con una lista vacía. Los comandos de shell del agente (`bash`, `pwsh`) no pueden ejecutar un comando que coincida con tus reglas: una regla **bloquear** rechaza la llamada (el agente lee el motivo y se le indica que te pregunte), una regla **preguntar antes** muestra la tarjeta de aprobación de dsh, y el comando solo se ejecuta cuando tú lo permites. Configuración → Composer Plus → **Comandos bloqueados**: escribe una regla (por ejemplo `npm publish`, `git push --force` o `ssh *192.168.2.19`), haz clic en el tipo para cambiar entre **bloquear** y **preguntar antes** y luego haz clic en **Añadir**; haz clic en el tipo de una regla para cambiarlo y quítala con ✕. Una regla es un nombre de comando y palabras que deben venir después de él en este orden; `*` coincide con cualquier texto. La comprobación también encuentra el comando después de `&&`, `;`, `\|`, dentro de `$(…)`, `bash -c "…"` o `eval`, y después de `sudo` o `env`. Es una barrera de protección, no un sandbox: una variable (`$CMD`), un archivo de script u otro programa aún pueden ejecutar el comando (consulta Límites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Captura: Comandos bloqueados"></a> |
|
|
74
77
|
| **Tablero de tareas** | <a id="feature-taskboard"></a>Barra lateral izquierda → **Tablero de tareas**, o pulsa `Cmd+Shift+K` (`Ctrl+Shift+K` en Windows y Linux) en cualquier lugar de dsh. Un tablero kanban de tus chats de dsh con el estado en vivo que muestra la barra lateral: un chat que espera tu aprobación, tu respuesta o la revisión de un plan está en **En revisión** con un punto naranja, un chat en ejecución está en **En curso** y un chat terminado que aún no abriste está en **Hecho** (verde). Cuando abres un chat, su tarjeta sale de **Hecho** por sí sola; haz clic en **Terminados hace poco (N)**, debajo de las tarjetas verdes, para ver los chats terminados que ya leíste (los 10 más recientes y luego **Mostrar N más antiguas**; abierto o cerrado se guarda en este dispositivo). Un chat que termina mientras está abierto detrás del tablero (una **Nueva tarea**) sigue verde hasta que lo abres. Haz clic en el nombre del proyecto, arriba del tablero, para abrir la lista de proyectos y elige un proyecto o **Todos los proyectos**; una carpeta de «Una rama por chat» cuenta como su proyecto. La lista se cierra al elegir, con `Esc` o con un clic fuera de ella. Escribe en **Buscar proyectos**, arriba de la lista, para encontrar un proyecto por su nombre (no importan las mayúsculas ni los acentos; `Esc` vacía el cuadro), pulsa `Enter` para elegir la primera coincidencia y haz clic en **Activos en las últimas 2 horas** para mostrar solo los proyectos con un chat que espera, se ejecuta, terminó sin que lo vieras o cambió en las últimas 2 horas (se guarda en este dispositivo). **Nueva tarea** (o `n`) abre el propio chat nuevo de dsh en el proyecto que muestra el tablero (con **Todos los proyectos**, el proyecto que elige Nueva sesión de dsh), así que puedes añadir archivos, usar comandos y elegir el modelo como en cualquier chat. Cuando se envía tu primer mensaje, el tablero vuelve por sí solo. Hasta entonces, el chat espera en la parte superior de **En curso** como **Nueva tarea**: haz clic en él para escribir el primer mensaje. Un proyecto con un chat que te espera tiene un punto naranja en la lista de proyectos (el nombre del proyecto arriba también lo tiene mientras algún chat espera). dsh pone nombre al chat y el modelo del chat escribe hasta 3 etiquetas a partir de ese mensaje. Haz clic en una tarjeta para abrir su chat. Haz clic en una tarjeta naranja (o en su **Responder**) para responderla en el tablero; el panel tiene **Abrir chat** para ver el chat entero: **Rechazar** o **Permitir una vez**, **Aprobar** o **Solicitar cambios** para un plan, o las opciones y tu propio texto para una pregunta. Haz clic en **×** en una tarjeta terminada para quitarla del tablero, o abre **Terminados hace poco** y haz clic en **Limpiar todo**, en la parte superior de **Hecho**, para quitar esas tarjetas del tablero: primero muestra cuántas tarjetas de qué proyecto se quitan, y las tarjetas sin leer (verdes) se quedan. Durante los 8 segundos siguientes, **Deshacer** devuelve las tarjetas; **Quitadas (N)**, debajo de **Hecho**, lista las tarjetas que están fuera del tablero, y **Volver a poner** muestra una de nuevo en **Hecho**. No se borra ningún chat: los chats siguen en la barra lateral de dsh, el tablero lo recuerda después de reiniciar (Tether muestra el mismo tablero) y un chat que vuelve a ejecutarse regresa al tablero. Apunta a una tarjeta de **En curso** (o mueve el foco del teclado a ella) para ver su progreso: cuánto tiempo lleva en ejecución, el paso de su lista de tareas pendientes, la herramienta que se ejecuta ahora y la última línea del agente. En Configuración → Composer Plus → Tablero de tareas, **Progreso al pasar el cursor** elige **Rápido (sin IA)** (el predeterminado: solo lee el chat) o **Resumen con IA** (una llamada corta al modelo del chat también escribe una o dos frases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Captura: Tablero de tareas"></a> |
|
|
@@ -84,6 +87,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
84
87
|
| **Rechazar con nota** | <a id="feature-rejectnote"></a>La tarjeta de aprobación muestra **Rechazar con nota…** junto a **Rechazar**. Haz clic, escribe el motivo o qué hacer en su lugar y haz clic en **Rechazar** (o pulsa `Enter`; `Shift+Enter` añade una línea, `Esc` cierra el campo). La nota llega primero al agente, como un mensaje dentro del turno que espera, y después se rechaza la solicitud: el modelo lee el rechazo y tu nota en el mismo turno, sin otro mensaje tuyo. Si la nota no se puede enviar, no se rechaza nada y el campo sigue abierto. En Tether: hoja de aprobación → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="Captura: Rechazar con nota"></a> |
|
|
85
88
|
| **Entrada secreta** | <a id="feature-secretinput"></a>El agente recibe la herramienta `request_secret`. Cuando necesita una contraseña, un token o una clave de API, la pide con ella en lugar de en el chat: en la fila de la herramienta aparece una tarjeta con el nombre, para qué necesita el valor, un campo de contraseña, **Guardar** y **Rechazar**. **Guardar** escribe el valor en un archivo de este Mac que solo tú puedes leer, y el agente recibe solo la ruta del archivo, que usa como entrada en un comando (por ejemplo `"$(cat <path>)"`). Si un resultado de herramienta posterior muestra el valor, `[secret]` lo reemplaza antes de que el modelo lo vea. El archivo se borra al terminar el turno. **Rechazar** le dice al agente que no lo diste. Desactívala en **Configuración → Composer Plus** para quitar la herramienta. En Tether: la barra "Secret: …" sobre el campo de texto → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="Captura: Entrada secreta"></a> |
|
|
86
89
|
| **Citar en la respuesta** | <a id="feature-quotereply"></a>Selecciona una parte de una respuesta: aparece un botón **Citar** sobre la selección. Haz clic: esa parte va al campo de texto, en la posición del cursor, como cita de Markdown (`> …`), con una línea vacía después, y el campo de texto recibe el foco para que escribas tu respuesta debajo. Solo cuenta el texto de la respuesta, no el razonamiento, las filas de herramientas ni tus propios mensajes. Una cita tiene como máximo 2.000 caracteres. `Cmd+Z` (`Ctrl+Z`) la quita. En Tether: mantén pulsada una respuesta → Quote (la respuesta completa). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="Captura: Citar en la respuesta"></a> |
|
|
90
|
+
| **Citar desde la vista previa del archivo** | <a id="feature-previewquote"></a>Abre un archivo en la barra lateral derecha (**Archivos del espacio de trabajo**, o un archivo que abrió el chat) y selecciona líneas en él: aparece un botón **Citar** sobre la selección. Haz clic: la ruta del archivo, los números de línea y las líneas van al campo de texto, en la posición del cursor, y el campo de texto recibe el foco, para que el agente sepa a qué parte te refieres. Los archivos de código y de texto dan `src/login.js:2-3` y las líneas como bloque de código; los archivos Markdown y PDF dan la ruta (un PDF también su página, `docs/spec.pdf#page=3`) y una cita `> …`. Una ruta dentro de la carpeta del chat es relativa. Como máximo 2.000 caracteres. `Cmd+Z` (`Ctrl+Z`) quita el texto insertado. No está en Tether. | <a href="assets/features/previewQuote.webp"><img src="assets/features/previewQuote.webp" width="160" alt="Captura: Citar desde la vista previa del archivo"></a> |
|
|
87
91
|
| **Chat lateral** | <a id="feature-sidechat"></a>Escribe una pregunta lateral en el campo de texto y haz clic en el botón de bocadillos (**Preguntar en un chat lateral**): se abre una copia del chat que la responde en el modo de solo lectura de dsh, mientras el chat sigue trabajando. La copia conoce el chat hasta ahora, salvo los mensajes que aún esperan en la cola, y usa su modelo. Una barra sobre su campo de texto tiene **Traer de vuelta**: el chat se abre y su campo de texto recibe tus preguntas (como citas `> `) y las respuestas. **Volver al chat** solo abre el chat. El chat lateral queda en la barra lateral como "↳ <pregunta>"; archívalo allí. En Tether: menú del título del chat → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="Captura: Chat lateral"></a> |
|
|
88
92
|
| **Notas del diff** | <a id="feature-diffcomments"></a>En **Panel de cambios**, abre el diff de un archivo y haz clic en **+** en una línea (Mayús+clic en una segunda línea del mismo bloque para un rango), escribe una nota y haz clic en **Guardar nota**. Las notas del chat esperan en una barra arriba del panel; **Enviar al campo de texto** las pone en la posición del cursor como Markdown: `path:12-14`, las líneas como bloque `diff` y tu nota. **Borrar** las descarta. Las notas quedan en este navegador hasta que las envíes o las borres. Necesita **Panel de cambios**. En Tether: el diff de un archivo → mantén pulsada una línea → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="Captura: Notas del diff"></a> |
|
|
89
93
|
| **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> |
|
|
@@ -95,12 +99,14 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
95
99
|
| **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> |
|
|
96
100
|
| **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> |
|
|
97
101
|
| **Abrir el chat en espera si estás inactivo** | <a id="feature-idleswitch"></a>Cuando un chat hace una pregunta, espera una aprobación o una revisión del plan (el punto naranja) o termina un turno que aún no has leído (el punto verde), y no usas dsh durante 30 segundos, dsh abre ese chat. Los chats naranjas se abren antes que los verdes. En cada grupo, 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. Cuando se abre un chat verde, su punto desaparece; el siguiente chat verde solo se abre después de que vuelvas a usar dsh y luego pases 30 segundos sin usarlo. 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> |
|
|
98
|
-
| **Siguiente chat en espera** | <a id="feature-nextwaiting"></a>Un botón en la cabecera de la barra lateral muestra cuántos otros chats te esperan, con un punto del color del siguiente: naranja cuando hace una pregunta o espera una aprobación o una revisión del plan, verde cuando terminó un turno que aún no has leído. Haz clic en él, o pulsa Cmd+Shift+E (Ctrl+Shift+E en Windows y Linux), para abrir ese chat. Los chats naranjas van antes que los verdes; en cada grupo, primero va el chat que lleva más tiempo esperando. El chat en pantalla no cuenta. Si ningún otro chat espera, el botón no aparece y la tecla no hace nada. Puedes cambiar la tecla en la página de atajos de teclado de dsh (Siguiente chat en espera). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Captura: Siguiente chat en espera"></a> |
|
|
102
|
+
| **Siguiente chat en espera** | <a id="feature-nextwaiting"></a>Un botón en la cabecera de la barra lateral muestra cuántos otros chats te esperan, con un punto del color del siguiente: naranja cuando hace una pregunta o espera una aprobación o una revisión del plan, verde cuando terminó un turno que aún no has leído. Haz clic en él, o pulsa Cmd+Shift+E (Ctrl+Shift+E en Windows y Linux), para abrir ese chat. Un clic en el botón también encuentra el chat en la barra lateral: un proyecto contraído se abre, la lista se desplaza hasta el chat y el chat parpadea durante 5 segundos. Los chats naranjas van antes que los verdes; en cada grupo, primero va el chat que lleva más tiempo esperando. El chat en pantalla no cuenta. Si ningún otro chat espera, el botón no aparece y la tecla no hace nada. Puedes cambiar la tecla en la página de atajos de teclado de dsh (Siguiente chat en espera). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Captura: Siguiente chat en espera"></a> |
|
|
99
103
|
| **Botones de opciones** | <a id="feature-optionpicks"></a>Cuando una respuesta termina con una lista de opciones (una lista numerada de 1 a 9 elementos bajo un título "Opciones" o una línea en negrita "Opciones", también "Próximos pasos" y las mismas palabras en los idiomas de la aplicación), aparece un botón para cada opción debajo de la respuesta. Un clic envía "Option N: …" con toda la opción como tu mensaje, como si lo hubieras escrito. La opción marcada "(recomendada)" se destaca. Los botones solo aparecen debajo de la respuesta más reciente, mientras el chat está inactivo y el cuadro de mensaje está vacío; una respuesta ya elegida y una respuesta retirada por una reversión no muestran botones. Mientras se muestran, la predicción del siguiente mensaje no propone nada. En una tarjeta de pregunta del agente, las teclas 1–9 eligen esa opción, igual que un clic (no en el campo de respuesta, ni en los primeros 0,8 segundos después de que aparece la pregunta). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Captura: Botones de opciones"></a> |
|
|
100
104
|
| **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> |
|
|
101
105
|
| **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> |
|
|
102
|
-
| **Equipos remotos** | <a id="feature-remotecomputers"></a>Abre el dsh de tus otros Mac a través de [Tailscale](https://tailscale.com) y
|
|
103
|
-
| **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 en el idioma de **Idioma de la aplicación** (llegan con la nueva versión, sin otra llamada de red; un idioma sin notas muestra las notas en inglés); **Cerrar** o `Esc` la cierra. La ventana también aparece tras una actualización desde Configuración → Plugins o una carpeta copiada, una vez por versión nueva; no en la primera instalación. **Novedades de esta versión** en la fila de actualizaciones la abre de nuevo. Si en el disco hay una versión más reciente que la que se ejecuta, la fila pide reiniciar dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
|
|
106
|
+
| **Equipos remotos** | <a id="feature-remotecomputers"></a>Abre el dsh de tus otros Mac a través de [Tailscale](https://tailscale.com) y úsalos en esta ventana de dsh. Actívala en **Configuración → Composer Plus** en cada Mac (está desactivada de forma predeterminada, porque abre puertos de red). En el Mac que quieres abrir, activa **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace. En este Mac, elige **Añadir un equipo…** en el selector de equipos de la barra lateral izquierda (a la derecha del nombre de la marca, encima de **Nueva sesión**), pega el enlace, escribe un **Nombre** (no el de este Mac ni el de otro equipo) y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, el selector muestra **Este Mac** y tus equipos: elige uno y su dsh ocupa esta ventana, con sus propios chats, barra lateral, herramientas y archivos, mientras este Mac sigue funcionando detrás. El otro Mac muestra el mismo selector en el mismo lugar: elige **Este Mac** allí para volver. El panel de Configuración cambia el nombre de los equipos y los quita, y muestra los equipos que pueden abrir este Mac (**Quitar** desconecta uno al instante). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Captura: Equipos remotos"></a> |
|
|
107
|
+
| **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 en el idioma de **Idioma de la aplicación** (llegan con la nueva versión, sin otra llamada de red; un idioma sin notas muestra las notas en inglés); **Cerrar** o `Esc` la cierra. Debajo de las notas, una línea pide una estrella en GitHub, como mucho una vez cada 30 días (sin llamada de red); después de **Dar una estrella en GitHub** o **No volver a preguntar**, no vuelve a aparecer. La ventana también aparece tras una actualización desde Configuración → Plugins o una carpeta copiada, una vez por versión nueva; no en la primera instalación. **Novedades de esta versión** en la fila de actualizaciones la abre de nuevo. Si en el disco hay una versión más reciente que la que se ejecuta, la fila pide reiniciar dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
|
|
108
|
+
| **Filtro activadas/desactivadas** | <a id="feature-featurefilter"></a>Junto a **Buscar funciones** en **Configuración → Composer Plus**: **Todas** muestra todas las funciones, **Activadas** solo las que tienen el interruptor activado y **Desactivadas** solo las que lo tienen desactivado. Decide el interruptor de cada fila, también uno que guarda el Host de dsh (por ejemplo **Conexión móvil**). Funciona junto con la búsqueda: escribe una palabra y elige **Desactivadas** para encontrar una función que desactivaste. Una fila que cambias con **Activadas** o **Desactivadas** elegido se queda hasta que eliges un filtro de nuevo, así el foco sigue en su interruptor. **Activadas** y **Desactivadas** ocultan las filas **Idioma de la aplicación** y **Actualizaciones de Composer Plus** (no tienen interruptor). Configuración se abre siempre con **Todas**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Captura: Filtro activadas/desactivadas"></a> |
|
|
109
|
+
| **Informar de un problema** | <a id="feature-issuereport"></a>Configuración → Composer Plus → **Informar de un problema…** (debajo de la introducción), o haz clic derecho en un chat de la barra lateral (o abre su menú **…**) → **Informar de un problema de Composer Plus…**. Elige un tipo: **Error**, **Solicitud de función**, **Mejora**, **Traducción** o **Pregunta**. Descríbelo con tus propias palabras y en tu idioma, y luego haz clic en **Escribir borrador** (o pulsa `Cmd/Ctrl+Enter`). Una llamada al modelo predeterminado de dsh escribe una issue en inglés: un título con el prefijo del tipo (por ejemplo `[Bug]`) y las secciones de ese tipo (para un error: What happened, Steps to reproduce, Expected, Actual), más una línea con las versiones de Composer Plus, de dsh y del sistema. Lee y edita el título y la descripción; **Volver a escribir** escribe un borrador nuevo. **Abrir issue** la abre en el repositorio de GitHub de Composer Plus con tu sesión de GitHub CLI (`gh`) y muestra su enlace. La issue es pública: se rechaza el texto que parece una clave o una contraseña. Cuando `gh` no puede abrirla, **Abrir en GitHub en su lugar** abre la propia página de GitHub con el borrador ya rellenado. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Captura: Informar de un problema"></a> |
|
|
104
110
|
| **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> |
|
|
105
111
|
| **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> |
|
|
106
112
|
| **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> |
|
|
@@ -112,7 +118,7 @@ Los botones, la información emergente, los avisos y las notificaciones siguen e
|
|
|
112
118
|
|
|
113
119
|
## Configuración
|
|
114
120
|
|
|
115
|
-
Cada función se puede activar o desactivar por separado en **Configuración → Composer Plus** de dsh. Cada fila tiene una captura pequeña: pasa el puntero por encima para ver una vista previa más grande, o haz clic para abrirla a tamaño completo (`Esc` la cierra). El cuadro **Buscar funciones** de la parte superior filtra la página por nombre o descripción (en cualquier idioma, sin distinguir mayúsculas ni acentos); `Esc` lo vacía. Cada fila tiene un interruptor y una breve descripción. El pequeño **?** junto al nombre de una fila abre la parte de este README que describe esa función, en el README del idioma de la interfaz de dsh. Los cambios se aplican de inmediato, sin reiniciar, y se recuerdan en ese dispositivo. Todo está activado de forma predeterminada, salvo **Conexión móvil**, **Reanudar tras reiniciar** y **Completar al escribir**. El Host de dsh guarda los interruptores de estas tres funciones y los de **Búsqueda en el contenido**, **Revertir turno**, **Predicción del siguiente mensaje** y **Comprobación del objetivo**, así que se aplican a todas las ventanas y se mantienen tras un reinicio. El Host también guarda el **Modelo** elegido para **Predicción del siguiente mensaje**, el de **Completar al escribir** (por defecto **Igual que la predicción del siguiente mensaje**), el de **Mejorar prompt**, el de **Comprobación del objetivo** (ambos por defecto **Igual que el modelo del chat**) y el **Límite de tiempo** de **Permitir en este chat** (1 hora por defecto). **Búsqueda en el contenido** solo cambia después de reiniciar dsh (dsh la lee al iniciar); hasta entonces, su fila dice **Reinicia dsh para aplicar este cambio.**
|
|
121
|
+
Cada función se puede activar o desactivar por separado en **Configuración → Composer Plus** de dsh. Cada fila tiene una captura pequeña: pasa el puntero por encima para ver una vista previa más grande, o haz clic para abrirla a tamaño completo (`Esc` la cierra). El cuadro **Buscar funciones** de la parte superior filtra la página por nombre o descripción (en cualquier idioma, sin distinguir mayúsculas ni acentos); `Esc` lo vacía. A su lado, **Todas**, **Activadas** y **Desactivadas** muestran todas las funciones, solo las activadas o solo las desactivadas (desactiva **Filtro activadas/desactivadas** para ocultarlos). Cada fila tiene un interruptor y una breve descripción. El pequeño **?** junto al nombre de una fila abre la parte de este README que describe esa función, en el README del idioma de la interfaz de dsh. Los cambios se aplican de inmediato, sin reiniciar, y se recuerdan en ese dispositivo. Todo está activado de forma predeterminada, salvo **Conexión móvil**, **Reanudar tras reiniciar** y **Completar al escribir**. El Host de dsh guarda los interruptores de estas tres funciones y los de **Búsqueda en el contenido**, **Revertir turno**, **Predicción del siguiente mensaje** y **Comprobación del objetivo**, así que se aplican a todas las ventanas y se mantienen tras un reinicio. El Host también guarda el **Modelo** elegido para **Predicción del siguiente mensaje**, el de **Completar al escribir** (por defecto **Igual que la predicción del siguiente mensaje**), el de **Mejorar prompt**, el de **Comprobación del objetivo** (ambos por defecto **Igual que el modelo del chat**) y el **Límite de tiempo** de **Permitir en este chat** (1 hora por defecto). **Búsqueda en el contenido** solo cambia después de reiniciar dsh (dsh la lee al iniciar); hasta entonces, su fila dice **Reinicia dsh para aplicar este cambio.**
|
|
116
122
|
|
|
117
123
|
<p align="center"><img src="docs/images/settings.webp" width="720" alt="Configuración → Composer Plus: búsqueda de funciones, selector de idioma, fila de actualizaciones y un interruptor por función, con una vista previa de la captura al pasar el puntero"></p>
|
|
118
124
|
|
|
@@ -172,6 +178,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
172
178
|
- **Búsqueda en el contenido:** ningún código nuevo busca en tus chats: el plugin solo activa el índice de mensajes propio de dsh (SQLite FTS5, `dsh-session-query-sqlite`) y le da un archivo, `$DSH_HOME/cache/composer-plus/session-search.db` (archivo y carpeta solo para el propietario). El archivo contiene el texto de tus mensajes y de los del asistente, así que es tan privado como los registros de chat de `$DSH_HOME/sessions`. Nada sale de tu equipo. Es una copia que dsh puede volver a crear: puedes eliminarla mientras dsh está cerrado. El interruptor está en `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
|
|
173
179
|
- **Revertir turno:** antes de cada uno de tus mensajes, el Host toma una instantánea git de la carpeta del chat en su propio almacén, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (carpeta solo para el propietario). Contiene copias de los archivos de esa carpeta que git ve (no de los archivos ignorados), así que es tan privado como el proyecto. Lee los objetos de tu repositorio (no copia lo que git ya tiene) y nunca escribe en el índice, el `HEAD`, las ramas, las etiquetas, el stash ni la configuración de tu repositorio; el único cambio que git hace allí es una marca de tiempo más reciente en los archivos de objetos que reutiliza (esto retrasa su limpieza con `git gc`). Una reversión con archivos solo escribe archivos normales dentro de la carpeta del chat; omite los enlaces simbólicos, las tuberías y todo lo que esté fuera de la carpeta. Nada sale de tu equipo. Puedes eliminar el almacén mientras dsh está cerrado (entonces la reversión solo funciona para el chat, hasta que haya mensajes nuevos). **Eliminar chat** también elimina el almacén de ese chat. El interruptor está en `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Una reversión con archivos también guarda los archivos tal como estaban justo antes de ella (`refs/r/…` en el mismo almacén), para **Rehacer**; las reversiones rehechas se listan en `$DSH_HOME/storages/dsh-composer-plus/redone.json` (solo para el propietario).
|
|
174
180
|
- **Abrir issue en GitHub** (Ideas de funciones → lista **Después**): solo se ejecuta cuando haces clic. La parte Host ejecuta tu propio GitHub CLI (`gh issue create`) en la carpeta del chat, con el título y el resumen guardados de la idea (y por qué importa); `gh` usa su propio inicio de sesión y el remoto de GitHub de la carpeta, así que la issue va a ese repositorio con tu cuenta, y GitHub la muestra a todos los que pueden ver ese repositorio. dsh quita de los comandos que inicia las variables con nombre de token; si le diste a `gh` un token mediante `GH_TOKEN` o `GITHUB_TOKEN`, el plugin solo le pasa esas variables a `gh`. El enlace de la issue se guarda con la idea en `later.json`.
|
|
181
|
+
- **Informar de un problema** (Configuración → Composer Plus → **Informar de un problema…**, o menú **…** de un chat → **Informar de un problema de Composer Plus…**): no se ejecuta nada hasta que haces clic. **Escribir borrador** envía solo el tipo y el texto que escribiste (no el chat ni el proyecto) al modelo predeterminado de dsh, en una sola llamada. El Host añade una línea con las versiones de Composer Plus, de dsh y del sistema operativo, y sustituye la ruta de tu carpeta de inicio por `~`. **Abrir issue** ejecuta tu propio GitHub CLI (`gh issue create --repo furkancak1r/dsh-composer-plus`) con tu sesión de `gh`, así que la issue es pública y muestra tu cuenta de GitHub. Se rechaza el texto que parece una clave, un token o una contraseña, y ese texto no sale de tu Mac.
|
|
175
182
|
- **Chats que cambiaron este archivo** (Cambios, menú «…» de un archivo): la parte Host lee los registros de los chats cuya carpeta está en el mismo repositorio, tal como los guarda dsh, y devuelve el título de cada chat, la hora y la primera línea de la petición; nunca abre el archivo en sí.
|
|
176
183
|
- **Rama de Git en las filas de chat:** la parte Host ejecuta `git branch --show-current` (solo lectura) en la carpeta del chat cuando un turno empieza y cuando termina, y solo guarda el id del chat, el nombre de la rama y la hora en `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` (archivo solo para el propietario, los 2000 chats más recientes). El interruptor está en `branches.json`, junto a él.
|
|
177
184
|
- **Buscar en el chat** solo se ejecuta en la página: lee el texto que muestra la página y no envía nada.
|
|
@@ -180,9 +187,10 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
180
187
|
- **Permitir en este chat:** los permisos concedidos se guardan, con la hora en que se concedieron, en `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (archivo con permisos solo para el propietario). Un permiso cubre una herramienta exacta en un chat, hasta que termina el límite de tiempo (1 hora por defecto). Si esa herramienta puede escribir, el permiso también cubre cualquier escritura. Revócalo desde el chip de la cabecera.
|
|
181
188
|
- La revisión automática sigue ejecutándose en cada llamada; los fallos de la revisión nunca se permiten automáticamente.
|
|
182
189
|
- **Conexión móvil:** desactivada hasta que la actives. Mientras está activada, la parte Host ejecuta la pasarela de Tether: HTTPS en el puerto 19390, que solo acepta tu subred Wi-Fi y tu tailnet (100.64.0.0/10), y una página de emparejamiento en `127.0.0.1:19391` (solo este Mac). Un teléfono necesita un código de un solo uso del código QR (válido 5 minutos) y que hagas clic en **Approve** en el Mac. El teléfono fija el certificado de la pasarela. El Mac solo guarda un hash del token de cada teléfono (30 días, se renueva mientras se usa); **Remove** cierra de inmediato las conexiones de ese teléfono. Los teléfonos solo pueden llamar a una lista permitida de métodos de dsh (chats, prompts, adjuntos, comandos de barra, aprobaciones, preguntas, modelos, agentes, objetivos), no a la configuración, las credenciales, el explorador de archivos ni la terminal. «Tailscale only» rechaza todas las conexiones desde la red local, también las que ya están abiertas. El registro de accesos guarda los 200 intentos de conexión más recientes (hora, dirección IP, nombre del dispositivo, permitido o rechazado, y el motivo) en `access.json`; nunca guarda un token ni un código de emparejamiento. Datos: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (archivos solo para el propietario). Detalles: [tether/README.md](tether/README.md).
|
|
183
|
-
- **Equipos remotos:** la función está desactivada hasta que la actives, en cada Mac. **Permitir que otros equipos abran este Mac** abre un segundo puerto HTTPS (19392) solo en la dirección de Tailscale de este Mac (no en la red Wi-Fi, y sin anunciarlo con Bonjour). Otro Mac necesita un enlace de emparejamiento de un solo uso (válido 5 minutos), el certificado correspondiente (fijado) y que hagas clic en **Aprobar**. Este Mac solo guarda un hash de su token. Un equipo emparejado obtiene el control total de dsh en este Mac, como si lo usaras aquí: sus chats, modelos, herramientas, archivos y terminal. Quítalo en el panel de Configuración y sus conexiones se cierran al instante. El Mac que abre otro guarda el token de ese equipo en `$DSH_HOME/storages/dsh-composer-plus/computers.json` (solo para el propietario). Abre un relé en `127.0.0.1` para cada equipo que eliges. La página recibe un enlace de un solo uso (válido 60 segundos), y el relé solo acepta su propia página (su dirección, ningún otro sitio).
|
|
190
|
+
- **Equipos remotos:** la función está desactivada hasta que la actives, en cada Mac. **Permitir que otros equipos abran este Mac** abre un segundo puerto HTTPS (19392) solo en la dirección de Tailscale de este Mac (no en la red Wi-Fi, y sin anunciarlo con Bonjour). Otro Mac necesita un enlace de emparejamiento de un solo uso (válido 5 minutos), el certificado correspondiente (fijado) y que hagas clic en **Aprobar**. Este Mac solo guarda un hash de su token. Un equipo emparejado obtiene el control total de dsh en este Mac, como si lo usaras aquí: sus chats, modelos, herramientas, archivos y terminal. Quítalo en el panel de Configuración y sus conexiones se cierran al instante. El Mac que abre otro guarda el token de ese equipo en `$DSH_HOME/storages/dsh-composer-plus/computers.json` (solo para el propietario). Abre un relé en `127.0.0.1` para cada equipo que eliges. La página recibe un enlace de un solo uso (válido 60 segundos), y el relé solo acepta su propia página (su dirección, ningún otro sitio). La página del otro Mac en esta ventana puede leer los nombres y los estados de los equipos de este Mac (sin direcciones ni tokens) y puede cambiar esta ventana de uno a otro. No puede añadir, renombrar ni quitar un equipo, ni cambiar la configuración de este Mac.
|
|
184
191
|
- **Actualizaciones:** la parte Host pide a `api.github.com` la última versión publicada y a `registry.npmjs.org` esa versión exacta; no se envía nada sobre ti ni sobre tus chats. La instalación usa el gestor de plugins de dsh (`pnpm add dsh-composer-plus@<version>`; cuando dsh 0.2.1 lo rechaza para un plugin ya instalado, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, y después el perfil indica esa URL como origen del plugin), así que se aplican las comprobaciones propias de dsh del registro, de los scripts y de la compatibilidad de versiones. Nunca se instalan etiquetas de prerelease ni versiones anteriores.
|
|
185
|
-
- **
|
|
192
|
+
- **Paquete de skill en turco:** activado por defecto, y solo funciona mientras el idioma de la app es Türkçe: el navegador le dice a la parte Host el idioma de la interfaz de dsh. Entonces, como mucho una vez al día, la parte Host pide a `api.github.com` el commit más reciente de `yucezerey/turkish-anti-ai-skill` y su lista de archivos, y descarga de `raw.githubusercontent.com` los archivos Markdown que cambiaron. GitHub ve tu dirección IP, como en cada comprobación de actualizaciones; no se envía nada sobre ti ni sobre tus chats. Solo se guardan los archivos `.md` normales de la carpeta `skills/turkish-anti-ai-skill/` (como mucho 20 archivos y 1 MB), y cada archivo debe coincidir con su id en la lista de archivos de GitHub. La copia está en `$DSH_HOME/cache/composer-plus/turkish-skill/<commit>` (solo para el propietario) y entra en la lista de skills de dsh; ningún script del paquete se ejecuta. El interruptor y el último idioma informado están en `$DSH_HOME/storages/dsh-composer-plus/turkish-skill.json`. Al desactivarlo se quita el skill y se borra la copia.
|
|
193
|
+
- **Recuento de uso:** la parte Host pide a GitHub dos pequeños archivos de la versión publicada que tienes instalada (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/<file>`): `active.txt` una vez al día e `installed.txt` solo una vez por cada directorio home de dsh. GitHub cuenta estas peticiones por archivo, así que el autor solo ve cuántas copias de cada versión pidieron `active.txt` ese día y cuántas copias pidieron `installed.txt` en total (el número de copias). La petición no lleva ningún id, cookie ni dato sobre ti o tus chats; GitHub ve tu dirección IP, igual que en cada comprobación de actualizaciones. El día de la última petición de `active.txt` se guarda en `$DSH_HOME/storages/dsh-composer-plus/active.json`, y la marca de que `installed.txt` ya se contó, en `$DSH_HOME/storages/dsh-composer-plus/installed.json`. Una copia git de este repositorio y una copia renombrada no envían nada. No hay ningún interruptor para esto.
|
|
186
194
|
- **Predicción del siguiente mensaje:** activada de forma predeterminada; desactívala en **Configuración → Composer Plus** para detener estas llamadas al modelo. Después de cada turno terminado, la parte Host envía 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 6.000 caracteres (la parte más reciente), al modelo elegido (el predeterminado de dsh, salvo que elijas otro). Va con los ajustes de proveedor propios de dsh, en una sola petición. No se guarda nada en el chat: la predicción no se añade al historial del chat. El interruptor y el modelo elegido están en `$DSH_HOME/storages/dsh-composer-plus/predict.json` (archivo solo para el propietario).
|
|
187
195
|
- **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).
|
|
188
196
|
- **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).
|
|
@@ -212,10 +220,11 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
212
220
|
- **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).
|
|
213
221
|
- **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.
|
|
214
222
|
- **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.
|
|
223
|
+
- **Informar de un problema 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`. O haz clic en **Abrir en GitHub en su lugar**: se abre la propia página de nueva issue de GitHub con el borrador ya rellenado, y la envías allí.
|
|
215
224
|
- **No hay etiqueta de rama en una fila de chat:** la barra lateral no está en «En una sola lista» (en «Espacio de trabajo» y «Árbol de espacios de trabajo», ninguna fila de chat muestra una etiqueta), 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).
|
|
216
225
|
- **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.
|
|
217
226
|
- **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).
|
|
218
|
-
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.
|
|
227
|
+
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.23.0`); consulta la nota de instalación de más arriba.
|
|
219
228
|
- **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.
|
|
220
229
|
- **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.
|
|
221
230
|
- **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.
|
|
@@ -237,9 +246,11 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
237
246
|
- 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.
|
|
238
247
|
- **Novedades de Composer Plus N** muestra las notas en el idioma de **Idioma de la aplicación**. Un idioma de interfaz con otra región recibe las notas de su idioma base (`en-GB` recibe las notas en inglés y `zh-TW`, las notas en chino de `zh`). Un idioma sin notas (uno que añade otro paquete de idioma, o `pt-PT`, que no es `pt-BR`) muestra las notas en inglés. Las notas llegan con la nueva versión. Si la copia en ejecución no tiene un archivo de notas legible (`release-notes.json`), la ventana muestra las notas en inglés de GitHub.
|
|
239
248
|
- Una versión que se instala mientras dsh se ejecuta (una actualización desde Configuración → Plugins o una carpeta copiada) se carga solo tras reiniciar dsh: hasta entonces, **Actualizaciones de Composer Plus** muestra la versión en ejecución y pide reiniciar. Su ventana **Novedades de Composer Plus N** aparece una vez en el primer inicio de esa versión. El primer inicio después de instalar este plugin no muestra ninguna ventana; **Novedades de esta versión** abre las notas de la versión en ejecución.
|
|
249
|
+
- La línea de la estrella de GitHub bajo las notas no puede saber si ya diste una estrella al repositorio: el plugin no hace ninguna llamada de red para eso. Cada navegador (y la app de escritorio) guarda su propio registro, así que la línea puede aparecer una vez más en otro.
|
|
240
250
|
- **Rechazar con nota** envía la nota como un mensaje dentro del turno que espera y después rechaza la solicitud; dsh muestra la nota en el chat como un mensaje tuyo. Mientras el campo de la nota está abierto, la tarjeta muestra solo **Cancelar** y **Rechazar**, así que un clic no puede permitir la solicitud por error; `Esc` o **Cancelar** devuelve los botones de dsh. Una nota vacía no envía nada (usa el propio **Rechazar** de dsh). Si el rechazo falla después de enviar la nota (por ejemplo, porque mientras tanto la solicitud se respondió en otro lugar), la nota se queda en el chat y el modelo la lee en su siguiente paso. El botón va en el marcado de la tarjeta de aprobación de dsh (`data-approval-key`), porque dsh no tiene un espacio para acciones de la tarjeta; si una actualización de dsh cambia ese marcado, el botón no aparece y el propio **Rechazar** de dsh funciona como antes. Una nota puede tener como máximo 4.000 caracteres.
|
|
241
251
|
- **Entrada secreta** oculta solo el texto exacto de un valor: `[secret]` lo reemplaza en los resultados de herramienta posteriores del mismo chat. El agente aún puede leer el archivo con un comando de shell e imprimir el valor de otra forma (base64, una parte, con espacios), y esa forma llega al modelo. Las herramientas de archivos del propio agente (read, grep, write, edit) no pueden abrir la carpeta de secretos. Si el valor también es una palabra común, otros resultados de ese chat también muestran `[secret]`. El archivo se mantiene hasta que termina el turno; si dsh se cierra durante el turno, el siguiente inicio lo borra. Un chat puede tener una sola solicitud abierta a la vez. La herramienta añade unos 870 caracteres (unos 220 tokens, estimado) a cada solicitud al modelo: desactívala si no la usas.
|
|
242
252
|
- **Citar en la respuesta** cita el texto tal como lo muestra la página: un bloque de código, una tabla o una lista llegan como líneas simples, sin sus marcas de Markdown. Una selección que empieza en una respuesta y termina en otra, o que toca el razonamiento, una fila de herramienta o tu propio mensaje, no muestra el botón: selecciona dentro de una sola respuesta. El botón encuentra la respuesta por la estructura del chat de dsh, porque dsh no tiene un slot para la selección de texto; si una actualización de dsh cambia esa estructura, el botón no aparece. Cuando la cita queda al final del campo, se añade una línea vacía más para que la siguiente línea que escribas empiece debajo; dsh quita las líneas vacías del final al enviar.
|
|
253
|
+
- **Citar desde la vista previa del archivo** lee la propia vista previa de archivos de dsh: los números de línea vienen de sus filas, así que son correctos para archivos de código y de texto. Un archivo Markdown se muestra como una página con formato, así que su cita tiene el texto sin sus marcas de Markdown y sin números de línea; la cita de un PDF tiene la página, no una línea. Una selección en el encabezado de la ruta, en otro visor (una hoja de cálculo, un archivo de Office, una imagen) o sobre dos archivos abiertos no muestra el botón, y tampoco lo muestra la barra lateral derecha en pantalla completa (entonces el campo de texto no está en pantalla). El botón encuentra la vista previa por la estructura de la página de dsh, porque dsh no tiene un slot para una selección ahí; si una actualización de dsh cambia esa estructura, el botón no aparece. Solo el texto seleccionado va al campo de texto: si el archivo cambia después, la cita no cambia.
|
|
243
254
|
- **Chat lateral** es de solo lectura gracias al modo de solo lectura de dsh: las herramientas de archivos no pueden escribir y los comandos de shell se ejecutan en el sandbox de dsh sin escritura (o no se ejecutan cuando el sandbox no puede iniciar). El agente aún puede pedir más acceso con la tarjeta de aprobación de dsh, y una llamada de red (por ejemplo, una solicitud a una API) aún puede cambiar algo fuera del equipo. La copia se hace en el momento más reciente en que no esperaba ningún mensaje en la cola, así que una pregunta hecha mientras esperan mensajes en la cola no ve lo que pasó después de ellos. Un paso del chat en curso se cierra en la copia, así que el chat lateral conoce el inicio de ese paso pero no su resultado. El chat lateral es un chat normal: queda en la barra lateral y cuenta para tu uso del modelo; archívalo allí. Traer de vuelta toma solo los mensajes propios del chat lateral (máximo 12.000 caracteres) y solo la última respuesta de cada pregunta; las notas del agente entre sus llamadas a herramientas quedan fuera. dsh no ofrece a los plugins un espacio para un chat dentro de la barra lateral derecha, así que el chat lateral se abre en la vista principal.
|
|
244
255
|
- **Notas del diff** funciona solo en el panel de cambios, no en la vista Último turno de dsh. Un rango debe quedar en un solo bloque del diff (una parte `@@`). Las notas se guardan en el almacenamiento de este navegador, así que otro navegador o dsh en otro equipo no las ve; Tether guarda sus propias notas en memoria. Una nota guarda las líneas como estaban al hacer clic: si el agente cambia el archivo después, la nota sigue mostrando las líneas y los números anteriores. Como máximo 50 notas por chat, 2.000 caracteres por nota y 40 líneas por nota (luego una línea `…`).
|
|
245
256
|
- **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.
|
|
@@ -247,7 +258,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
247
258
|
- **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.
|
|
248
259
|
- **Ajustar la cabecera del chat a la ventana** encuentra la cabecera del chat de dsh por sus nombres de clase generados (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), porque dsh no ofrece un punto de enganche para su diseño. Si una actualización de dsh los cambia, la cabecera se muestra como la dibuja dsh. En una columna de chat muy estrecha la cabecera puede ocupar dos o tres líneas, así que queda menos espacio sobre los mensajes.
|
|
249
260
|
- **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). Con una clave APNs en `apns.json` (consulta `tether/README.md`), el Mac envía las notificaciones mediante el servicio push de Apple, así que llegan también con Tether cerrada; el Mac debe estar activo y con dsh abierto. Sin la clave, el teléfono solo las recibe mientras Tether está abierta o acaba de pasar a segundo plano. Tether solo las envía después de que actives «Settings → Notifications → Send notifications» en Tether. Tether guarda esta opción y su horario por separado para cada Mac emparejado. Está desactivada de forma predeterminada en cada Mac, 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. Cada notificación muestra el Mac y el proyecto del chat (`Studio Mac · recipe-box`), el título del chat y el texto: Turn finished muestra la última respuesta del agente. Con la clave de APNs, este texto pasa por el servicio push de Apple. 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í.
|
|
250
|
-
- **Equipos remotos** necesita Tailscale en los dos Mac, y Composer Plus con esta función activada en el Mac que abres. Ese Mac no debe estar en reposo, y dsh debe estar en ejecución en él. El
|
|
261
|
+
- **Equipos remotos** necesita Tailscale en los dos Mac, y Composer Plus con esta función activada en el Mac que abres. Ese Mac no debe estar en reposo, y dsh debe estar en ejecución en él. El selector solo aparece cuando la barra lateral izquierda está abierta (no cuando solo muestra iconos). La página del otro Mac solo muestra el selector cuando ese Mac tiene esta versión de Composer Plus o una más reciente. Con una versión más antigua, aparece un botón **Volver a este Mac** arriba después de unos segundos. Cada equipo que abriste guarda su página en memoria hasta que desactives la función o reinicies dsh. En la app de escritorio, la página del otro Mac es una página incrustada: los atajos de teclado propios de dsh (por ejemplo, un nuevo chat) no funcionan en ella, y tampoco funcionan allí las descargas de archivos, el micrófono ni las notificaciones. Usa el puerto 19392 (solo un dsh por Mac puede dejar entrar a otros equipos). Desde la página de otro Mac, el selector solo cambia entre los equipos de este Mac: no puedes abrir un tercer Mac a través del otro Mac.
|
|
251
262
|
- 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.
|
|
252
263
|
- **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.
|
|
253
264
|
- **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).
|
|
@@ -255,6 +266,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
255
266
|
- 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.
|
|
256
267
|
- **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.
|
|
257
268
|
- **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`).
|
|
269
|
+
- **Informar de un problema** abre issues solo en el repositorio de Composer Plus (`furkancak1r/dsh-composer-plus`), no en tu proyecto (para eso, usa **Abrir issue en GitHub** en la lista **Después** de Ideas de funciones). Necesita un modelo predeterminado en dsh para el borrador, y GitHub CLI (`gh`) con una sesión iniciada para abrir la issue. El borrador siempre está en inglés. El modelo puede equivocarse en un detalle: lee el borrador antes de hacer clic en **Abrir issue**. La apertura se ejecuta como máximo 60 s; el mismo título y el mismo texto otra vez en menos de una hora muestran la issue anterior en lugar de una copia. **Abrir en GitHub en su lugar** recorta una descripción muy larga para que el enlace sea corto.
|
|
258
270
|
- **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.
|
|
259
271
|
- **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. La etiqueta solo aparece en «En una sola lista».
|
|
260
272
|
- **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.
|
|
@@ -279,6 +291,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
279
291
|
- **Continuar en un chat nuevo** envía el chat (mensajes, llamadas a herramientas y el final de cada resultado de herramienta, como máximo unos 60.000 caracteres, la parte más reciente) al modelo del propio chat. La nota de traspaso puede omitir una decisión o un archivo: léela antes de empezar. El chat nuevo solo conoce la nota y el chat enlazado (dsh adjunta el chat anterior como contexto de solo lectura); su contexto del modelo empieza pequeño y el chat anterior se queda como está. Solo una nota o un inicio por chat a la vez.
|
|
280
292
|
- **Desglose del contexto** muestra estimaciones con la regla propia de dsh (unos 4 caracteres por token), la misma regla que usa el anillo de contexto de dsh; el recuento propio del modelo puede ser distinto. Las definiciones de herramientas son las de la petición más reciente. Muestra el contexto tal como lo tiene el registro del chat; un turno que se está ejecutando aparece después de su siguiente paso.
|
|
281
293
|
- **Pasos planificados** ahorra tokens solo cuando el modelo planifica: mientras está activada, cada solicitud lleva la herramienta `plan_next_steps` y una instrucción breve (unos 500 tokens), también en los chats donde el modelo nunca planifica. Una condición prueba solo lo que dice (por ejemplo: el código de salida de la compilación fue 0), no que el trabajo sea correcto. `ok` lee las marcas de resultado propias de dsh (`[exit code: N]`, tiempos de espera, rechazos del sandbox); un comando que falla sin un código de salida distinto de cero pasa. Los pasos se ejecutan de uno en uno; dos pasos listos a la vez vuelven al modelo. El mensaje del paso se guarda como un mensaje del asistente del modelo del chat (dsh no tiene una marca para un mensaje escrito por un plugin), por eso su texto dice que Composer Plus lo ejecutó. No está en Tether.
|
|
294
|
+
- **Paquete de skill en turco** instala un skill de terceros: sus reglas vienen del repositorio de GitHub de su autor, no de Composer Plus, y una versión nueva se usa desde la siguiente comprobación diaria sin que la revisemos. La comprobación demuestra que los archivos son los que GitHub lista para ese commit, no que las reglas sean buenas. El modelo decide cuándo cargar el skill (también puedes llamarlo por su nombre); las reglas solo se aplican a textos en turco. La parte Host usa el idioma que un navegador informó por última vez: si dos navegadores usan idiomas distintos, gana el más reciente. GitHub permite 60 llamadas a la API por hora sin iniciar sesión; una comprobación rechazada conserva la copia instalada y muestra el motivo en la configuración.
|
|
295
|
+
- **Desenredar el código** incluye una copia fija de la skill (caldoai/skills, commit f3cf477): un cambio en el original solo llega con una nueva versión de Composer Plus. La skill ejecuta un objetivo largo que puede cambiar muchos archivos, y sus subagentes y comprobaciones gastan muchos tokens. Donde el proyecto no tiene pruebas, puede cambiar el comportamiento sin avisar: iníciala en una rama y lee el diff antes de fusionar. Una skill con el mismo nombre en el proyecto, en una carpeta de skills personalizada o en `~/.dsh/skills` la sustituye. Mientras el interruptor está apagado, `/untangle-codebase` llega al modelo como texto normal.
|
|
282
296
|
- **Tablero de tareas** muestra los chats que dsh lista en esta ventana: un chat fuera de un proyecto solo aparece en **Todos los proyectos**, y una carpeta de «Una rama por chat» (`<project>/.worktrees/<name>`) cuenta como su proyecto. La columna de una tarjeta es el estado en vivo del chat, así que las tarjetas no se pueden arrastrar: un chat pasa a **Hecho** cuando termina su turno, también después de un error o una detención, y vuelve a **En curso** cuando se ejecuta de nuevo. El punto verde es el propio punto de terminado de dsh, que dsh solo guarda en esta ventana: después de recargar, los chats terminados aparecen sin él. **Hecho** muestra los 50 chats más recientes (**Mostrar N más antiguas** muestra el resto). **Buscar proyectos** encuentra un proyecto solo por su nombre, no por la ruta de su carpeta. **Activos en las últimas 2 horas** oculta un proyecto cuando todos sus chats tienen más de 2 horas, están inactivos y leídos; el tablero sigue mostrando el proyecto que elegiste. **Nueva tarea** solo recuerda el chat nuevo más reciente de esta ventana: cuando abres otro chat antes del primer mensaje, ese chat se queda en la parte superior de **En curso** como **Nueva tarea** hasta que escribas en él, pero el tablero vuelve por sí solo únicamente para el más reciente. Después de recargar, un chat nuevo sin mensajes no está en el tablero (dsh lo guarda como su Nueva sesión vacía). Las etiquetas vienen de una llamada al modelo por cada tarea, a partir de su primer mensaje: pueden ser incorrectas, y un chat que no iniciaste en el tablero no tiene ninguna. El título es el propio título del chat en dsh (el servicio de títulos de dsh, con el modelo del chat); hasta que llega, la tarjeta muestra la primera línea del primer mensaje. **×** y **Limpiar todo** solo quitan tarjetas del tablero: no se borra ningún chat. **Deshacer** solo aparece durante 8 segundos, en esta ventana; después, **Quitadas (N)** → **Volver a poner** devuelve una tarjeta, y un chat que vuelve a ejecutarse regresa por sí solo. **Limpiar todo** pregunta primero y quita las tarjetas terminadas y leídas del proyecto que se muestra (de todos los proyectos con **Todos los proyectos**), también las que están detrás de **Mostrar N más antiguas**; una tarjeta sin leer (verde) se queda. dsh guarda su punto verde solo en esta ventana, así que después de recargar, Limpiar todo puede quitar una tarjeta cuya respuesta no leíste. La lista se guarda en este Mac para todas las ventanas y para Tether; cuando llega a 5.000 chats, los más antiguos vuelven. **Responder** solo responde la solicitud más reciente del chat: cuando el chat la respondió en otro lugar (otra ventana, Tether, la revisión automática) o pregunta algo nuevo, el panel lo indica y no envía nada. Las versiones anteriores tenían una lista de tareas con comentarios y herramientas para agentes; ya no existen, y el antiguo `board.json` no se muestra. La idea y el aspecto vienen de [Kanzo](https://github.com/emanuele-em/kanzo), de emanuele-em (AGPL-3.0); Composer Plus no usa su código. `Cmd+Shift+K` es un atajo de dsh: en un navegador en Linux no tiene tecla predeterminada (asígnala en la página de atajos de teclado de dsh), y una extensión del navegador u otra aplicación puede tomarla antes. Una tarjeta sale de **Hecho** cuando desaparece el punto verde de dsh (abriste el chat) o, para un chat que terminó detrás del tablero mientras era el chat abierto, cuando ese chat se muestra sin un panel encima. Este estado de leído vive solo en esta ventana de dsh, como los puntos de dsh: tras recargar o en otra ventana, cada chat terminado cuenta como leído, así que está en **Terminados hace poco**.
|
|
283
297
|
- **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.
|
|
284
298
|
- **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; revísalas en **Abrir memoria** y cámbialas allí, o edita los archivos a mano con dsh cerrado. **Abrir memoria** envía las notas del proyecto seleccionado y las notas globales (todos los proyectos si seleccionas Todas las notas; como mucho unos 60.000 caracteres, el resto solo se cuenta y no puede cambiar en esa solicitud) y tu texto al modelo predeterminado de dsh, no al modelo del chat. Una vista previa se guarda en el Mac 30 minutos y hasta que dsh se reinicia; si una revisión o el agente cambian las notas mientras tanto, **Aplicar** se niega y vuelves a pedir la vista previa. **Aplicar** guarda todos los cambios de una vista previa o ninguno: si un cambio no se puede guardar (por ejemplo, MEMORY.md está lleno), las notas quedan como estaban y se muestra el motivo. 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.
|
|
@@ -293,6 +307,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
293
307
|
- **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.
|
|
294
308
|
- **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.
|
|
295
309
|
- **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.
|
|
310
|
+
- **Recordar el tamaño de la ventana** funciona solo en la app de escritorio. En cada inicio, dsh muestra primero su ventana a 1280 × 820; la ventana pasa al tamaño guardado cuando el plugin se carga. Una página no tiene un evento para el movimiento de la ventana, así que el plugin lee la ventana una vez por segundo: un cambio en los últimos 2 segundos antes de cerrar dsh no se guarda. El tamaño se guarda por computadora, en el almacenamiento propio de la app.
|
|
311
|
+
- **Recuento de uso:** cuenta copias, no personas: cada directorio home de dsh es una copia. El recuento de copias únicas (`installed.txt`) solo incluye las copias que se actualizan a la primera versión con este archivo o a una posterior; una copia que se queda en una versión anterior no se cuenta. Una copia cuya carpeta `storages` se borra se cuenta otra vez. GitHub puede contar como una sola las peticiones que llegan desde la misma dirección IP (por ejemplo, varios equipos detrás de un mismo router NAT) en unos 10 minutos.
|
|
296
312
|
- 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).
|
|
297
313
|
|
|
298
314
|
## Preguntas frecuentes
|
|
@@ -363,6 +379,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
363
379
|
|
|
364
380
|
**¿Cómo respondo solo a una parte de una respuesta larga?** Selecciona esa parte y haz clic en **Citar** sobre la selección (**Citar en la respuesta**, activada de forma predeterminada). La parte va al campo de texto como cita `> …` y escribes tu respuesta debajo.
|
|
365
381
|
|
|
382
|
+
**¿Cómo le muestro al agente las líneas exactas de un archivo?** Abre el archivo en la barra lateral derecha (**Archivos del espacio de trabajo**), selecciona las líneas y haz clic en **Citar** sobre la selección (**Citar desde la vista previa del archivo**, activada de forma predeterminada). El campo de texto recibe la ruta y los números de línea (por ejemplo `src/login.js:2-3`) y las líneas como bloque de código; escribe tu pregunta debajo.
|
|
383
|
+
|
|
366
384
|
**¿Puedo preguntar algo mientras el agente trabaja, sin detenerlo?** Escribe la pregunta y haz clic en **Preguntar en un chat lateral** en el campo de texto (**Chat lateral**, activado de forma predeterminada). Una copia de solo lectura del chat la responde mientras el chat sigue. En el chat lateral, **Traer de vuelta** pone la respuesta en el campo de texto del chat.
|
|
367
385
|
|
|
368
386
|
**¿Cómo le digo al agente qué cambiar en su diff?** En **Panel de cambios**, abre el diff del archivo, haz clic en **+** en una línea y escribe una nota (**Notas del diff**, activado de forma predeterminada). Luego haz clic en **Enviar al campo de texto**: las notas van al campo de texto con el archivo, los números de línea y las líneas.
|
|
@@ -371,7 +389,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
371
389
|
|
|
372
390
|
**Perdí mi iPhone. ¿Cómo evito que llegue a mi Mac?** Haz clic en **Conexión móvil**, abajo a la izquierda de la barra lateral, y haz clic en **Remove** junto a ese iPhone. Su clave deja de funcionar al instante; solo puede volver con un nuevo emparejamiento que apruebes en el Mac.
|
|
373
391
|
|
|
374
|
-
**¿Cómo continúo un chat de mi otro Mac desde este?** En el otro Mac, activa **Configuración → Composer Plus → Equipos remotos** y **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace (envíatelo, por ejemplo con AirDrop o Notas). En este Mac, activa también **Equipos remotos**, elige **Añadir un equipo…**
|
|
392
|
+
**¿Cómo continúo un chat de mi otro Mac desde este?** En el otro Mac, activa **Configuración → Composer Plus → Equipos remotos** y **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace (envíatelo, por ejemplo con AirDrop o Notas). En este Mac, activa también **Equipos remotos**, elige **Añadir un equipo…** en el selector de la barra lateral izquierda (a la derecha del nombre de la marca, encima de **Nueva sesión**), pega el enlace, escribe un **Nombre** y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, elige ese equipo en el mismo menú: ocupa esta ventana. Elige **Este Mac** en el mismo lugar para volver. Mientras tanto, los chats de este Mac siguen funcionando.
|
|
375
393
|
|
|
376
394
|
**¿Puedo bloquear Tether con Face ID?** Sí: en Tether, activa «Settings → Privacy → Lock with Face ID». Después, Tether pide Face ID (o el código) al abrirse y cuando vuelves a la app.
|
|
377
395
|
|
|
@@ -403,6 +421,12 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
403
421
|
|
|
404
422
|
**¿Puede dsh ejecutar el siguiente comando sin volver a preguntar al modelo?** Sí, con **Pasos planificados** (desactivada de forma predeterminada): actívala en Configuración → Composer Plus. El modelo puede entonces planificar sus próximos comandos con una condición, por ejemplo «ejecuta las pruebas cuando la compilación pase», y Composer Plus ejecuta un paso sin una nueva llamada al modelo cuando el resultado cumple la condición. Las aprobaciones y el sandbox siguen igual.
|
|
405
423
|
|
|
424
|
+
**¿De dónde viene el skill en turco y puedo quitarlo?** De [yucezerey/turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) en GitHub (MIT). Composer Plus lo instala solo mientras **Idioma de la aplicación** es Türkçe, guarda solo sus archivos Markdown y no ejecuta ninguno de sus scripts. Para quitarlo, desactiva **Paquete de skill en turco** en Configuración → Composer Plus: el skill y la copia descargada se borran al momento.
|
|
425
|
+
|
|
426
|
+
**¿Cómo informo de un error o pido una función en Composer Plus?** Configuración → Composer Plus → **Informar de un problema…** (o menú **…** de un chat → **Informar de un problema de Composer Plus…**). Elige un tipo, descríbelo en tu propio idioma y haz clic en **Escribir borrador**. Revisa el borrador en inglés y luego haz clic en **Abrir issue**.
|
|
427
|
+
|
|
428
|
+
**¿Cómo puede el agente ordenar un código desordenado?** Escribe `/untangle-codebase` en un chat (**Desenredar el código**, activada de forma predeterminada), si quieres con un área, por ejemplo `/untangle-codebase src/api`. Primero el agente enumera las copias, los vínculos ocultos, los envoltorios innecesarios, el código muerto y los casos especiales; luego los corrige como un objetivo y vuelve a comprobar con subagentes. Iníciala en un chat de **Una rama por chat** para que el trabajo quede en su propia rama.
|
|
429
|
+
|
|
406
430
|
**¿Funciona con la app de escritorio?** Sí: Configuración → Plugins → **Añadir plugin** → `dsh-composer-plus`. Probado en dsh 0.2.0-rc.2 (escritorio y web) y 0.2.1-rc.2 (web).
|
|
407
431
|
|
|
408
432
|
## Desarrollo
|
|
@@ -422,6 +446,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/t
|
|
|
422
446
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
|
|
423
447
|
# Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
|
|
424
448
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
|
|
449
|
+
# Quote from file preview (fake model): lines of a code, text, Markdown and PDF file in the right sidebar → Quote → the path, the line numbers and the lines in the sent message; no button for the path header; switch off + its thumbnail
|
|
450
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-preview-quote.mjs /path/to/dsh/lib/bin.js
|
|
425
451
|
# every Settings feature row shows a loading screenshot and a ? link to its README row
|
|
426
452
|
PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
|
|
427
453
|
# What's new after an update: the release notes show once (also after an install through another path), Esc and Close close them; Settings → What’s new in this version opens them again
|
|
@@ -494,3 +520,5 @@ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/b
|
|
|
494
520
|
## License
|
|
495
521
|
|
|
496
522
|
MIT
|
|
523
|
+
|
|
524
|
+
`assets/skills/untangle-codebase/SKILL.md` es la skill `untangle-codebase` de [caldoai/skills](https://github.com/caldoai/skills), © 2026 Maze, con licencia MIT ([su licencia](assets/skills/untangle-codebase/LICENSE)).
|