dsh-composer-plus 1.24.1 → 1.25.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 CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; dieses Profil verwaltet die App.)
31
31
 
32
- > Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.24.1`.
32
+ > Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.25.0`.
33
33
 
34
34
  ## Funktionen
35
35
 
@@ -75,7 +75,11 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
75
75
  | **Geschützte Dateien** | <a id="feature-protectedfiles"></a>Standardmäßig an. Die eigenen Datei-Tools des Agenten können Dateien, die zu deinen Mustern passen, weder lesen noch ändern: `read`, `read_image` und `grep` auf eine Datei werden bei Mustern mit **Lesen und Schreiben** abgelehnt, `write`, `edit` und `str_replace_editor` bei beiden Arten. Der Agent liest den Grund und wird angewiesen, dich zu fragen. Die Standardmuster sind `.env*`, `*.pem` und `*.key`. Einstellungen → Composer Plus → **Geschützte Dateien**: Füge ein Muster hinzu (zum Beispiel `published/**` oder `config/*.yml`), klicke auf seine Art, um zwischen **Lesen und Schreiben** und **nur Schreiben** zu wechseln, entferne es mit ✕ oder klicke auf **Standardwerte verwenden**. Ein Muster ohne `/` passt auf einen Dateinamen in jedem Ordner. Das ist eine Leitplanke, keine Sandbox: Ein Shell-Befehl (`cat .env`), ein Skript oder ein MCP-Tool kann die Datei trotzdem erreichen (siehe Grenzen). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Screenshot: Geschützte Dateien"></a> |
76
76
  | **Blockierte Befehle** | <a id="feature-blockedcommands"></a>Standardmäßig an, mit einer leeren Liste. Die Shell-Befehle des Agenten (`bash`, `pwsh`) können keinen Befehl ausführen, der zu deinen Regeln passt: Eine Regel mit **blockieren** lehnt den Aufruf ab (der Agent liest den Grund und wird angewiesen, dich zu fragen), eine Regel mit **zuerst fragen** zeigt die Genehmigungskarte von dsh, und der Befehl läuft nur, wenn du ihn zulässt. Einstellungen → Composer Plus → **Blockierte Befehle**: Gib eine Regel ein (zum Beispiel `npm publish`, `git push --force` oder `ssh *192.168.2.19`), klicke auf die Art, um zwischen **blockieren** und **zuerst fragen** zu wechseln, dann auf **Hinzufügen**; klicke auf die Art einer Regel, um sie zu ändern, und entferne sie mit ✕. Eine Regel ist ein Befehlsname und Wörter, die in dieser Reihenfolge nach ihm kommen müssen; `*` passt auf beliebigen Text. Die Funktion findet den Befehl auch nach `&&`, `;`, `\|`, innerhalb von `$(…)`, `bash -c "…"` oder `eval` sowie nach `sudo` oder `env`. Das ist eine Leitplanke, keine Sandbox: Eine Variable (`$CMD`), eine Skriptdatei oder ein anderes Programm kann den Befehl trotzdem ausführen (siehe Grenzen). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Screenshot: Blockierte Befehle"></a> |
77
77
  | **Aufgabentafel** | <a id="feature-taskboard"></a>Linke Seitenleiste → **Aufgabentafel**, oder drücke überall in dsh `Cmd+Shift+K` (`Strg+Shift+K` unter Windows und Linux). Eine Kanban-Tafel deiner dsh-Chats mit dem Live-Zustand, den die Seitenleiste zeigt: Ein Chat, der auf deine Genehmigung, deine Antwort oder die Prüfung eines Plans wartet, steht mit einem orangen Punkt in **In Prüfung**, ein laufender Chat steht in **In Arbeit**, ein beendeter Chat, den du noch nicht geöffnet hast, steht in **Fertig** (grün). Wenn du einen Chat öffnest, verlässt seine Karte **Fertig** von selbst; klicke unter den grünen Karten auf **Kürzlich beendet (N)**, um die beendeten Chats zu sehen, die du gelesen hast (die 10 neuesten, dann **N ältere anzeigen**; offen oder zu bleibt auf diesem Gerät). Ein Chat, der fertig wird, während er hinter der Tafel offen ist (eine **Neue Aufgabe**), bleibt grün, bis du ihn öffnest. Klicke oben auf der Tafel auf den Projektnamen, um die Projektliste zu öffnen, und wähle ein Projekt oder **Alle Projekte**; der Ordner eines Branches pro Chat zählt zu seinem Projekt. Die Liste schließt sich nach der Auswahl, mit `Esc` oder mit einem Klick außerhalb. Tippe oben in der Liste in **Projekte durchsuchen**, um ein Projekt nach seinem Namen zu finden (Groß- und Kleinschreibung und Akzente spielen keine Rolle; `Esc` leert das Feld), drücke `Enter`, um den ersten Treffer zu wählen, und klicke auf **In den letzten 2 Stunden aktiv**, um nur Projekte mit einem Chat zu zeigen, der wartet, läuft, ungesehen fertig wurde oder sich in den letzten 2 Stunden geändert hat (bleibt auf diesem Gerät gespeichert). **Neue Aufgabe** (oder `n`) öffnet den eigenen neuen Chat von dsh in dem Projekt, das die Tafel zeigt (bei **Alle Projekte** das Projekt, das Neue Sitzung von dsh wählt), damit du wie in jedem Chat Dateien hinzufügen, Befehle nutzen und das Modell wählen kannst. Wenn deine erste Nachricht abgeht, kommt die Tafel von selbst zurück. Bis dahin wartet der Chat oben in **In Arbeit** als **Neue Aufgabe**: Klicke darauf, um die erste Nachricht zu schreiben. Ein Projekt mit einem Chat, der auf dich wartet, hat in der Projektliste einen orangen Punkt (der Projektname oben hat ihn auch, solange ein Chat wartet). dsh benennt den Chat, und das Modell des Chats schreibt aus dieser Nachricht bis zu 3 Schlagwörter. Klicke auf eine Karte, um ihren Chat zu öffnen. Klicke auf eine orange Karte (oder auf ihr **Antworten**), um direkt auf der Tafel zu antworten; das Feld hat **Chat öffnen** für den ganzen Chat: **Ablehnen** oder **Einmal zulassen**, **Genehmigen** oder **Änderungen anfordern** bei einem Plan, oder die Optionen und dein eigener Text bei einer Frage. Klicke auf einer beendeten Karte auf **×**, um sie von der Tafel zu nehmen, oder öffne **Kürzlich beendet** und klicke oben in **Fertig** auf **Alle entfernen**, um diese Karten von der Tafel zu nehmen: Zuerst zeigt ein Dialog, wie viele Karten welches Projekts gehen, und ungelesene (grüne) Karten bleiben. In den 8 Sekunden danach legt **Rückgängig** die Karten zurück; **Entfernt (N)** unter **Fertig** listet die Karten, die von der Tafel genommen sind, und **Zurücklegen** zeigt eine davon wieder in **Fertig**. Kein Chat wird gelöscht: Die Chats bleiben in der Seitenleiste von dsh, die Tafel merkt sich das auch nach einem Neustart (Tether zeigt dieselbe Tafel), und ein Chat, der wieder läuft, kommt zurück. Zeige auf eine Karte in **In Arbeit** (oder setze den Tastaturfokus darauf), um ihren Fortschritt zu sehen: wie lange der Chat läuft, den Schritt seiner To-do-Liste, das Tool, das gerade läuft, und die letzte Zeile des Agenten. Unter Einstellungen → Composer Plus → Aufgabentafel wählt **Fortschritt beim Darüberfahren** zwischen **Schnell (ohne KI)** (Standard: liest nur den Chat) und **KI-Zusammenfassung** (ein kurzer Aufruf an das Modell des Chats schreibt zusätzlich ein oder zwei Sätze). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Screenshot: Aufgabentafel"></a> |
78
- | **Assistent** | <a id="feature-assistant"></a>Standardmäßig an (ausschalten unter **Einstellungen → Composer Plus**). Klicke in der linken Seitenleiste auf **Assistent** (direkt unter **Aufgabentafel**): Es öffnet sich ein dauerhafter Chat, den du wie einen ChatGPT- oder Grok-Chat als persönlichen Assistenten nutzt. Der erste Klick legt den Ordner `~/Assistant` an, fügt ihn als Projekt "Assistant" hinzu und startet den Chat mit dem Berechtigungsmodus workspace-write und dem Standardmodell von dsh; jeder spätere Klick öffnet denselben Chat (ein archivierter kommt zurück, ein gelöschter wird neu angelegt). Bitte ihn um eine Erinnerung („erinnere mich in 2 Minuten daran, Wasser zu trinken“): Er nutzt die geplanten Aufgaben von dsh, daher führt die Erinnerung den Chat zu dieser Zeit aus, und Tether sendet seine Benachrichtigung "Turn finished", wenn Mobile Verbindung an ist. Bitte ihn, im Web zu suchen, oder frag ihn nach deinen anderen Chats: Er kann die Chats aller Projekte auflisten (läuft, wartet auf dich oder inaktiv) und die neuesten Nachrichten eines Chats lesen. Er kann auch einem Chat eine Nachricht senden, in einem Projekt einen neuen Chat starten, einen laufenden Chat stoppen oder einen Chat archivieren: Jede dieser vier Aktionen zeigt zuerst die Genehmigungskarte von dsh (auch in Tether), und nichts passiert, bevor du auf **Einmal zulassen** klickst. Er hat kein Tool zum Löschen. Nur dieser Chat hat diese Tools und seine kurzen Anweisungen; Text, den er auf einer Webseite oder in einem anderen Chat liest, gilt als Daten, nicht als Anweisung. Speichere dein Profil im Gedächtnis dieses Projekts (**Projektgedächtnis**, Thema "profil"), statt es ihm jedes Mal zu erzählen. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Screenshot: Assistent"></a> |
78
+ | **Assistent** | <a id="feature-assistant"></a>Standardmäßig an (ausschalten unter **Einstellungen → Composer Plus**). Klicke in der linken Seitenleiste auf **Assistent** (direkt unter **Aufgabentafel**): Es öffnet sich ein dauerhafter Chat, den du wie einen ChatGPT- oder Grok-Chat als persönlichen Assistenten nutzt. Der erste Klick legt den Ordner `~/Assistant` an, fügt ihn als Projekt "Assistant" hinzu und startet den Chat mit dem Berechtigungsmodus workspace-write und dem Standardmodell von dsh; jeder spätere Klick öffnet denselben Chat (ein archivierter kommt zurück, ein gelöschter wird neu angelegt). Solange der Chat noch keine Nachricht hat, zeigt eine kurze Karte über dem Eingabefeld, was der Assistent tut, mit drei Beispielanfragen; sie verschwindet mit deiner ersten Nachricht. Bitte ihn um eine Erinnerung („erinnere mich in 2 Minuten daran, Wasser zu trinken“): Er nutzt die geplanten Aufgaben von dsh, daher führt die Erinnerung den Chat zu dieser Zeit aus, und Tether sendet seine Benachrichtigung "Turn finished", wenn Mobile Verbindung an ist. Sprich mit ihm wie mit einem Freund, der im Hintergrund arbeitet: Eine längere Aufgabe (Recherche, mehrere Schritte) geht an einen eigenen Subagenten im Hintergrund, der Chat sagt in einer Zeile, was er gestartet hat, und ist sofort wieder frei. Öffne ein zweites Thema, während das erste noch läuft: Jedes Thema bekommt seinen eigenen Subagenten, und jedes Ergebnis kommt in diesen Chat zurück, sobald es fertig ist. Bitte ihn, im Web zu suchen, oder frag ihn nach deinen anderen Chats: Er kann die Chats aller Projekte auflisten (läuft, wartet auf dich oder inaktiv) und die neuesten Nachrichten eines Chats lesen. Er kann auch einem Chat eine Nachricht senden, in einem Projekt einen neuen Chat starten, einen laufenden Chat stoppen oder einen Chat archivieren: Jede dieser vier Aktionen zeigt zuerst die Genehmigungskarte von dsh (auch in Tether), und nichts passiert, bevor du auf **Einmal zulassen** klickst. Er hat kein Tool zum Löschen. Nur dieser Chat hat diese Tools und seine kurzen Anweisungen; Text, den er auf einer Webseite oder in einem anderen Chat liest, gilt als Daten, nicht als Anweisung. Speichere dein Profil im Gedächtnis dieses Projekts (**Projektgedächtnis**, Thema "profil"), statt es ihm jedes Mal zu erzählen. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Screenshot: Assistent"></a> |
79
+ | **Assistent getrennt von Chats** | <a id="feature-assistantapart"></a>Standardmäßig an (ausschalten unter **Einstellungen → Composer Plus**). Der Assistenten-Chat verlässt die Chatliste in der linken Seitenleiste und steht damit nicht zwischen deinen Projekt-Chats: Öffne ihn mit **Assistent**. Sein Projekt "Assistant" verschwindet ebenfalls, solange es keinen anderen Chat enthält; die Suche in der Seitenleiste findet den Chat weiterhin. Ein Punkt in der Zeile **Assistent** zeigt den Zustand des Assistenten: arbeitet (auch während ein Thema im Hintergrund läuft), wartet auf dich (orange: eine Genehmigung, eine Frage oder eine Planprüfung) oder neue Antwort (grün). Solange der Assistenten-Chat offen ist, wird die Zeile **Assistent** als geöffnet angezeigt. Ausgeschaltet steht der Chat wieder in der Liste, und die Zeile hat keinen Punkt. | <a href="assets/features/assistantApart.webp"><img src="assets/features/assistantApart.webp" width="160" alt="Screenshot: Assistent getrennt von Chats"></a> |
80
+ | **Nur Nachrichten im Assistenten** | <a id="feature-assistantchatview"></a>Standardmäßig an (ausschalten unter **Einstellungen → Composer Plus**). Der Assistenten-Chat sieht aus wie ein Chat mit einem Bot: Tool-Aufrufe, Denken, Schrittgruppen und die Zeile "Completed in" sind ausgeblendet, und du siehst deine Nachrichten, seine Antworten, Fehler und die Genehmigungskarten. Andere Chats ändern sich nicht. Schalte die Funktion aus, um die Arbeitsschritte des Assistenten wieder zu sehen. | <a href="assets/features/assistantChatView.webp"><img src="assets/features/assistantChatView.webp" width="160" alt="Screenshot: Nur Nachrichten im Assistenten"></a> |
81
+ | **Assistent immer frei** | <a id="feature-assistantfree"></a>Standardmäßig an (ausschalten unter **Einstellungen → Composer Plus**). Der Assistenten-Chat antwortet sofort und ist nie mit einer langen Arbeit beschäftigt: Er ruft nur seine eigenen kurzen Tools auf (deine Chats, Erinnerungen, Gedächtnis und Subagenten). Jeder andere Schritt, etwa eine Websuche, eine Webseite, eine Datei oder ein Befehl, geht an einen Subagenten im Hintergrund; der Chat sagt in einer Zeile, was er gestartet hat, und ist frei für deine nächste Nachricht, und das Ergebnis kommt in den Chat zurück, sobald es fertig ist. Seine Subagenten arbeiten wie gewohnt. Wenn der Assistenten-Chat kein Subagent-Tool hat (wegen seines Berechtigungsmodus oder Profils), tut die Regel nichts, und **Einstellungen** zeigt das an. | <a href="assets/features/assistantFree.webp"><img src="assets/features/assistantFree.webp" width="160" alt="Screenshot: Assistent immer frei"></a> |
82
+ | **Chat-Neuigkeiten im Assistenten** | <a id="feature-assistantnotify"></a>Standardmäßig aus: Jede Neuigkeit ist eine Modellrunde des Assistenten-Chats und verbraucht daher Tokens. Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Dann sagt dir der Assistent in seinem eigenen Chat Bescheid, wenn ein anderer Chat eine lange Runde (1 Minute oder länger) beendet, fehlschlägt oder 30 Sekunden auf dich wartet (eine Genehmigung, eine Frage oder eine Planprüfung): eine kurze Zeile pro Chat, mit dem Titel und dem Projekt des Chats. Neuigkeiten werden 15 Sekunden lang gesammelt und kommen höchstens alle 2 Minuten; solange der Assistent arbeitet, warten sie, bis diese Runde endet. Ein Chat, den du gestoppt hast, eine kurze Runde und der eigene Chat des Assistenten geben keine Neuigkeit. Wenn **Mobile Verbindung (iPhone)** an ist, bekommt Tether die übliche Benachrichtigung "Turn finished" des Assistenten. | <a href="assets/features/assistantNotify.webp"><img src="assets/features/assistantNotify.webp" width="160" alt="Screenshot: Chat-Neuigkeiten im Assistenten"></a> |
79
83
  | **Projektgedächtnis** | <a id="feature-projectmemory"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Jeder Projektordner bekommt ein eigenes Gedächtnis, das spätere Chats dieses Projekts lesen, so wie DS Bot eines pro Bot führt. Nach jeder abgeschlossenen Runde liest ein Aufruf an das Modell des Chats die neuen Nachrichten (keine zurückgenommenen), speichert deine dauerhaften Vorlieben, Entscheidungen und Fakten als kurze Notizen und ändert oder entfernt alte. Der Agent kann Notizen auch selbst speichern, entfernen und suchen (`memory_remember`, `memory_forget`, `memory_recall`). Eine Notiz kann auch global sein: Jedes Projekt liest sie. Ein neuer Chat bekommt die Notizen in seinem Systemprompt; eine später gespeicherte Notiz erscheint ab dem nächsten Chat. Die Dateien sind Markdown im dsh-Basisordner (`storages/dsh-composer-plus/memory/`), nie im Projektordner. **Gedächtnis öffnen** in derselben Zeile zeigt alle gespeicherten Notizen nach Projekt gruppiert (und das globale Gedächtnis), mit einem Filter. Schreibe in eigenen Worten, was sich ändern soll (zum Beispiel „ich nutze jetzt pnpm statt yarn“), dann **Änderungen ansehen**: Das Standardmodell von dsh schlägt die Änderungen vor, und erst **Anwenden** speichert sie. In Tether: Menü des Chat-Titels → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Screenshot: Projektgedächtnis"></a> |
80
84
  | **Versionsverlauf des Gedächtnisses** | <a id="feature-memoryhistory"></a>Standardmäßig an, solange **Projektgedächtnis** an ist. Vor jedem Speichern des Gedächtnisses (der Agent, die Prüfung nach einem Durchgang, **Gedächtnis öffnen**) wird eine Kopie der Notizen im vorherigen Zustand behalten. Wähle in **Gedächtnis öffnen** ein Projekt oder **Globales Gedächtnis** und dann **Verlauf**: die Versionen nach Datum und wer das Gedächtnis danach geändert hat. Wähle eine Version, um als Diff zu sehen, was eine Wiederherstellung ändert, dann **Wiederherstellen**. Die Notizen vor einer Wiederherstellung werden auch behalten, sodass du sie rückgängig machen kannst. Die neuesten 50 Versionen jedes Gedächtnisses bleiben. In Tether: Menü des Chat-Titels → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Screenshot: Versionsverlauf des Gedächtnisses"></a> |
81
85
  | **Gedächtnis nach AGENTS.md exportieren** | <a id="feature-memoryexport"></a>Wähle in **Gedächtnis öffnen** ein Projekt und dann **Nach AGENTS.md exportieren**: Die Notizen dieses Projekts kommen in einen markierten Abschnitt von `AGENTS.md` in seinem Ordner, damit du sie committen und mit deinem Team und anderen Agent-Tools teilen kannst. Du siehst die Änderung zuerst als Diff; nur **AGENTS.md schreiben** speichert sie. Der nächste Export ersetzt nur diesen Abschnitt. Globales Gedächtnis, Quellen und Daten bleiben draußen. In Tether: Menü des Chat-Titels → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Screenshot: Gedächtnis nach AGENTS.md exportieren"></a> |
@@ -104,7 +108,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
104
108
  | **Options-Schaltflächen** | <a id="feature-optionpicks"></a>Wenn eine Antwort mit einer Liste von Optionen endet (eine nummerierte Liste mit 1 bis 9 Einträgen unter einer Überschrift „Optionen“ oder einer fetten Zeile „Optionen“, auch „Nächste Schritte“ und dieselben Wörter in den Sprachen der App), erscheint unter der Antwort für jede Option eine Schaltfläche. Ein Klick sendet „Option N: …“ mit der ganzen Option als Ihre Nachricht, als hätten Sie sie getippt. Die mit „(empfohlen)“ markierte Option ist hervorgehoben. Die Schaltflächen erscheinen nur unter der neuesten Antwort, solange der Chat untätig und das Eingabefeld leer ist; eine bereits gewählte Antwort und eine durch ein Zurücksetzen zurückgezogene Antwort zeigen keine. Solange sie sichtbar sind, macht die Vorhersage der nächsten Nachricht keinen Vorschlag. Auf einer Fragekarte des Agenten wählen die Tasten 1–9 diese Option wie ein Klick (nicht im Antwortfeld und nicht in den ersten 0,8 Sekunden nach dem Erscheinen der Frage). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Screenshot: Options-Schaltflächen"></a> |
105
109
  | **App-Sprache** | <a id="feature-language"></a>Einstellungen → Composer Plus → **App-Sprache** stellt die ganze dsh-Oberfläche auf Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt oder हिन्दी um (siehe unten). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Screenshot: App-Sprache"></a> |
106
110
  | **Mobile Verbindung (iPhone)** | <a id="feature-mobileconnect"></a>Nutze dsh mit der App [Tether](tether/) von deinem iPhone aus, im selben WLAN oder über [Tailscale](https://tailscale.com). Schalte die Funktion unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie einen Netzwerkport auf diesem Mac öffnet). Klicke dann unten links in der Seitenleiste auf **Mobile Verbindung**: Scanne den QR-Code mit der iPhone-Kamera (tippe auf **Open in Tether**) oder mit **Scan code** in Tether, tippe auf **Connect** und klicke auf **Approve**. Installiere Tether zuerst: Ohne die App kann die Kamera den Code nicht öffnen. Das Telefon zeigt deine Chats, sendet Nachrichten (mit Fotos: das **+** im Eingabefeld → Camera, Photos oder Paste image), beantwortet Genehmigungen und Fragen und wechselt Modelle und Agenten. Kopple so viele Macs, wie du willst: Mit dem Mac-Namen oben links in der App wechselst du zwischen ihnen. Das Panel **Mobile Verbindung** listet die gekoppelten iPhones mit ihrer letzten Verbindung auf: **Remove** trennt eines sofort. „Tailscale only“ lehnt das lokale Netzwerk ab (für ein geteiltes WLAN), und das Zugriffsprotokoll zeigt, wer sich verbinden wollte. In Tether sperrt „Settings → Privacy“ die App mit Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Screenshot: Mobile Verbindung (iPhone)"></a> |
107
- | **Remote-Computer** | <a id="feature-remotecomputers"></a>Öffne dsh auf deinen anderen Macs über [Tailscale](https://tailscale.com) und nutze sie in diesem dsh-Fenster. Schalte die Funktion auf jedem Mac unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie Netzwerkports öffnet). Schalte auf dem Mac, den du öffnen willst, **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link. Wähle auf diesem Mac in der Computerauswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein (nicht den Namen dieses Macs oder eines anderen Computers) und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach listet die Auswahl **Dieser Mac** und deine Computer auf: Wähle einen, und sein dsh füllt dieses Fenster, mit seinen eigenen Chats, seiner Seitenleiste, seinen Tools und Dateien, während dieser Mac dahinter weiterläuft. Die Auswahl bleibt an derselben Stelle und zeigt **Zurück zu diesem Mac**: Klicke darauf, um zurückzukommen. Mit mehr als einem Computer öffnet der Klick das Menü, in dem du **Dieser Mac** oder einen anderen Computer wählst. Im Einstellungsbereich kannst du Computer umbenennen und entfernen. Dort siehst du auch die Computer, die diesen Mac öffnen können (**Entfernen** trennt einen sofort). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Screenshot: Remote-Computer"></a> |
111
+ | **Remote-Computer** | <a id="feature-remotecomputers"></a>Öffne dsh auf deinen anderen Macs über [Tailscale](https://tailscale.com) und nutze sie in diesem dsh-Fenster. Schalte die Funktion auf jedem Mac unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie Netzwerkports öffnet). Schalte auf dem Mac, den du öffnen willst, **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link. Wähle auf diesem Mac in der Computerauswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein (nicht den Namen dieses Macs oder eines anderen Computers) und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach listet die Auswahl **Dieser Mac** und deine Computer auf: Wähle einen, und sein dsh füllt dieses Fenster, mit seinen eigenen Chats, seiner Seitenleiste, seinen Tools und Dateien, während dieser Mac dahinter weiterläuft. Die Auswahl bleibt an derselben Stelle und zeigt **Zurück zu diesem Mac**: Klicke darauf, um zurückzukommen. Mit nur einem Computer wechselt ein Klick auf die Auswahl sofort zwischen diesem Mac und dem anderen Computer (ohne Menü); für das ganze Menü (**Computer hinzufügen…**) klicke mit der rechten Maustaste auf die Auswahl. Mit mehr als einem Computer öffnet der Klick das Menü, in dem du **Dieser Mac** oder einen anderen Computer wählst. Im Einstellungsbereich kannst du Computer umbenennen und entfernen. Dort siehst du auch die Computer, die diesen Mac öffnen können (**Entfernen** trennt einen sofort). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Screenshot: Remote-Computer"></a> |
108
112
  | **Automatische Updates** | <a id="feature-autoupdate"></a>Wenn dsh startet, prüft das Plugin das [neueste GitHub-Release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Ist es neuer und schon auf npm, installiert das Plugin genau diese Version über die eigene Plugin-Verwaltung von dsh (derselbe Weg wie Einstellungen → Plugins) und benachrichtigt dich. Starte dsh neu, um die Version zu laden. **Einstellungen → Composer Plus → Composer-Plus-Updates** zeigt die Version und hat **Nach Updates suchen** / **Jetzt aktualisieren**. Beim ersten Start von dsh mit der neuen Version zeigt ein Fenster **Neu in Composer Plus N** einmal die Release Notes dieser Version in der Sprache von **App-Sprache** (sie kommen mit der neuen Version, ohne weiteren Netzwerkaufruf; eine Sprache ohne Notes zeigt die englischen); **Schließen** oder `Esc` schließt es. Unter den Notes bittet eine Zeile um einen Stern auf GitHub, höchstens einmal in 30 Tagen (ohne Netzwerkaufruf); nach **Auf GitHub einen Stern geben** oder **Nicht mehr fragen** erscheint sie nicht mehr. Das Fenster erscheint auch nach einem Update über Einstellungen → Plugins oder einen kopierten Ordner, einmal je neuer Version; nicht bei der ersten Installation. **Neu in dieser Version** in der Update-Zeile öffnet es erneut. Liegt auf der Festplatte eine neuere Version als die laufende, bittet die Zeile um einen Neustart von dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatische Updates"></a> |
109
113
  | **An/Aus-Filter** | <a id="feature-featurefilter"></a>Neben **Funktionen suchen** unter **Einstellungen → Composer Plus**: **Alle** zeigt alle Funktionen, **An** nur die Funktionen mit eingeschaltetem Schalter und **Aus** nur die mit ausgeschaltetem Schalter. Es entscheidet der Schalter jeder Zeile, auch ein Schalter, den der Host von dsh speichert (zum Beispiel **Mobile Verbindung**). Der Filter wirkt zusammen mit der Suche: Gib ein Wort ein und wähle **Aus**, um eine Funktion zu finden, die du ausgeschaltet hast. Eine Zeile, die du umschaltest, während **An** oder **Aus** gewählt ist, bleibt, bis du wieder einen Filter wählst; so bleibt der Fokus auf ihrem Schalter. **An** und **Aus** blenden die Zeilen **App-Sprache** und **Composer-Plus-Updates** aus (sie haben keinen Schalter). Die Einstellungen öffnen sich jedes Mal mit **Alle**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Screenshot: An/Aus-Filter"></a> |
110
114
  | **Issue melden** | <a id="feature-issuereport"></a>Einstellungen → Composer Plus → **Issue melden…** (unter der Einleitung), oder Rechtsklick auf einen Chat in der Seitenleiste (oder sein Menü **…** öffnen) → **Issue zu Composer Plus melden…**. Wähle einen Typ: **Fehler**, **Funktionswunsch**, **Verbesserung**, **Übersetzung** oder **Frage**. Beschreibe es in deinen eigenen Worten und in deiner Sprache und klicke dann auf **Entwurf schreiben** (oder `Cmd/Ctrl+Enter`). Ein Aufruf an das Standardmodell von dsh schreibt ein englisches Issue: einen Titel mit dem Präfix des Typs (zum Beispiel `[Bug]`) und die Abschnitte dieses Typs (bei einem Fehler: What happened, Steps to reproduce, Expected, Actual), dazu eine Zeile mit den Versionen von Composer Plus, dsh und dem System. Lies und bearbeite den Titel und die Beschreibung; **Neu schreiben** schreibt einen neuen Entwurf. **Issue öffnen** öffnet es im GitHub-Repository von Composer Plus mit deiner Anmeldung bei GitHub CLI (`gh`) und zeigt seinen Link. Das Issue ist öffentlich: Text, der wie ein Schlüssel oder ein Passwort aussieht, wird abgelehnt. Wenn `gh` es nicht öffnen kann, öffnet **Stattdessen auf GitHub öffnen** die eigene Seite von GitHub mit dem ausgefüllten Entwurf. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Screenshot: Issue melden"></a> |
@@ -199,7 +203,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
199
203
  - **In einem neuen Chat fortsetzen:** Nichts läuft, bis du darauf klickst. Dann sendet die Host-Hälfte den Chat (so, wie die Zielprüfung ihn liest: kein Reasoning, keine zurückgenommenen Schritte) an das eigene Modell des Chats und zeigt die Übergabenotiz. Nur **Neuen Chat starten** erstellt einen neuen Chat. Ins Projekt wird nichts geschrieben.
200
204
  - **Kontextaufschlüsselung:** Die Host-Hälfte liest nur das Chatprotokoll. Kein Modellaufruf, keine Projektdatei.
201
205
  - **Aufgabentafel:** Die Tafel zeigt die Chats von dsh aus den eigenen Listen von dsh in diesem Fenster; sie fügt keine eigenen Chatdaten hinzu. **Neue Aufgabe** öffnet den eigenen neuen Chat von dsh, und du schreibst die erste Nachricht im Eingabefeld von dsh; Freigaben, die Sandbox und das Modell des Chats gelten also wie sonst. Die Host-Hälfte behält die erste Nachricht dieses Chats als Prompt der Karte und sendet sie (ihre ersten 4.000 Zeichen, sonst nichts) in einer weiteren Anfrage ohne Tools an das Modell dieses Chats, um bis zu 3 Schlagwörter zu bekommen. Prompt, Schlagwörter und Startzeit jeder Aufgabe liegen in `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (Datei nur für den Besitzer, die neuesten 2.000), dazu die IDs der Chats, die du mit **×** oder **Alle entfernen** von der Tafel genommen hast (die neuesten 5.000); der Schalter liegt daneben in `board-switch.json`. Nichts wird in einen Projektordner geschrieben. **Antworten** sendet deine Antwort an die offene Anfrage von dsh, so wie es die Karte im Chat selbst tut. Die alte Aufgabenliste früherer Versionen (`board.json`) bleibt unverändert auf der Festplatte und wird nicht gelesen. **Fortschritt beim Darüberfahren** liest das Protokoll des Chats auf diesem Mac. Mit **Schnell (ohne KI)** (Standard) wird nichts gesendet. Mit **KI-Zusammenfassung** sendet die Host-Hälfte, solange das Fortschrittsfeld einer laufenden Karte zu sehen ist (oder solange die Tafel in Tether offen ist, für bis zu 8 laufende Karten), den neuesten Teil dieses Chats (höchstens etwa 6.000 Zeichen: deine Nachrichten, die Textantworten des Agenten, seine Werkzeugaufrufe und das Ende ihrer Ergebnisse; kein Reasoning, keine zurückgenommenen Nachrichten) als eine Anfrage ohne Werkzeuge an das Modell des Chats. Erneut sendet sie erst, wenn der Chat weitergekommen ist, höchstens alle 20 Sekunden pro Chat. Die Notiz bleibt nur im Speicher; die Einstellung liegt in `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (Datei nur für den Besitzer).
202
- - **Assistent:** Der Assistenten-Chat ist ein gewöhnlicher dsh-Chat in `~/Assistant`; seine Modellaufrufe gehen wie in jedem Chat an das Standardmodell von dsh. Seine Tools lesen die Protokolle deiner anderen Chats auf diesem Mac (Titel, Projekte, Status und mit chat_read ihre neuesten Nachrichten) und geben sie diesem Modell nur, wenn es ein Tool aufruft. Senden, Starten, Stoppen und Archivieren eines Chats warten jeweils auf deine Genehmigung. Die Chat-ID liegt in `$DSH_HOME/storages/dsh-composer-plus/assistant.json` und der Schalter in `assistant-switch.json` (Dateien nur für den Besitzer). Erinnerungen und Automatisierungen sind die eigenen geplanten Aufgaben von dsh. Nichts verlässt diesen Mac außer den Modellanfragen und den Websuchen, die der Chat macht.
206
+ - **Assistent:** Der Assistenten-Chat ist ein gewöhnlicher dsh-Chat in `~/Assistant`; seine Modellaufrufe gehen wie in jedem Chat an das Standardmodell von dsh. Seine Tools lesen die Protokolle deiner anderen Chats auf diesem Mac (Titel, Projekte, Status und mit chat_read ihre neuesten Nachrichten) und geben sie diesem Modell nur, wenn es ein Tool aufruft. Senden, Starten, Stoppen und Archivieren eines Chats warten jeweils auf deine Genehmigung. Die Chat-ID liegt in `$DSH_HOME/storages/dsh-composer-plus/assistant.json` und der Schalter in `assistant-switch.json` (Dateien nur für den Besitzer). Erinnerungen und Automatisierungen sind die eigenen geplanten Aufgaben von dsh. Nichts verlässt diesen Mac außer den Modellanfragen und den Websuchen, die der Chat macht. Die Schalter für den Assistenten als Bot speichern ihren Zustand in `assistant-free.json` und `assistant-notify.json` (Dateien nur für den Besitzer). **Chat-Neuigkeiten im Assistenten** schreibt eine kurze Zeile über einen anderen Chat (Titel, Projekt und höchstens 300 Zeichen seiner letzten Antwort oder seines letzten Fehlers) in den Assistenten-Chat, daher geht dieser Text auch an das Modell des Assistenten; die Neuigkeiten warten nur im Speicher.
203
207
  - **Geschützte Dateien:** Die Liste und der Schalter liegen in `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (Datei nur für den Besitzer). Die Prüfung liest nur den Pfad jedes Aufrufs eines Datei-Tools (und seinen echten Pfad), nie die Datei.
204
208
  - **Blockierte Befehle:** Die Regeln und der Schalter liegen in `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (Datei nur für den Besitzer). Die Prüfung liest nur den Befehlstext jedes Aufrufs von `bash` und `pwsh`; sie führt nichts aus und sendet nichts.
205
209
  - **Geheime Eingabe:** Der Wert geht von der Karte (oder von Tether über das Gateway, das keine Anfrageinhalte protokolliert) nur in der Antwortanfrage an den Host. Der Host schreibt ihn nach `$DSH_HOME/storages/dsh-composer-plus/secrets/<zufälliger Name>` (Ordner 0700, Datei 0600); nichts geht ins Projekt, ins Chatprotokoll oder ins Tool-Ergebnis. Der Host hält den Wert im Speicher, um ihn in späteren Tool-Ergebnissen dieses Chats durch `[secret]` zu ersetzen. Die Datei und diese Kopie werden am Ende des Durchgangs des Chats und beim Start von dsh gelöscht. Der Schalter liegt daneben in `secrets.json`. Ein Befehl, den der Agent mit der Datei ausführt, kann den Wert dorthin senden, wohin dieser Befehl sendet: Das ist der Zweck.
@@ -226,7 +230,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
226
230
  - **Kein Branch-Etikett an einer Chatzeile:** Die Seitenleiste ist nicht in „In einer Liste“ (in „Arbeitsbereich“ und „Arbeitsbereichsbaum“ zeigt keine Chatzeile ein Etikett), der Chat hatte seit der Installation dieser Version keine Runde, sein Ordner ist kein git-Repository, oder **Git-Branch in Chatzeilen** ist aus. Starte dsh nach einem Update neu (die Host-Hälfte zeichnet den Branch auf).
227
231
  - **Zielprüfung meldet, dass der Test mit Code 127 oder „not found“ beendet wurde:** Ein dsh, das aus dem Finder oder dem Dock gestartet wurde, kann einen kürzeren PATH als dein Terminal haben und findet daher `npm`, `pnpm` oder `cargo` nicht. Starte dsh aus einem Terminal, oder lege unter **Zielprüfung** → **Bearbeiten** deinen eigenen Testbefehl mit dem vollständigen Pfad fest. **Jetzt ausführen** zeigt das Ergebnis sofort.
228
232
  - **Das Ziel schließt sich nicht und der Agent arbeitet weiter:** **Zielprüfung** hat einen fehlschlagenden Test oder fehlende Arbeit gefunden. Die Zeile unter dem Ziel zeigt den Grund (fahre mit der Maus über das Ergebnis, um die Details zu sehen). Behebe die Ursache oder den Testbefehl, oder schließe das Ziel selbst mit `/goal` oder der Zielleiste ab (das wird nicht geprüft).
229
- - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.24.1`), siehe den Hinweis zur Installation oben.
233
+ - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.25.0`), siehe den Hinweis zur Installation oben.
230
234
  - **Jetzt sichern meldet „Eine andere Sicherungsaktion läuft“:** Eine Aktion läuft in einem anderen dsh-Fenster oder in der Rettungskonsole (sie teilen sich eine Sperrdatei, `.composer-plus.lock`, im Sicherungsordner). Warte, bis sie fertig ist. Läuft keine Aktion, wird die Sperre eines beendeten Prozesses beim nächsten Klick übernommen.
231
235
  - **Die Rettungskonsole meldet „dsh is running“:** Beende zuerst dsh. Ist dsh wirklich geschlossen, ist die in der Meldung genannte Datei von einem Absturz übrig: Entferne sie und versuche es erneut.
232
236
  - **Nach einer Wiederherstellung startet dsh nicht oder ein Plugin fehlt:** Die Plugin-Pakete eines Profils müssen neu installiert werden. Die Rettungskonsole bietet das nach einer Wiederherstellung an; oder führe `pnpm install` in jedem Ordner unter `$DSH_HOME/profiles/` aus, den sie auflistet. Geheimnisse, die nicht im vault waren (anderer Computer), müssen neu eingegeben werden: Die Konsole listet sie auf.
@@ -260,7 +264,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
260
264
  - **Fragekarte an das Fenster anpassen** ändert nur die Fragekarte von dsh, nicht die Karte zur Planprüfung. Sie findet die Karte über das Markup von dsh (`data-question-key`, `data-question-scroll`); ändert ein dsh-Update dieses Markup, erscheint die Karte so, wie dsh sie zeichnet. Die Höhe der Karte folgt dem Fenster, nicht dem Chat: In einem Chat in einem schmalen Seitenbereich kann eine hohe Karte noch über den Chat hinausragen.
261
265
  - **Chat-Kopfzeile an Fenster anpassen** findet die Chat-Kopfzeile von dsh über ihre generierten Klassennamen (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), weil dsh dafür keinen Layout-Haken bietet. Benennt ein dsh-Update sie um, erscheint die Kopfzeile so, wie dsh sie zeichnet. In einer sehr schmalen Chat-Spalte kann die Kopfzeile zwei oder drei Zeilen belegen, sodass über den Nachrichten weniger Platz bleibt.
262
266
  - **Mobile Verbindung** funktioniert nur unter macOS (sie nutzt `en0`, `openssl`, `swift` und `dns-sd`). Sie nutzt die festen Ports 19390 und 19391. Daher kann auf jedem Mac nur ein dsh sie gleichzeitig ausführen (jeder Mac ist ein Eintrag in der Mac-Liste des Telefons). Mit einem APNs-Schlüssel in `apns.json` (siehe `tether/README.md`) sendet der Mac die Benachrichtigungen über Apples Push-Dienst, sodass sie auch bei geschlossenem Tether ankommen; der Mac muss wach sein und dsh offen. Ohne den Schlüssel bekommt das Telefon sie nur, solange Tether offen ist oder gerade in den Hintergrund gewechselt ist. Tether sendet sie erst, wenn du in Tether „Settings → Notifications → Send notifications“ einschaltest. Tether speichert den Schalter und seine Uhrzeiten für jeden gekoppelten Mac getrennt. Der Schalter ist auf jedem Mac standardmäßig aus, und iOS fragt beim Einschalten nach der Erlaubnis. Die iOS-App ist noch nicht im App Store: Baue sie mit Xcode aus `tether/ios`. „Tailscale only“ braucht trotzdem eine WLAN- oder Ethernet-Adresse auf dem Mac (das Gateway startet nur mit einer solchen Adresse). Das Zugriffsprotokoll gilt pro Mac und speichert nur die neuesten 200 Versuche. Ein wiederholter Versuch innerhalb einer Minute zählt dieselbe Zeile um eins hoch. Jede Mitteilung zeigt den Mac und das Projekt des Chats (`Studio Mac · recipe-box`), den Titel des Chats und den Text: Turn finished zeigt die letzte Antwort des Agenten. Mit dem APNs-Schlüssel geht dieser Text über Apples Push-Dienst. Die App-Sperre von Tether blendet Mitteilungsvorschauen auf dem Sperrbildschirm des iPhone nicht aus: Schalte sie in den iOS-Einstellungen aus. Die grünen Punkte in Tether folgen dem Mac: Ein Chat, den du in dsh öffnest, verliert seinen Punkt auch auf dem Telefon. Ein Chat, den du in Tether öffnest, verliert seinen Punkt nur auf den Telefonen. Der eigene Punkt von dsh auf dem Mac bleibt, bis du den Chat dort öffnest.
263
- - **Remote-Computer** braucht Tailscale auf beiden Macs und Composer Plus mit eingeschalteter Funktion auf dem Mac, den du öffnest. Dieser Mac muss wach sein, und dsh muss dort laufen. Die Auswahl erscheint nur, wenn die linke Seitenleiste offen ist (nicht, wenn sie nur Symbole zeigt). Hat die Seite des anderen Macs keine eigene Auswahl (dort Composer Plus älter als 1.23.0), zeigt sich die Auswahl dieses Macs an derselben Stelle über dieser Seite. Mit 1.23.0 dort zeigt die Auswahl den Namen des anderen Macs: Wähle in ihrem Menü **Dieser Mac**, um zurückzukommen. Jeder Computer, den du geöffnet hast, behält seine Seite im Speicher, bis du die Funktion ausschaltest oder dsh neu startest. In der Desktop-App ist die Seite des anderen Macs eine eingebettete Seite: Die eigenen Tastenkürzel von dsh (zum Beispiel für einen neuen Chat) funktionieren darin nicht, und auch Dateidownloads, Mikrofon und Benachrichtigungen funktionieren dort nicht. Die Funktion nutzt Port 19392 (nur ein dsh pro Mac kann andere Computer hereinlassen). Auf der Seite eines anderen Macs wechselt die Auswahl nur zwischen den Computern dieses Macs: Du kannst über den anderen Mac keinen dritten Mac öffnen.
267
+ - **Remote-Computer** braucht Tailscale auf beiden Macs und Composer Plus mit eingeschalteter Funktion auf dem Mac, den du öffnest. Dieser Mac muss wach sein, und dsh muss dort laufen. Die Auswahl erscheint nur, wenn die linke Seitenleiste offen ist (nicht, wenn sie nur Symbole zeigt). Hat die Seite des anderen Macs keine eigene Auswahl (dort Composer Plus älter als 1.23.0), zeigt sich die Auswahl dieses Macs an derselben Stelle über dieser Seite. Mit 1.23.0 dort zeigt die Auswahl den Namen des anderen Macs: Wähle in ihrem Menü **Dieser Mac**, um zurückzukommen. Jeder Computer, den du geöffnet hast, behält seine Seite im Speicher, bis du die Funktion ausschaltest oder dsh neu startest. Hat der Computer nicht geantwortet (er schlief oder Tailscale war aus), wird seine Seite nicht behalten: Wähle ihn erneut aus, dann lädt sie neu. In der Desktop-App ist die Seite des anderen Macs eine eingebettete Seite: Die eigenen Tastenkürzel von dsh (zum Beispiel für einen neuen Chat) funktionieren darin nicht, und auch Dateidownloads, Mikrofon und Benachrichtigungen funktionieren dort nicht. Die Funktion nutzt Port 19392 (nur ein dsh pro Mac kann andere Computer hereinlassen). Auf der Seite eines anderen Macs wechselt die Auswahl nur zwischen den Computern dieses Macs: Du kannst über den anderen Mac keinen dritten Mac öffnen. Der Wechsel mit einem Klick zählt nur Computer, die gekoppelt und erreichbar sind (ein Computer, der neu gekoppelt werden muss, zählt nicht); mit nur einem solchen Computer findest du **Computer hinzufügen…** im Menü per Rechtsklick (auf einem Touchscreen: gedrückt halten) oder unter **Einstellungen → Composer Plus → Remote-Computer**.
264
268
  - Ein Sitzungslink funktioniert in Chats; ein Klick darauf öffnet den Chat nicht. Ein mit **Nachrichtenlink kopieren** erstellter Link öffnet seine Nachricht nur ab dsh 0.2.1 und nur aus einer Nachricht in einem Chat (dsh 0.2.0 hat keine Regeln für Benutzertext, dort wird der Link kopiert, erscheint aber als einfacher Text). Eine Nachricht, die ein Zurücknehmen entfernt hat oder die die Komprimierung aus dem Verlauf entfernt hat, den dsh lädt, kann nicht angezeigt werden: Der Link sagt das dann. Die 🔗-Schaltflächen hängen sich an die Nachrichtenzeilen von dsh. Wenn ein dsh-Update dieses Markup ändert, erscheinen sie nicht.
265
269
  - **Alle als gelesen markieren** ändert die eigenen Ungelesen-Punkte von dsh über einen Teil von dsh, der keine öffentliche API ist (die Liste `completionUnread` im Sitzungsstatus von dsh). Wenn ein dsh-Update sie umbenennt, erscheint der Eintrag nicht. Der Eintrag kommt in das „…“-Menü des Projekts in dsh, das keinen Platz für Plugins hat. Wenn dsh dieses Menü ändert, erscheint der Eintrag ebenfalls nicht.
266
270
  - **Eingereihte Nachricht direkt bearbeiten** ändert keine Nachricht, deren Senden inzwischen begonnen hat, und überschreibt keine Nachricht, die sich inzwischen geändert hat (zum Beispiel in Tether auf dem iPhone): Ein Hinweis meldet das. Ein neues Bild braucht ein Modell, das Bilder annimmt (die eigenen Bildgrenzen von dsh gelten), und eine neue Datei muss fertig hochgeladen sein, bevor du speichern kannst. Nur deine eigenen eingereihten Nachrichten lassen sich bearbeiten: Eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange nicht. Nach einem Update des Plugins funktionieren nur Textänderungen sofort: Starte dsh neu, bevor du eine Nachricht mit Bildern oder Dateien speicherst (die Host-Hälfte lädt beim Start).
@@ -296,7 +300,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
296
300
  - **Türkisches Skill-Paket** installiert einen Skill von Dritten: Seine Regeln kommen aus dem GitHub-Repository des Autors, nicht von Composer Plus, und eine neue Version gilt ab der nächsten täglichen Prüfung, ohne dass wir sie prüfen. Die Prüfung beweist, dass die Dateien die sind, die GitHub für diesen Commit auflistet, nicht dass die Regeln gut sind. Das Modell entscheidet, wann es den Skill lädt (du kannst ihn auch mit Namen aufrufen); die Regeln gelten nur für türkische Texte. Die Host-Hälfte nutzt die Sprache, die ein Browser zuletzt gemeldet hat: Nutzen zwei Browser verschiedene Sprachen, gilt die neueste Meldung. GitHub erlaubt ohne Anmeldung 60 API-Aufrufe pro Stunde; eine abgelehnte Prüfung behält die installierte Kopie und zeigt den Grund in den Einstellungen.
297
301
  - **Codebasis entwirren** enthält eine feste Kopie des Skills (caldoai/skills, Commit f3cf477): Eine Änderung im Original kommt erst mit einer neuen Composer-Plus-Version. Der Skill führt ein langes Ziel aus, das viele Dateien ändern kann, und seine Subagenten und Prüfungen verbrauchen viele Tokens. Wo das Projekt keine Tests hat, kann er das Verhalten unbemerkt ändern: Starte ihn in einem Branch und lies den Diff vor dem Merge. Ein Skill mit demselben Namen im Projekt, in einem eigenen Skill-Ordner oder in `~/.dsh/skills` ersetzt ihn. Solange der Schalter aus ist, geht `/untangle-codebase` als normaler Text an das Modell.
298
302
  - **Aufgabentafel** zeigt die Chats, die dsh in diesem Fenster auflistet: Ein Chat außerhalb eines Projekts erscheint nur unter **Alle Projekte**, und der Ordner eines Branches pro Chat (`<project>/.worktrees/<name>`) zählt zu seinem Projekt. Die Spalte einer Karte ist der Live-Zustand des Chats, daher lassen sich Karten nicht ziehen: Ein Chat kommt nach **Fertig**, wenn seine Runde endet, auch nach einem Fehler oder einem Stopp, und zurück nach **In Arbeit**, wenn er wieder läuft. Der grüne Punkt ist der Fertig-Punkt von dsh, den dsh nur in diesem Fenster behält: Nach einem Neuladen erscheinen beendete Chats ohne ihn. **Fertig** zeigt die neuesten 50 Chats (**N ältere anzeigen** zeigt den Rest). **Projekte durchsuchen** findet ein Projekt nur über seinen Namen, nicht über seinen Ordnerpfad. **In den letzten 2 Stunden aktiv** blendet ein Projekt aus, wenn jeder seiner Chats älter als 2 Stunden, inaktiv und gelesen ist; die Tafel zeigt das Projekt, das du gewählt hast, weiterhin. **Neue Aufgabe** merkt sich nur den neuesten neuen Chat dieses Fensters: Wenn du vor der ersten Nachricht einen anderen Chat öffnest, bleibt dieser Chat als **Neue Aufgabe** oben in **In Arbeit**, bis du darin schreibst, aber die Tafel kommt nur für den neuesten von selbst zurück. Nach einem Neuladen steht ein neuer Chat ohne Nachricht nicht auf der Tafel (dsh behält ihn als seine leere Neue Sitzung). Die Schlagwörter kommen aus einem Modellaufruf pro Aufgabe, aus ihrer ersten Nachricht: Sie können falsch sein, und ein Chat, den du nicht auf der Tafel gestartet hast, hat keine. Der Titel ist der Chattitel von dsh (der Titeldienst von dsh, mit dem Modell des Chats); bis er da ist, zeigt die Karte die erste Zeile der ersten Nachricht. **×** und **Alle entfernen** nehmen Karten nur von der Tafel: Kein Chat wird gelöscht. **Rückgängig** erscheint nur 8 Sekunden lang, in diesem Fenster; später holt **Entfernt (N)** → **Zurücklegen** eine Karte zurück, und ein Chat, der wieder läuft, kommt von selbst zurück. **Alle entfernen** fragt zuerst und nimmt die gelesenen fertigen Karten des gezeigten Projekts von der Tafel (bei **Alle Projekte** die aller Projekte), auch die hinter **N ältere anzeigen**; eine ungelesene (grüne) Karte bleibt. dsh behält seinen grünen Punkt nur in diesem Fenster, daher kann Alle entfernen nach einem Neuladen eine Karte nehmen, deren Antwort du nicht gelesen hast. Die Liste liegt auf diesem Mac, für jedes Fenster und für Tether; wenn sie 5.000 Chats hat, kommen die ältesten zurück. **Antworten** beantwortet nur die neueste Anfrage des Chats: Wenn sie an anderer Stelle beantwortet wurde (ein anderes Fenster, Tether, die automatische Prüfung) oder der Chat etwas Neues fragt, sagt das Panel das und sendet nichts. Frühere Versionen hatten eine Aufgabenliste mit Kommentaren und Agenten-Tools; diese gibt es nicht mehr, und die alte `board.json` wird nicht angezeigt. Die Idee und das Aussehen stammen von [Kanzo](https://github.com/emanuele-em/kanzo) von emanuele-em (AGPL-3.0); Composer Plus nutzt keinen Code daraus. `Cmd+Shift+K` ist ein dsh-Tastenkürzel: Im Browser unter Linux hat es keine Standardtaste (lege eine auf der Seite Tastenkürzel von dsh fest), und eine Browser-Erweiterung oder eine andere App kann die Taste vorher belegen. Eine Karte verlässt **Fertig**, wenn der grüne Punkt von dsh verschwindet (du hast den Chat geöffnet), oder, bei einem Chat, der hinter der Tafel als offener Chat fertig wurde, wenn dieser Chat ohne Panel darüber zu sehen ist. Dieser Gelesen-Zustand lebt nur in diesem dsh-Fenster, wie die Punkte von dsh: Nach einem Neuladen oder in einem anderen Fenster zählt jeder beendete Chat als gelesen und steht in **Kürzlich beendet**.
299
- - **Assistent** hat einen Chat für alle Fenster dieses Macs. Er läuft mit dem Berechtigungsmodus workspace-write: Er schreibt Dateien nur in `~/Assistant`, und ein Befehl außerhalb dieses Ordners fragt zuerst. Wenn du den Chat auf einen Modus ohne Genehmigungen (Vollzugriff) umstellst, lehnt dsh jede Genehmigung ab. Dann kann der Assistent keinem Chat eine Nachricht senden und keinen Chat starten, stoppen oder archivieren. Die Genehmigungskarte schützt nur die sechs Tools: Ein Shell-Befehl des Assistenten kann weiterhin das Netzwerk erreichen, wie in jedem Chat mit diesem Modus. Unter dsh 0.2.0 und 0.2.1 sehen die Planungs-Tools von dsh nur die Erinnerungen des Assistenten-Chats selbst, nicht die Automatisierungen anderer Chats; ab dsh 0.2.2 listen und ändern sie jede geplante Aufgabe. chats_list lässt archivierte, leere und Subagent-Chats sowie den Assistenten-Chat selbst weg; „wartet auf dich“ bedeutet eine offene Genehmigung, Frage oder Planprüfung in einem laufenden Chat. chat_read liefert die Nachrichten des Benutzers und die Antworten des Agenten (keine Tool-Ausgabe), höchstens 50 Nachrichten und etwa 24.000 Zeichen. chat_archive lehnt einen Chat ab, der noch läuft oder aktive Erinnerungen hat. Ein Text, den das Modell liest, kann es trotzdem täuschen: Die Genehmigungskarte ist die letzte Prüfung, also lies sie, bevor du auf **Einmal zulassen** klickst.
303
+ - **Assistent** hat einen Chat für alle Fenster dieses Macs. Er läuft mit dem Berechtigungsmodus workspace-write: Er schreibt Dateien nur in `~/Assistant`, und ein Befehl außerhalb dieses Ordners fragt zuerst. Wenn du den Chat auf einen Modus ohne Genehmigungen (Vollzugriff) umstellst, lehnt dsh jede Genehmigung ab. Dann kann der Assistent keinem Chat eine Nachricht senden und keinen Chat starten, stoppen oder archivieren. Die Genehmigungskarte schützt nur die sechs Tools: Ein Shell-Befehl des Assistenten kann weiterhin das Netzwerk erreichen, wie in jedem Chat mit diesem Modus. Unter dsh 0.2.0 und 0.2.1 sehen die Planungs-Tools von dsh nur die Erinnerungen des Assistenten-Chats selbst, nicht die Automatisierungen anderer Chats; ab dsh 0.2.2 listen und ändern sie jede geplante Aufgabe. chats_list lässt archivierte, leere und Subagent-Chats sowie den Assistenten-Chat selbst weg; „wartet auf dich“ bedeutet eine offene Genehmigung, Frage oder Planprüfung in einem laufenden Chat. chat_read liefert die Nachrichten des Benutzers und die Antworten des Agenten (keine Tool-Ausgabe), höchstens 50 Nachrichten und etwa 24.000 Zeichen. chat_archive lehnt einen Chat ab, der noch läuft oder aktive Erinnerungen hat. Ein Text, den das Modell liest, kann es trotzdem täuschen: Die Genehmigungskarte ist die letzte Prüfung, also lies sie, bevor du auf **Einmal zulassen** klickst. Parallele Themen nutzen das Subagent-Tool von dsh: Ein Profil oder Berechtigungsmodus ohne dieses Tool behält das alte Verhalten (ein Thema nach dem anderen; die nächste Nachricht wartet in der Warteschlange oder steuert die laufende Runde). Das Modell entscheidet, was als lange Aufgabe gilt, daher kann auch eine kurze Frage eine Runde belegen. Der Subagent jedes Themas läuft mit eigenen Tokens; wenn dsh neu startet, stoppt ein laufendes Thema (sein Ergebnis kommt nicht zurück). Ein Ergebnis kommt als neue Runde des Assistenten-Chats zurück, daher wartet es, während du mitten in einer Runde schreibst.
304
+ - **Assistent getrennt von Chats** und **Nur Nachrichten im Assistenten** blenden die eigenen Zeilen von dsh mit einer Stilregel aus. Diese findet die Zeilen über das Markup der Seitenleiste und des Chats von dsh (`data-row-key`, `data-chat-flow-kind`): Wenn ein dsh-Update dieses Markup ändert, erscheint der Assistenten-Chat wieder in der Liste, oder seine Arbeitsschritte erscheinen wieder. Die Zeilen sind ausgeblendet, nicht entfernt: Die Tastaturnavigation von dsh in der Seitenleiste kann eine ausgeblendete Zeile weiterhin erreichen. **Assistent immer frei** lehnt jeden Tool-Aufruf des Assistenten-Chats ab, der keines seiner kurzen Tools ist; das Modell gibt den Schritt dann an einen Subagenten, kann aber zuerst den abgelehnten Aufruf versuchen, was einen Modellschritt kostet. Solange eine Genehmigungskarte auf dich wartet, gilt der Assistenten-Chat weiter als beschäftigt. Wenn seine neueste Anfrage kein Subagent-Tool hat (ein Berechtigungsmodus oder Profil ohne dieses Tool), tut die Regel nichts. **Chat-Neuigkeiten im Assistenten** startet für jeden Stapel Neuigkeiten eine Modellrunde des Assistenten-Chats und verbraucht daher Tokens; wenn **Mobile Verbindung (iPhone)** an ist, kann dein Telefon für einen fertigen Chat zwei Benachrichtigungen bekommen (die des Chats selbst und die des Assistenten). Wartende Neuigkeiten gehen verloren, wenn dsh neu startet. Die Funktion sieht nur Chats auf diesem Mac.
300
305
  - **Neue Nachricht nach Stoppen zuerst** wirkt nur, nachdem du den Chat gestoppt hast (oder nach einer fehlgeschlagenen Runde, oder wenn du einen Chat öffnest, der noch eine Warteschlange hat): Eine Nachricht, die du sendest, während eine Runde läuft, wartet weiterhin am Ende der Warteschlange. Sie überholt nur deine eigenen eingereihten Nachrichten: Wartet eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange, bleibt die Reihenfolge von dsh. Die Funktion liest einen Teil von dsh, der keine öffentliche API ist (ob die gestoppte Runde noch endet); benennt ein dsh-Update ihn um, rückt die Nachricht erst vor, wenn diese Runde beendet ist. Subagent-Chats behalten die Reihenfolge von dsh.
301
306
  - **Projektgedächtnis** gehört zum ersten Ordner des Chats (dem Projektordner von dsh): Ein Chat, der seinen Ordner mit `cd` wechselt, behält das Gedächtnis seines ersten Projekts, und derselbe Ordner, über einen anderen Pfad zu denselben Dateien geöffnet, teilt es. Ein Chat friert seinen Gedächtnisteil beim Start ein, daher erscheint eine später gespeicherte Notiz ab dem nächsten Chat (`memory_recall` findet sie sofort). Die Prüfung behält nur, was das Modell behalten will: Sie kann einen Fakt übersehen oder einen falschen behalten. Prüfe sie in **Gedächtnis öffnen** und ändere sie dort, oder bearbeite die Dateien von Hand, während dsh geschlossen ist. **Gedächtnis öffnen** schickt die Notizen des gewählten Projekts und die globalen Notizen (alle Projekte, wenn du Alle Notizen wählst; höchstens etwa 60.000 Zeichen, der Rest wird nur gezählt und kann in dieser Anfrage nicht geändert werden) und deinen Text an das Standardmodell von dsh, nicht an das Modell des Chats. Eine Vorschau bleibt 30 Minuten und bis zum Neustart von dsh auf dem Mac; ändern eine Prüfung oder der Agent die Notizen in der Zwischenzeit, lehnt **Anwenden** ab und du holst eine neue Vorschau. **Anwenden** speichert alle Änderungen einer Vorschau oder keine: Lässt sich eine Änderung nicht speichern (zum Beispiel, weil MEMORY.md voll ist), bleiben die Notizen, wie sie waren, und der Grund wird angezeigt. Jede abgeschlossene Runde mit einer Nachricht von dir kostet einen Modellaufruf; ein fehlgeschlagener Aufruf liest dieselben Nachrichten nach der nächsten Runde erneut. Chats von Subagenten werden nicht geprüft. Die Idee und das Dateiformat stammen von [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus nutzt keinen Code daraus und liest oder schreibt nie das eigene Gedächtnis von DS Bot.
302
307
  - **Versionsverlauf des Gedächtnisses** behält die neuesten 50 Versionen jedes Gedächtnisses (jedes Projekt und das globale Gedächtnis); ältere werden gelöscht. Eine Version enthält das ganze Gedächtnis dieses Projekts, nicht eine Notiz. **Wiederherstellen** setzt alle Dateien dieser Version zurück (Themen eingeschlossen) und lehnt ab, wenn sich das Gedächtnis nach dem Öffnen der Version geändert hat; das Gedächtnis vor der Wiederherstellung wird eine neue Version, sodass du sie rückgängig machen kannst. Solange der Schalter aus ist, wird keine neue Version behalten und **Wiederherstellen** lehnt ab; behaltene Versionen bleiben. Versionen von vor dieser Funktion gibt es nicht: Der Verlauf beginnt mit dem ersten Speichern nach der Installation.
@@ -352,6 +357,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
352
357
 
353
358
  **Kann ich einen persönlichen Assistenten-Chat haben, der mich erinnert und meine anderen Chats verwaltet?** Ja, mit **Assistent** (standardmäßig an): Klicke in der linken Seitenleiste auf **Assistent**. Er legt Erinnerungen mit den geplanten Aufgaben von dsh an, sucht im Web, listet und liest deine Chats und sendet einem Chat eine Nachricht oder startet, stoppt oder archiviert einen Chat erst, nachdem du es genehmigt hast. Speichere dein Profil im Gedächtnis seines Projekts, Thema "profil".
354
359
 
360
+ **Kann der Assistent außerhalb meiner Chatliste bleiben und wie ein Bot arbeiten?** Ja. **Assistent getrennt von Chats** nimmt seinen Chat aus der Liste der Seitenleiste und zeigt seinen Zustand in der Zeile **Assistent** (orange, während er auf dich wartet). **Nur Nachrichten im Assistenten** blendet seine Arbeitsschritte aus. **Assistent immer frei** lässt ihn jeden längeren Schritt an einen Subagenten im Hintergrund geben, daher antwortet er sofort. **Chat-Neuigkeiten im Assistenten** (standardmäßig aus, verbraucht Tokens) lässt ihn dir Bescheid sagen, wenn ein anderer Chat fertig ist, fehlschlägt oder auf dich wartet.
361
+
355
362
  **Kann dsh meine Chats und Einstellungen sichern, so wie dsh-backup?** Ja: **Einstellungen → Composer Plus → Sicherung → Jetzt sichern**. Es schreibt dasselbe Archivformat in denselben Ordner (`~/Desktop/dsh-backups`). Daher erscheinen auch die Archive von dsh-backup und lassen sich wiederherstellen, und du kannst dsh-backup entfernen. Schalte **Automatische Sicherung** ein, um nach Zeitplan zu sichern.
356
363
 
357
364
  **dsh startet nicht mehr. Wie stelle ich eine Sicherung wieder her?** Öffne den Sicherungsordner (`~/Desktop/dsh-backups`) und doppelklicke auf `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Wähle `3) Restore a backup`, wähle eine Sicherung aus und tippe `RESTORE`. Das funktioniert ohne dsh.
@@ -506,6 +513,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/
506
513
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
514
  # Assistant: on by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
515
  SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
516
+ # Assistant welcome card: shows above the input on the first open of the assistant chat, goes with the switch and with the first message, not in other chats
517
+ PLAYWRIGHT=/path/to/playwright node test/browser-assistant-welcome.mjs /path/to/dsh/lib/bin.js
509
518
  ```
510
519
 
511
520
  ```sh
package/README.es.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de eso se encarga la app).
31
31
 
32
- > El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.24.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.25.0`.
33
33
 
34
34
  ## Funciones
35
35
 
@@ -75,7 +75,11 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
75
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> |
76
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> |
77
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> |
78
- | **Asistente** | <a id="feature-assistant"></a>Activado de forma predeterminada (desactívalo en **Configuración → Composer Plus**). Haz clic en **Asistente** en la barra lateral izquierda (justo debajo de **Tablero de tareas**): abre un chat permanente que usas como tu asistente personal, como un chat de ChatGPT o Grok. El primer clic crea la carpeta `~/Assistant`, la añade como el proyecto "Assistant" e inicia el chat con el modo de permisos workspace-write y el modelo predeterminado de dsh; cada clic posterior abre el mismo chat (uno archivado vuelve, uno eliminado se crea de nuevo). Pídele que te recuerde algo («recuérdame beber agua dentro de 2 minutos»): usa las tareas programadas de dsh, así que el recordatorio ejecuta el chat a esa hora, y Tether envía su notificación "Turn finished" cuando Conexión móvil está activada. Pídele que busque en la web o pregúntale por tus otros chats: puede listar los chats de todos los proyectos (en ejecución, esperándote o inactivos) y leer los mensajes más recientes de uno. También puede enviar un mensaje a un chat, iniciar un chat nuevo en un proyecto, detener un chat en ejecución o archivar uno: cada una de estas cuatro acciones muestra primero la tarjeta de aprobación de dsh (también en Tether), y no pasa nada hasta que haces clic en **Permitir una vez**. No tiene ninguna herramienta para eliminar. Solo este chat tiene estas herramientas y sus instrucciones breves; el texto que lee en una página web o en otro chat cuenta como datos, no como una orden. Guarda tu perfil en la memoria de este proyecto (**Memoria del proyecto**, tema "profil") en lugar de contárselo cada vez. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Captura: Asistente"></a> |
78
+ | **Asistente** | <a id="feature-assistant"></a>Activado de forma predeterminada (desactívalo en **Configuración → Composer Plus**). Haz clic en **Asistente** en la barra lateral izquierda (justo debajo de **Tablero de tareas**): abre un chat permanente que usas como tu asistente personal, como un chat de ChatGPT o Grok. El primer clic crea la carpeta `~/Assistant`, la añade como el proyecto "Assistant" e inicia el chat con el modo de permisos workspace-write y el modelo predeterminado de dsh; cada clic posterior abre el mismo chat (uno archivado vuelve, uno eliminado se crea de nuevo). Mientras el chat aún no tiene mensajes, una tarjeta corta sobre el campo de entrada explica qué hace el asistente y muestra tres peticiones de ejemplo; desaparece con tu primer mensaje. Pídele que te recuerde algo («recuérdame beber agua dentro de 2 minutos»): usa las tareas programadas de dsh, así que el recordatorio ejecuta el chat a esa hora, y Tether envía su notificación "Turn finished" cuando Conexión móvil está activada. Háblale como a un amigo que trabaja en segundo plano: una tarea que lleva más tiempo (una investigación, varios pasos) va a un subagente propio en segundo plano, y el chat dice en una línea qué ha iniciado y queda libre al instante. Abre un segundo tema mientras el primero sigue en ejecución: cada tema recibe su propio subagente, y cada resultado vuelve a este chat cuando está listo. Pídele que busque en la web o pregúntale por tus otros chats: puede listar los chats de todos los proyectos (en ejecución, esperándote o inactivos) y leer los mensajes más recientes de uno. También puede enviar un mensaje a un chat, iniciar un chat nuevo en un proyecto, detener un chat en ejecución o archivar uno: cada una de estas cuatro acciones muestra primero la tarjeta de aprobación de dsh (también en Tether), y no pasa nada hasta que haces clic en **Permitir una vez**. No tiene ninguna herramienta para eliminar. Solo este chat tiene estas herramientas y sus instrucciones breves; el texto que lee en una página web o en otro chat cuenta como datos, no como una orden. Guarda tu perfil en la memoria de este proyecto (**Memoria del proyecto**, tema "profil") en lugar de contárselo cada vez. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Captura: Asistente"></a> |
79
+ | **Asistente separado de los chats** | <a id="feature-assistantapart"></a>Activado de forma predeterminada (desactívalo en **Configuración → Composer Plus**). El chat del asistente sale de la lista de chats de la barra lateral izquierda, así que no está entre los chats de tus proyectos: ábrelo con **Asistente**. Su proyecto "Assistant" también sale mientras no tenga otro chat; la búsqueda de la barra lateral aún encuentra el chat. Un punto en la fila **Asistente** muestra el estado del asistente: trabajando (también mientras se ejecuta un tema en segundo plano), esperándote (naranja: una aprobación, una pregunta o la revisión de un plan) o nueva respuesta (verde). Mientras el chat del asistente está abierto, la fila **Asistente** aparece como abierta. Si lo desactivas, el chat vuelve a la lista y la fila no tiene punto. | <a href="assets/features/assistantApart.webp"><img src="assets/features/assistantApart.webp" width="160" alt="Captura: Asistente separado de los chats"></a> |
80
+ | **Solo mensajes en el Asistente** | <a id="feature-assistantchatview"></a>Activado de forma predeterminada (desactívalo en **Configuración → Composer Plus**). El chat del asistente se ve como un chat con un bot: se ocultan las llamadas a herramientas, el pensamiento, los grupos de pasos y la fila "Completed in", y ves tus mensajes, sus respuestas, los errores y las tarjetas de aprobación. Los demás chats no cambian. Desactívalo para volver a ver los pasos de trabajo del asistente. | <a href="assets/features/assistantChatView.webp"><img src="assets/features/assistantChatView.webp" width="160" alt="Captura: Solo mensajes en el Asistente"></a> |
81
+ | **Asistente siempre libre** | <a id="feature-assistantfree"></a>Activado de forma predeterminada (desactívalo en **Configuración → Composer Plus**). El chat del asistente responde al instante y nunca está ocupado con un trabajo largo: solo llama a sus propias herramientas cortas (tus chats, recordatorios, memoria y subagentes). Cualquier otro paso, como una búsqueda web, una página web, un archivo o un comando, va a un subagente en segundo plano; el chat dice en una línea qué ha iniciado y queda libre para tu siguiente mensaje, y el resultado vuelve al chat cuando está listo. Sus subagentes trabajan como siempre. Cuando el chat del asistente no tiene la herramienta de subagentes (por su modo de permisos o su perfil), la regla no hace nada y **Configuración** lo indica. | <a href="assets/features/assistantFree.webp"><img src="assets/features/assistantFree.webp" width="160" alt="Captura: Asistente siempre libre"></a> |
82
+ | **Avisos de chats en el Asistente** | <a id="feature-assistantnotify"></a>Desactivado de forma predeterminada: cada aviso es un turno del modelo en el chat del asistente, así que usa tokens. Actívalo en **Configuración → Composer Plus**. Entonces el asistente te avisa, en su propio chat, cuando otro chat termina un turno largo (1 minuto o más), falla o te espera (una aprobación, una pregunta o la revisión de un plan) durante 30 segundos: una línea corta por chat, con el título y el proyecto del chat. Los avisos se reúnen durante 15 segundos y llegan como máximo cada 2 minutos; mientras el asistente trabaja, esperan a que termine ese turno. Un chat que detuviste, un turno corto y el propio chat del asistente no generan avisos. Con **Conexión móvil (iPhone)** activada, Tether recibe la notificación habitual "Turn finished" del asistente. | <a href="assets/features/assistantNotify.webp"><img src="assets/features/assistantNotify.webp" width="160" alt="Captura: Avisos de chats en el Asistente"></a> |
79
83
  | **Memoria del proyecto** | <a id="feature-projectmemory"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. Cada carpeta de proyecto tiene su propia memoria, que los chats posteriores de ese proyecto leen, como DS Bot guarda una por Bot. Después de cada turno terminado, una llamada al modelo del chat lee los mensajes nuevos (no los revertidos), guarda tus preferencias, decisiones y datos duraderos como notas breves, y cambia o elimina las antiguas. El agente también puede guardar, eliminar y buscar notas por sí mismo (`memory_remember`, `memory_forget`, `memory_recall`). Una nota también puede ser global: todos los proyectos la leen. Un chat nuevo recibe las notas en su prompt de sistema; una nota guardada después aparece desde el chat siguiente. Los archivos son Markdown en la carpeta de inicio de dsh (`storages/dsh-composer-plus/memory/`), nunca en la carpeta del proyecto. **Abrir memoria**, en la misma fila, muestra todas las notas guardadas agrupadas por proyecto (y la memoria global), con un filtro. Escribe con tus palabras qué cambiar (por ejemplo "cambié yarn por pnpm") y pulsa **Vista previa de los cambios**: el modelo predeterminado de dsh propone los cambios y solo **Aplicar** los guarda. En Tether: menú del título del chat → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura: Memoria del proyecto"></a> |
80
84
  | **Historial de versiones de la memoria** | <a id="feature-memoryhistory"></a>Activado por defecto mientras **Memoria del proyecto** está activada. Antes de cada guardado de la memoria (el agente, la revisión tras un turno, **Abrir memoria**), se guarda una copia de las notas tal como estaban. En **Abrir memoria**, selecciona un proyecto o **Memoria global** y luego **Historial**: las versiones por fecha y quién cambió la memoria después de cada una. Selecciona una versión para ver como diff lo que cambia una restauración y luego **Restaurar**. Las notas anteriores a una restauración también se guardan, así que puedes deshacerla. Se conservan las 50 versiones más recientes de cada memoria. En Tether: menú del título del chat → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Captura: Historial de versiones de la memoria"></a> |
81
85
  | **Exportar la memoria a AGENTS.md** | <a id="feature-memoryexport"></a>En **Abrir memoria**, selecciona un proyecto y luego **Exportar a AGENTS.md**: las notas de ese proyecto van a una sección marcada de `AGENTS.md` en su carpeta, para que puedas confirmarlas en git y compartirlas con tu equipo y otras herramientas de agentes. Primero ves el cambio como diff; solo **Escribir AGENTS.md** lo guarda. La siguiente exportación sustituye solo esa sección. La memoria global, las fuentes y las fechas no se incluyen. En Tether: menú del título del chat → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Captura: Exportar la memoria a AGENTS.md"></a> |
@@ -104,7 +108,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
104
108
  | **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> |
105
109
  | **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> |
106
110
  | **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> |
107
- | **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 selector se queda en el mismo lugar y muestra **Volver a este Mac**: haz clic en él para volver. Si tienes más de un equipo, el clic abre el menú, donde eliges **Este Mac** u otro equipo. 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> |
111
+ | **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 selector se queda en el mismo lugar y muestra **Volver a este Mac**: haz clic en él para volver. Si tienes un solo equipo, un clic en el selector cambia al instante entre este Mac y ese equipo (sin menú); haz clic derecho en el selector para abrir el menú completo (**Añadir un equipo…**). Si tienes más de un equipo, el clic abre el menú, donde eliges **Este Mac** u otro equipo. 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> |
108
112
  | **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> |
109
113
  | **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> |
110
114
  | **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> |
@@ -199,7 +203,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
199
203
  - **Continuar en un chat nuevo:** no se ejecuta nada hasta que haces clic. Entonces la parte Host envía el chat (tal como lo lee la Comprobación del objetivo: sin razonamiento ni pasos revertidos) al modelo del propio chat y muestra la nota de traspaso; solo **Iniciar chat nuevo** crea un chat nuevo. No se escribe nada en el proyecto.
200
204
  - **Desglose del contexto:** la parte Host solo lee el registro del chat; ninguna llamada al modelo, ningún archivo del proyecto.
201
205
  - **Tablero de tareas:** el tablero muestra los propios chats de dsh a partir de las propias listas de dsh en esta ventana; no añade datos de chat propios. **Nueva tarea** abre el propio chat nuevo de dsh, y tú escribes el primer mensaje en el editor de dsh, así que las aprobaciones, el sandbox y el modelo del chat se aplican como siempre. La parte Host guarda el primer mensaje de ese chat como el prompt de la tarjeta y lo envía (sus primeros 4.000 caracteres, nada más) al modelo de ese chat en una petición más, sin herramientas, para obtener hasta 3 etiquetas. El prompt, las etiquetas y la hora de inicio de cada tarea se guardan en `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (archivo solo para el propietario, las 2.000 más recientes), junto con los ID de los chats que quitaste del tablero con **×** o **Limpiar todo** (los 5.000 más recientes); el interruptor está en `board-switch.json`, junto a él. No se escribe nada en ninguna carpeta de proyecto. **Responder** envía tu respuesta a la propia solicitud pendiente de dsh, igual que la tarjeta del propio chat. La antigua lista de tareas de versiones anteriores (`board.json`) se queda en el disco tal como estaba y no se lee. **Progreso al pasar el cursor** lee el registro del chat en este Mac. Con **Rápido (sin IA)** (el predeterminado), no se envía nada. Con **Resumen con IA**, mientras se ve el cuadro de progreso de una tarjeta en curso (o mientras el tablero de Tether está abierto, para hasta 8 tarjetas en curso), la parte Host envía la parte más reciente de ese chat (como máximo unos 6.000 caracteres: tus mensajes, las respuestas de texto del agente, sus llamadas a herramientas y el final de sus resultados; sin razonamiento ni mensajes revertidos) al modelo del chat, en una sola solicitud sin herramientas. Solo vuelve a enviar cuando el chat avanzó, como máximo una vez cada 20 segundos por chat. La nota solo se guarda en memoria; el ajuste está en `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (archivo solo para el propietario).
202
- - **Asistente:** el chat del asistente es un chat normal de dsh en `~/Assistant`; sus llamadas al modelo van al modelo predeterminado de dsh, como en cualquier chat. Sus herramientas leen los registros de tus otros chats en este Mac (títulos, proyectos, estado y, con chat_read, sus mensajes más recientes) y se los dan a ese modelo solo cuando llama a una herramienta. Enviar, iniciar, detener y archivar un chat esperan cada uno tu aprobación. El ID del chat se guarda en `$DSH_HOME/storages/dsh-composer-plus/assistant.json` y el interruptor en `assistant-switch.json` (archivos solo para el propietario). Los recordatorios y las automatizaciones son las propias tareas programadas de dsh. Nada sale de este Mac, excepto las peticiones al modelo y las búsquedas web que hace el chat.
206
+ - **Asistente:** el chat del asistente es un chat normal de dsh en `~/Assistant`; sus llamadas al modelo van al modelo predeterminado de dsh, como en cualquier chat. Sus herramientas leen los registros de tus otros chats en este Mac (títulos, proyectos, estado y, con chat_read, sus mensajes más recientes) y se los dan a ese modelo solo cuando llama a una herramienta. Enviar, iniciar, detener y archivar un chat esperan cada uno tu aprobación. El ID del chat se guarda en `$DSH_HOME/storages/dsh-composer-plus/assistant.json` y el interruptor en `assistant-switch.json` (archivos solo para el propietario). Los recordatorios y las automatizaciones son las propias tareas programadas de dsh. Nada sale de este Mac, excepto las peticiones al modelo y las búsquedas web que hace el chat. Los interruptores del asistente como bot guardan su estado en `assistant-free.json` y `assistant-notify.json` (archivos solo para el propietario). **Avisos de chats en el Asistente** pone en el chat del asistente una línea corta sobre otro chat (su título, su proyecto y como máximo 300 caracteres de su última respuesta o error), así que ese texto también va al modelo del asistente; los avisos solo esperan en memoria.
203
207
  - **Archivos protegidos:** la lista y el interruptor están en `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (archivo solo para el propietario). La comprobación solo lee la ruta de cada llamada a una herramienta de archivos (y su ruta real), nunca el archivo.
204
208
  - **Comandos bloqueados:** las reglas y el interruptor están en `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (archivo solo para el propietario). La comprobación solo lee el texto del comando de cada llamada a `bash` y `pwsh`; no ejecuta nada y no envía nada.
205
209
  - **Entrada secreta:** el valor va de la tarjeta (o de Tether, a través del gateway, que no registra el cuerpo de las solicitudes) al Host solo en la solicitud de respuesta. El Host lo escribe en `$DSH_HOME/storages/dsh-composer-plus/secrets/<nombre aleatorio>` (carpeta 0700, archivo 0600); nada va al proyecto, al registro del chat ni al resultado de la herramienta. El Host guarda el valor en memoria para reemplazarlo por `[secret]` en los resultados de herramienta posteriores de ese chat. El archivo y esa copia se borran al terminar el turno del chat y al iniciar dsh. El interruptor está en `secrets.json`, a su lado. Un comando que el agente ejecuta con el archivo puede enviar el valor adonde ese comando lo envíe: ese es su propósito.
@@ -226,7 +230,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
226
230
  - **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).
227
231
  - **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.
228
232
  - **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).
229
- - **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.24.1`); consulta la nota de instalación de más arriba.
233
+ - **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.25.0`); consulta la nota de instalación de más arriba.
230
234
  - **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.
231
235
  - **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.
232
236
  - **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.
@@ -260,7 +264,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
260
264
  - **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.
261
265
  - **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.
262
266
  - **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í.
263
- - **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). Si la página del otro Mac no tiene su propio selector (allí hay un Composer Plus anterior a 1.23.0), el selector de este Mac aparece sobre esa página en el mismo lugar. Con 1.23.0 allí, el selector muestra el nombre de ese Mac: elige **Este Mac** en su menú para volver. 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.
267
+ - **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). Si la página del otro Mac no tiene su propio selector (allí hay un Composer Plus anterior a 1.23.0), el selector de este Mac aparece sobre esa página en el mismo lugar. Con 1.23.0 allí, el selector muestra el nombre de ese Mac: elige **Este Mac** en su menú para volver. Cada equipo que abriste guarda su página en memoria hasta que desactives la función o reinicies dsh. Si el equipo no respondió (estaba en reposo o Tailscale estaba apagado), su página no se guarda: elígelo de nuevo y se vuelve a cargar. 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. El cambio con un clic solo cuenta los equipos emparejados y accesibles (un equipo que debe volver a emparejarse no cuenta); con un solo equipo así, **Añadir un equipo…** está en el menú del clic derecho (en una pantalla táctil: mantén pulsado) o en **Configuración → Composer Plus → Equipos remotos**.
264
268
  - 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.
265
269
  - **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.
266
270
  - **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).
@@ -296,7 +300,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
296
300
  - **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.
297
301
  - **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.
298
302
  - **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**.
299
- - **Asistente** tiene un solo chat para todas las ventanas de este Mac. Se ejecuta con el modo de permisos workspace-write: solo escribe archivos en `~/Assistant`, y un comando fuera de esa carpeta pregunta primero. Cuando cambias el chat a un modo sin aprobaciones (Acceso completo), dsh rechaza cada aprobación, así que el asistente no puede enviar, iniciar, detener ni archivar un chat. La tarjeta de aprobación solo protege las seis herramientas: un comando de shell del asistente aún puede llegar a la red, como en cualquier chat con ese modo. En dsh 0.2.0 y 0.2.1, las herramientas de programación de dsh solo ven los recordatorios del propio chat del asistente, no las automatizaciones de otros chats; desde dsh 0.2.2, listan y cambian todas las tareas programadas. chats_list deja fuera los chats archivados, vacíos y de subagentes, y el propio chat del asistente; «esperándote» significa una aprobación, una pregunta o una revisión de plan abierta en un chat en ejecución. chat_read da los mensajes del usuario y las respuestas del agente (sin la salida de las herramientas), como máximo 50 mensajes y unos 24.000 caracteres. chat_archive rechaza un chat que aún se ejecuta o que tiene recordatorios activos. Un texto que el modelo lee aún puede engañarlo: la tarjeta de aprobación es la última comprobación, así que léela antes de hacer clic en **Permitir una vez**.
303
+ - **Asistente** tiene un solo chat para todas las ventanas de este Mac. Se ejecuta con el modo de permisos workspace-write: solo escribe archivos en `~/Assistant`, y un comando fuera de esa carpeta pregunta primero. Cuando cambias el chat a un modo sin aprobaciones (Acceso completo), dsh rechaza cada aprobación, así que el asistente no puede enviar, iniciar, detener ni archivar un chat. La tarjeta de aprobación solo protege las seis herramientas: un comando de shell del asistente aún puede llegar a la red, como en cualquier chat con ese modo. En dsh 0.2.0 y 0.2.1, las herramientas de programación de dsh solo ven los recordatorios del propio chat del asistente, no las automatizaciones de otros chats; desde dsh 0.2.2, listan y cambian todas las tareas programadas. chats_list deja fuera los chats archivados, vacíos y de subagentes, y el propio chat del asistente; «esperándote» significa una aprobación, una pregunta o una revisión de plan abierta en un chat en ejecución. chat_read da los mensajes del usuario y las respuestas del agente (sin la salida de las herramientas), como máximo 50 mensajes y unos 24.000 caracteres. chat_archive rechaza un chat que aún se ejecuta o que tiene recordatorios activos. Un texto que el modelo lee aún puede engañarlo: la tarjeta de aprobación es la última comprobación, así que léela antes de hacer clic en **Permitir una vez**. Los temas en paralelo usan la herramienta de subagentes de dsh: un perfil o un modo de permisos sin ella mantiene el comportamiento anterior (un tema a la vez; el siguiente mensaje espera en la cola o guía el turno en ejecución). El modelo decide qué cuenta como una tarea larga, así que una pregunta corta aún puede ocupar un turno. El subagente de cada tema se ejecuta con sus propios tokens; cuando dsh se reinicia, un tema en ejecución se detiene (su resultado no vuelve). Un resultado vuelve como un nuevo turno del chat del asistente, así que espera mientras escribes en medio de un turno.
304
+ - **Asistente separado de los chats** y **Solo mensajes en el Asistente** ocultan las filas propias de dsh con una regla de estilo, que las encuentra por el marcado de la barra lateral y del chat de dsh (`data-row-key`, `data-chat-flow-kind`): cuando una actualización de dsh cambia ese marcado, el chat del asistente vuelve a aparecer en la lista, o sus pasos de trabajo vuelven a aparecer. Las filas se ocultan, no se eliminan: la navegación con el teclado de dsh en la barra lateral aún puede llegar a una fila oculta. **Asistente siempre libre** rechaza cada llamada a herramienta del chat del asistente que no sea una de sus herramientas cortas; entonces el modelo da el paso a un subagente, pero puede intentar primero la llamada rechazada, lo que cuesta un paso del modelo. Mientras una tarjeta de aprobación te espera, el chat del asistente sigue contando como ocupado. Cuando su solicitud más reciente no tiene la herramienta de subagentes (un modo de permisos o un perfil sin ella), la regla no hace nada. **Avisos de chats en el Asistente** inicia un turno del modelo en el chat del asistente por cada grupo de avisos, así que usa tokens; con **Conexión móvil (iPhone)** activada, tu teléfono puede recibir dos notificaciones por un chat terminado (la del propio chat y la del asistente). Los avisos que esperan se pierden cuando dsh se reinicia. Solo ve los chats de este Mac.
300
305
  - **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.
301
306
  - **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.
302
307
  - **Historial de versiones de la memoria** conserva las 50 versiones más recientes de cada memoria (cada proyecto y la memoria global); las más antiguas se borran. Una versión guarda toda la memoria de ese proyecto, no una nota. **Restaurar** devuelve todos los archivos de esa versión (temas incluidos) y se niega si la memoria cambió después de abrir la versión; la memoria anterior a la restauración pasa a ser una versión nueva, así que puedes deshacerla. Con el interruptor desactivado no se guardan versiones nuevas y **Restaurar** se niega; las versiones guardadas se quedan. No hay versiones de antes de esta función: el historial empieza con el primer guardado tras instalarla.
@@ -352,6 +357,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
352
357
 
353
358
  **¿Puedo tener un chat de asistente personal que me haga recordatorios y gestione mis otros chats?** Sí, con **Asistente** (activado de forma predeterminada): haz clic en **Asistente** en la barra lateral izquierda. Crea recordatorios con las tareas programadas de dsh, busca en la web, lista y lee tus chats, y envía un mensaje a un chat o inicia, detiene o archiva uno solo después de que lo apruebes. Guarda tu perfil en la memoria de su proyecto, tema "profil".
354
359
 
360
+ **¿Puede el asistente quedar fuera de mi lista de chats y funcionar como un bot?** Sí. **Asistente separado de los chats** saca su chat de la lista de la barra lateral y muestra su estado en la fila **Asistente** (naranja mientras te espera). **Solo mensajes en el Asistente** oculta sus pasos de trabajo. **Asistente siempre libre** hace que dé cada paso más largo a un subagente en segundo plano, así que responde al instante. **Avisos de chats en el Asistente** (desactivado de forma predeterminada, usa tokens) hace que te avise cuando otro chat termina, falla o te espera.
361
+
355
362
  **¿Puede dsh hacer copias de seguridad de mis chats y ajustes, como dsh-backup?** Sí: **Configuración → Composer Plus → Copia de seguridad → Hacer copia ahora**. Escribe el mismo formato de archivo comprimido en la misma carpeta (`~/Desktop/dsh-backups`), así que los archivos comprimidos de dsh-backup también aparecen y se pueden restaurar, y puedes desinstalar dsh-backup. Activa **Copia de seguridad automática** para hacer copias según un horario.
356
363
 
357
364
  **dsh ya no se inicia. ¿Cómo restauro una copia de seguridad?** Abre la carpeta de copias de seguridad (`~/Desktop/dsh-backups`) y haz doble clic en `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Elige `3) Restore a backup`, selecciona una y escribe `RESTORE`. Funciona sin dsh.
@@ -506,6 +513,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/
506
513
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
514
  # Assistant: on by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
515
  SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
516
+ # Assistant welcome card: shows above the input on the first open of the assistant chat, goes with the switch and with the first message, not in other chats
517
+ PLAYWRIGHT=/path/to/playwright node test/browser-assistant-welcome.mjs /path/to/dsh/lib/bin.js
509
518
  ```
510
519
 
511
520
  ```sh