dsh-composer-plus 1.17.0 → 1.19.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
@@ -14,7 +14,7 @@ Komfortfunktionen im Stil von Codex für die Desktop- und Weboberfläche von [De
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness mit Composer Plus: Das laufende Projekt zeigt einen Spinner in der Seitenleiste, und der Änderungsbereich zeigt einen git-Diff"></p>
16
16
 
17
- Inoffizielles Community-Plugin. Die einzigen Netzwerkaufrufe sind die Update-Prüfung (GitHub-Releases und die npm-Registry). Schalte **Automatische Updates** aus, um sie beim Start zu stoppen. **Funktionsideen** ruft das eigene Modell deines Chats nur auf, wenn du auf **Funktionen vorschlagen** klickst. **Vorhersage der nächsten Nachricht** (standardmäßig an) ruft nach jeder beendeten Runde einmal das in den Einstellungen gewählte Modell auf (den dsh-Standard, wenn du kein anderes wählst), ohne Klick. Schalte sie unter **Einstellungen → Composer Plus** aus, um diese Aufrufe zu stoppen. **Beim Tippen vervollständigen** (standardmäßig aus) ruft bei jeder Pause beim Tippen das dafür gewählte Modell auf (standardmäßig das der Vorhersage), nachdem du die Funktion eingeschaltet hast. **Prompt verbessern** ruft ein Modell nur auf, wenn du auf seinen Zauberstab klickst. **Zielprüfung** (standardmäßig an) ruft jedes Mal einmal ein Modell auf, wenn der Agent ein `/goal` in einem automatischen Durchlauf als abgeschlossen markiert. **Mobile Verbindung** (standardmäßig aus) nimmt iPhone-Verbindungen aus deinem lokalen Netz oder Tailnet erst an, wenn du sie einschaltest.
17
+ Inoffizielles Community-Plugin. Die einzigen Netzwerkaufrufe sind die Update-Prüfung (GitHub-Releases und die npm-Registry). Schalte **Automatische Updates** aus, um sie beim Start zu stoppen. **Funktionsideen** ruft das eigene Modell deines Chats nur auf, wenn du auf **Funktionen vorschlagen** klickst. **Vorhersage der nächsten Nachricht** (standardmäßig an) ruft nach jeder beendeten Runde einmal das in den Einstellungen gewählte Modell auf (den dsh-Standard, wenn du kein anderes wählst), ohne Klick. Schalte sie unter **Einstellungen → Composer Plus** aus, um diese Aufrufe zu stoppen. **Beim Tippen vervollständigen** (standardmäßig aus) ruft bei jeder Pause beim Tippen das dafür gewählte Modell auf (standardmäßig das der Vorhersage), nachdem du die Funktion eingeschaltet hast. **Prompt verbessern** ruft ein Modell nur auf, wenn du auf seinen Zauberstab klickst. **Aufgabentafel** ruft für jede Aufgabe, die du auf der Tafel startest, einmal das Modell des neuen Chats für die Schlagwörter auf. **Zielprüfung** (standardmäßig an) ruft jedes Mal einmal ein Modell auf, wenn der Agent ein `/goal` in einem automatischen Durchlauf als abgeschlossen markiert. **Mobile Verbindung** (standardmäßig aus) nimmt iPhone-Verbindungen aus deinem lokalen Netz oder Tailnet erst an, wenn du sie einschaltest.
18
18
 
19
19
  ## Installation
20
20
 
@@ -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.17.0`.
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.19.0`.
33
33
 
34
34
  ## Funktionen
35
35
 
@@ -68,11 +68,14 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
68
68
  | **Zielprüfung** | <a id="feature-goalcheck"></a>Starte ein Ziel mit `/goal`. Wenn der Agent das Ziel in einem automatischen Durchlauf als abgeschlossen markiert, schließt sich das Ziel erst nach zwei Prüfungen. Zuerst läuft der Testbefehl des Projekts im Ordner des Chats, im Sandbox-Modus des Chats. Der Befehl ist dein eigener oder der, der in `package.json`, `Makefile`, `Cargo.toml`, `go.mod` oder pytest gefunden wird. Wenn der neueste eigene Schritt des Agenten ein erfolgreicher Lauf dieses Tests war, läuft er nicht noch einmal. Dann liest ein unabhängiger Modellaufruf ohne Werkzeuge das Ziel, diesen Chat, `git status` und das Testergebnis. Das Modell antwortet mit einer Nachweistabelle: Jeder Teil des Ziels ist bestätigt, falsch oder ungeklärt, mit dem Nachweis und der Korrektur; das Ziel schließt sich erst, wenn jeder Teil bestätigt ist. Schlägt eine Prüfung fehl, bleibt das Ziel aktiv, der Agent liest jeden offenen Teil mit seinem Nachweis und seiner Korrektur, und der nächste Durchlauf geht weiter. Eine Zeile unter der Zielleiste (**Zielprüfung**) zeigt den Test, das letzte Ergebnis und wie viele Teile bestätigt sind (fahre mit der Maus darüber, um die Tabelle zu sehen). **Bearbeiten** legt deinen eigenen Testbefehl und ein Zeit- oder Token-Limit fest; über dem Limit wird das Ziel blockiert. Das Token-Limit zählt auch die Subagents des Chats. **Jetzt ausführen** führt die Prüfung aus, ohne das Ziel zu schließen. Die Funktion hat ein eigenes Menü **Modell** in den Einstellungen (Standard: **Wie das Modell des Chats**). Wenn du das Ziel selbst abschließt, wird nichts geprüft. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Screenshot: Zielprüfung"></a> |
69
69
  | **In einem neuen Chat fortsetzen** | <a id="feature-handoffchat"></a>Rechtsklick auf einen Chat in der Seitenleiste (oder sein Menü **…** öffnen) → **In einem neuen Chat fortsetzen…**. Ein Aufruf an das eigene Modell des Chats schreibt aus dem, was der Chat zeigt, eine Übergabenotiz: Aufgabe, Ergebnisse, Erledigt, Entscheidungen, Offene Punkte und Nächster Schritt (Tool-Aufrufe und ihre Ergebnisse sind die Belege; Schritte, die du zurückgenommen hast, werden weggelassen). Die Notiz öffnet sich in einem Dialog: Lies und bearbeite sie. **Neu schreiben** schreibt eine neue Notiz. **Neuen Chat starten** (oder `Cmd/Ctrl+Enter`) öffnet einen neuen Chat im selben Projekt, mit der Notiz und einem Link zum alten Chat als erster Nachricht; der alte Chat bleibt, wie er ist. Nutze die Funktion, wenn ein langer Chat voll oder langsam ist, oder um morgen weiterzumachen. Nichts wird in das Projekt geschrieben. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Screenshot: In einem neuen Chat fortsetzen"></a> |
70
70
  | **Kontextaufschlüsselung** | <a id="feature-contextbreakdown"></a>Rechte Seitenleiste → `+` → **Kontext**. Die Seite zeigt, was den Modellkontext des geöffneten Chats gerade füllt und wie viel vom Kontextfenster belegt ist: System-Prompt, Projektanweisungen (AGENTS.md), Skills, deine Nachrichten, Agent-Antworten und Tool-Aufrufe, Tool-Ergebnisse (nach Tool), MCP-Ergebnisse (nach Server), Tool-Definitionen, die Komprimierungszusammenfassung und weitere Kontexthinweise, jeweils mit Tokens und Anteil. Klicke auf einen Teil, um seine Tools oder Server zu sehen. Die Seite liest nur das Chatprotokoll, nach `/compact` und Rücknahmen, und ruft kein Modell auf; sie liest nach jeder Runde und mit **Aktualisieren** neu. Nutze sie, um zu sehen, warum ein Chat langsam oder voll ist, zum Beispiel wegen eines großen MCP-Tool-Ergebnisses oder vieler Tool-Definitionen. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Screenshot: Kontextaufschlüsselung"></a> |
71
+ | **Geplante Schritte** | <a id="feature-plannedsteps"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Der Agent bekommt das Tool `plan_next_steps`: In derselben Nachricht wie ein Befehl kann er die nächsten Befehle mit den genauen Argumenten und einer Bedingung planen, etwa „führe `npm test` aus, wenn der Build gelingt“. Erfüllt das Ergebnis die Bedingung, führt Composer Plus den nächsten Schritt selbst aus, ohne neuen Modellaufruf, sodass ein langer Chat weniger Tokens verbraucht. Der Schritt erscheint im Chat als kurze Zeile „Composer Plus · Planned steps: ran `test` … without a model call“, danach folgen sein Tool-Aufruf und sein Ergebnis. Nur Schritte mit `bash`, `read`, `grep` und `glob`; Freigaben, Sandbox und Geschützte Dateien gelten für jeden Schritt wie gewohnt. Das Modell antwortet wieder, wenn eine Bedingung nicht erfüllt ist, wenn zwei Schritte gleichzeitig bereit sind, nach dem letzten Schritt und wenn du eine Nachricht sendest. Die Idee stammt aus HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Screenshot: Geplante Schritte"></a> |
71
72
  | **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> |
73
+ | **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> |
74
+ | **Aufgabentafel** | <a id="feature-taskboard"></a>Linke Seitenleiste → **Aufgabentafel**. 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 steht in **Fertig** (grün, bis du ihn öffnest). Wähle links ein Projekt oder **Alle Projekte**; der Ordner eines Branches pro Chat zählt zu seinem Projekt. **Neue Aufgabe** (oder `n`) braucht nur einen Prompt: `Enter` startet einen neuen Chat im Projekt, die Karte erscheint in **Zu erledigen**, dsh benennt den Chat, und das Modell des Chats schreibt bis zu 3 Schlagwörter. Klicke auf eine Karte, um ihren Chat zu öffnen. Klicke auf einer orangen Karte auf **Antworten**, um direkt auf der Tafel zu antworten: **Ablehnen** oder **Einmal zulassen**, **Genehmigen** oder **Änderungen anfordern** bei einem Plan, oder die Optionen und dein eigener Text bei einer Frage. **Beendete ausblenden** blendet **Fertig** auf diesem Gerät aus. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Screenshot: Aufgabentafel"></a> |
72
75
  | **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> |
73
76
  | **Für diesen Chat zulassen** | <a id="feature-allowforchat"></a>Wenn die automatische Prüfung dich fragt, bekommt die Genehmigungskarte **Für diesen Chat zulassen**: Dasselbe Tool ist im selben Chat ab dann erlaubt, mit beliebigen Argumenten, bis das Zeitlimit abläuft (standardmäßig 1 Stunde; wähle es unter **Einstellungen → Composer Plus → Für diesen Chat zulassen**). Danach fragt der Agent wieder. Ein Chip in der Kopfzeile listet die Freigaben mit ihrer Endzeit auf und widerruft sie. Freigaben bleiben nach einem Neustart erhalten. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Screenshot: Für diesen Chat zulassen"></a> |
74
77
  | **Projektstatus** | <a id="feature-projectstatus"></a>Eine Projektzeile in der Seitenleiste zeigt dieselbe Markierung (Spinner / wartet / fertig) wie ihre Chats. So zeigt auch ein eingeklapptes Projekt, dass ein Chat darin arbeitet oder dich braucht. Ein Chat, der auf dich wartet, kommt zuerst, dann ein fertiger Chat, den du noch nicht geöffnet hast (der grüne Punkt, auch während ein anderer Chat noch läuft), dann der Spinner. Fahre mit der Maus darüber, um Details zu sehen. In der Ansicht **Arbeitsbereichsbaum** zeigt die Zeile eines übergeordneten Ordners auch die Chats jedes Projekts darin (zum Beispiel jedes Branch-Ordners in `.worktrees/`), auch wenn der Ordner eingeklappt ist. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Projektstatus"></a> |
75
- | **Git-Branch in Chatzeilen** | <a id="feature-sessionbranch"></a>Jede Chatzeile in der Seitenleiste zeigt ein kleines graues Etikett mit dem git-Branch, auf dem der Projektordner des Chats in dessen letzter Runde war (zum Beispiel `main` oder `feature/login`; ein losgelöster HEAD hat keinen Branch und zeigt kein Etikett). Zwei Chats eines Projekts auf verschiedenen Branches sehen nicht mehr gleich aus, und du siehst sofort, wenn du einen Chat auf dem falschen Branch fortsetzen willst. Fahre mit der Maus über das Etikett, um den vollen Namen zu sehen. Die Host-Hälfte liest den Branch (`git branch --show-current`, nur lesend), wenn eine Runde beginnt und wenn sie endet; ein Chat ohne Runde seit der Installation oder ein Ordner, der kein git-Repository ist, zeigt kein Etikett. Wenn die Projektzeile über dem Chat denselben Namen wie der Branch hat (zum Beispiel ein Ordner von „Ein Branch pro Chat“), zeigt die Chatzeile kein Etikett, aber „In einer Liste“ zeigt es weiterhin. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Screenshot: Git-Branch in Chatzeilen"></a> |
78
+ | **Git-Branch in Chatzeilen** | <a id="feature-sessionbranch"></a>In der Ansicht „In einer Liste“ der Seitenleiste zeigt jede Chatzeile ein kleines graues Etikett mit dem git-Branch, auf dem der Projektordner des Chats in dessen letzter Runde war (zum Beispiel `main` oder `feature/login`; ein losgelöster HEAD hat keinen Branch und zeigt kein Etikett). Zwei Chats eines Projekts auf verschiedenen Branches sehen nicht mehr gleich aus, und du siehst sofort, wenn du einen Chat auf dem falschen Branch fortsetzen willst. Fahre mit der Maus über das Etikett, um den vollen Namen zu sehen. Die Host-Hälfte liest den Branch (`git branch --show-current`, nur lesend), wenn eine Runde beginnt und wenn sie endet; ein Chat ohne Runde seit der Installation oder ein Ordner, der kein git-Repository ist, zeigt kein Etikett. In „Arbeitsbereich“ und „Arbeitsbereichsbaum“ zeigt keine Chatzeile das Etikett, weil der Chat schon unter seiner Projektzeile steht. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Screenshot: Git-Branch in Chatzeilen"></a> |
76
79
  | **Alle als gelesen markieren** | <a id="feature-markprojectread"></a>Klicke in der Seitenleiste auf die Schaltfläche **…** eines Projekts → **Alle als gelesen markieren**. Bei allen Chats in diesem Projekt verschwindet sofort der grüne Punkt für ungelesene Chats. Andere Projekte behalten ihre Punkte. Der Eintrag ist ausgegraut (**Keine ungelesenen Chats**), wenn das Projekt keine hat. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Screenshot: Alle als gelesen markieren"></a> |
77
80
  | **Aktive Projekte zuerst** | <a id="feature-activeprojectsfirst"></a>Wenn ein Chat zu laufen beginnt oder dich braucht, rückt sein Projekt mit der eigenen Zeilenanimation von dsh an den Anfang der Seitenleiste (dieselbe Bewegung wie beim Hinziehen von Hand). Fertige Projekte bleiben, wo sie sind; ziehe sie wie gewohnt an eine beliebige Stelle. Die Verschiebungen werden in der Projektreihenfolge von dsh gespeichert. Wenn du die Funktion ausschaltest, bleibt die aktuelle Reihenfolge also erhalten. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Aktive Projekte zuerst"></a> |
78
81
  | **Filter für aktuelle Projekte** | <a id="feature-recentprojects"></a>Seitenleiste → Ansichtsoptionen (Schieberegler-Symbol) → **In den letzten 2 Stunden aktiv**. Solange diese Option ausgewählt ist, zeigt die Seitenleiste nur Projekte mit einem Chat, der in den letzten 2 Stunden aktiv war. Das ist ein Chat, der in dieser Zeit aktualisiert wurde, ein laufender oder wartender Chat, der geöffnete Chat oder ein fertiger Chat, den du noch nicht geöffnet hast (der grüne „Fertig“-Punkt von dsh), auch nach den 2 Stunden. Projekte ohne einen solchen Chat sind ausgeblendet, auch neue und leere Projekte. In der Ansicht **Arbeitsbereichsbaum** bleibt ein übergeordneter Ordner sichtbar, solange ein Projekt darin aktiv ist, und Chats, die in den letzten 2 Stunden nicht aktiv waren, sind ebenfalls ausgeblendet, sodass nur die aktuellen Chats sichtbar sind. Wähle die Option erneut, um alle Projekte zu zeigen. Die Auswahl bleibt auf diesem Gerät gespeichert. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Screenshot: Filter für aktuelle Projekte"></a> |
@@ -82,7 +85,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
82
85
  | **Wartenden Chat bei Inaktivität öffnen** | <a id="feature-idleswitch"></a>Wenn ein Chat eine Frage stellt, auf eine Genehmigung oder eine Planprüfung wartet (der orangefarbene Punkt) oder eine Runde beendet, die du noch nicht gelesen hast (der grüne Punkt), und du dsh 30 Sekunden lang nicht benutzt, öffnet dsh diesen Chat. Orangefarbene Chats öffnen sich vor grünen. In jeder Gruppe öffnet sich zuerst der, der am längsten wartet; der nächste öffnet sich nach weiteren 30 Sekunden ohne Benutzung. Eine Taste, ein Klick, eine Mausbewegung, das Mausrad oder eine Berührung starten die 30 Sekunden neu. Text im Feld mit dem Fokus, markierter Text oder ein offenes Menü oder ein offener Dialog verhindern den Wechsel ebenfalls. Solange ein wartender Chat auf dem Bildschirm ist, ändert sich nichts. Verlässt du einen wartenden Chat ohne Antwort, kann er sich nach den nächsten 30 Sekunden ohne Benutzung wieder öffnen. Öffnet sich ein grüner Chat, verschwindet sein Punkt; der nächste grüne Chat öffnet sich erst, nachdem du dsh wieder benutzt hast und es dann 30 Sekunden lang nicht benutzt. Das funktioniert auch, wenn dsh im Hintergrund ist, aber dsh kommt nicht in den Vordergrund. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Screenshot: Wartenden Chat bei Inaktivität öffnen"></a> |
83
86
  | **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> |
84
87
  | **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> |
85
- | **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 (aus derselben Update-Prüfung, ohne weiteren Netzwerkaufruf); **Schließen** oder `Esc` schließt es. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatische Updates"></a> |
88
+ | **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. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatische Updates"></a> |
86
89
  | **Sicherung** | <a id="feature-backup"></a>Einstellungen → Composer Plus → **Sicherung** → **Jetzt sichern** schreibt dein ganzes dsh-Home (Chats, Einstellungen, Plugins, MCP, Skills) mit Prüfsumme in ein einziges Archiv in `~/Desktop/dsh-backups`. Geheimnisse werden im Archiv maskiert: Dateien mit Anmeldedaten, Schlüsseldateien (`.pem`, `.key`) und die Werte token, secret und password der yml-Einstellungen bleiben nur auf diesem Computer, im `vault` des Ordners. `cache/`, `dsh-runtimes/` und `node_modules` kommen nicht ins Archiv (dsh erstellt sie neu). Jede Sicherung in der Liste hat **Prüfen** (liest sie vollständig), **Für einen anderen Computer** (ein Ordner zum Kopieren auf den neuen Computer, mit der Rettungskonsole) und **Löschen**. Archive von dsh-backup im selben Ordner erscheinen und funktionieren auch. Zum Wiederherstellen beende dsh und nutze die Rettungskonsole. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Screenshot: Sicherung"></a> |
87
90
  | **Automatische Sicherung** | <a id="feature-autobackup"></a>Schalte **Automatische Sicherung** ein (standardmäßig aus: Jede Kopie ist etwa so groß wie dein dsh-Home ohne seinen Cache). Wähle, wie oft gesichert wird (**Alle**: 6 Stunden bis 7 Tage, standardmäßig 24 Stunden) und wie viele Sicherungen bleiben (**Behalten**: 3 bis 14, standardmäßig 7). Der nächste Zeitpunkt steht unter dem Schalter; eine fehlgeschlagene Sicherung erscheint dort auch und wird 30 Minuten später erneut versucht. Wenn dsh oder Composer Plus mit einer neuen Version startet, entsteht kurz nach dem Start ein Snapshot, bevor die neue Version deine Daten lange benutzt hat (die zwei neuesten bleiben, markiert mit **Vor einem Upgrade**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Screenshot: Automatische Sicherung"></a> |
88
91
  | **Sitzungsprotokoll-Prüfung** | <a id="feature-sessiondoctor"></a>**Sitzungsprotokolle prüfen** liest das Protokoll jedes Chats und listet die auf, die dsh nicht öffnen kann (ein defekter Frame, ein abgeschnittener Datensatz, eine falsche Sequenznummer). Ein abgerissenes Ende wird nicht aufgelistet: dsh repariert es selbst. **Aus Sicherungen reparieren** legt die Kopie aus der neuesten Sicherung zurück, die eine intakte Kopie enthält, und behält die beschädigte Datei daneben (`.corrupt-<Zeit>`). Nachrichten, die nach dieser Sicherung geschrieben wurden, sind nicht in der Kopie. Ein Chat, der in diesem dsh offen ist, wird hier nicht repariert: Beende dsh und repariere ihn in der Rettungskonsole. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Screenshot: Sitzungsprotokoll-Prüfung"></a> |
@@ -166,7 +169,9 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
166
169
  - **Zielprüfung:** Sie läuft nur, wenn der Agent ein `/goal` in einem automatischen Durchlauf als abgeschlossen markiert (oder wenn du auf **Jetzt ausführen** klickst). Die Host-Hälfte führt den Testbefehl im Ordner des Chats im Sandbox-Modus des Chats aus (wie das eigene `bash`-Werkzeug von dsh: dieselbe Richtlinie für den Dateizugriff; kann diese Sandbox nicht starten, läuft der Test nicht und die Prüfung schlägt fehl). Um den Befehl zu finden, liest sie nur `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` und `pytest.ini`, als reguläre Dateien im Ordner (kein Symlink aus dem Ordner hinaus, kein FIFO). Dann sendet sie das Ziel, den Chat seit dem Start des Ziels (deine Nachrichten, die Antworten des Agenten, Werkzeugaufrufe gekürzt auf 1.000 Zeichen und die letzten 2.000 Zeichen jedes Werkzeugergebnisses; kein Reasoning, keine zurückgenommenen Schritte; höchstens etwa 60.000 Zeichen, den neuesten Teil), `git status --short` und das Ende der Testausgabe als eine einzige Anfrage ohne Werkzeuge an das unter **Zielprüfung** gewählte Modell (standardmäßig das eigene Modell des Chats). Werkzeugausgaben können enthalten, was der Agent gelesen hat. Daher kann diese Anfrage Teile deiner Dateien enthalten, so wie der Chat selbst. In den Chat und ins Projekt wird nichts geschrieben. Dein Testbefehl, die Limits, das letzte Ergebnis (mit dem Ende seiner Ausgabe) und die Modellwahl liegen in `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (Datei nur für den Besitzer, die neuesten 500 Chats).
167
170
  - **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.
168
171
  - **Kontextaufschlüsselung:** Die Host-Hälfte liest nur das Chatprotokoll. Kein Modellaufruf, keine Projektdatei.
172
+ - **Aufgabentafel:** Die Tafel zeigt die Chats von dsh aus den eigenen Listen von dsh in diesem Fenster; sie fügt keine eigenen Chatdaten hinzu. Wenn du eine Aufgabe startest, legt die Host-Hälfte einen neuen Chat in dem gewählten Projekt an und sendet ihm deinen Prompt als erste Nachricht, so als hättest du ihn dort eingegeben; Freigaben, die Sandbox und das Modell des Chats gelten also wie sonst. Danach sendet sie den Prompt (seine 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); 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.
169
173
  - **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.
174
+ - **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.
170
175
  - **Projektgedächtnis:** aus, bis du es einschaltest. Solange es an ist, schickt der Host-Teil nach jeder abgeschlossenen Runde eines Chats der obersten Ebene die neuen Nachrichten dieses Chats seit der letzten Prüfung (deine Nachrichten und die Textantworten des Agenten; keine Werkzeugausgabe, kein Reasoning, kein verborgener Kontext, keine zurückgenommenen Nachrichten; in einem abgezweigten Chat bleibt die Kopie des Eltern-Chats weg; höchstens etwa 16.000 Zeichen) und die gespeicherten Notizen an das Modell des Chats, als eine Anfrage ohne Werkzeuge. Die Notizen sind Markdown-Dateien unter `$DSH_HOME/storages/dsh-composer-plus/memory/` (nur für den Eigentümer): `projects/<id>/` für jeden Projektordner (`<id>` ist ein Hash des echten Pfads des Ordners; `project.json` nennt den Ordner), `global/`, `journal.jsonl` (jede Änderung mit der Zeile davor und danach) und `reviewed.json` (wie weit jeder Chat gelesen wurde). In den Projektordner wird nichts geschrieben. Notizen, die wie ein Schlüssel, ein Token, ein Passwort oder eine Ausweisnummer aussehen, werden abgelehnt. Die Notizen eines Projekts kommen in den Systemprompt jedes neuen Chats in diesem Ordner und gehen so mit jeder Anfrage dieses Chats an das Modell. Der Schalter liegt in `memory.json` am selben Ort. **Gedächtnis öffnen** schickt nichts, bis du auf **Änderungen ansehen** klickst; dann schickt es die angezeigten Notizen und deinen Text als eine Anfrage ohne Werkzeuge an das Standardmodell von dsh. Die Änderungen werden erst mit **Anwenden** geschrieben, mit `editor` im Journal. Tether liest und ändert die Notizen über dieselbe Route.
171
176
  - **Sicherung:** Nichts verlässt deinen Rechner. Archive landen in `~/Desktop/dsh-backups` (Dateien nur für den Besitzer). Geheimnisse sind nicht im Archiv: Dateien mit Anmeldedaten (`.credentials.yaml`, `.env`), Schlüsseldateien (`.pem`, `.key`, `.p12`, `.pfx`) und die Werte der Einstellungen token, secret, password und API-Schlüssel in den yml-Dateien werden maskiert. Ihre echten Kopien bleiben in `composer-plus-vault/<archive>/` im selben Ordner (nur für den Besitzer), nur auf diesem Computer. **Für einen anderen Computer** kopiert keinen vault: Gib diese Geheimnisse dort neu ein. Deine Chatprotokolle, Einstellungen und der Rest des dsh-Home liegen unverändert im Archiv: Halte den Ordner privat, so wie `$DSH_HOME` selbst. Die Sicherung liest Dateien mit `O_NOFOLLOW | O_NONBLOCK`. Ein Symlink wird als Link gespeichert (nie verfolgt), ein FIFO oder Gerät wird übersprungen. Schalter und Einstellungen der automatischen Sicherung liegen in `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, der Schalter der Rettungskonsole in `rescue-console.json`. Solange dsh läuft, nennt `running/host-<pid>.json` jeden dsh-Prozess (die Rettungskonsole liest diese Dateien, um eine Wiederherstellung abzulehnen).
172
177
  - **Rettungskonsole:** ein Menü im Terminal; sie öffnet keinen Netzwerkport. Eine Wiederherstellung schreibt nur in einen neuen Ordner neben dem dsh-Home (Dateien mit `O_EXCL | O_NOFOLLOW`, Symlinks zuletzt und nie verfolgt). Sie lehnt ein Archiv ab, das einen unsicheren Namen (`..`, einen absoluten Pfad), ein Gerät oder FIFO, mehr als einen obersten Ordner oder einen Eintrag unter einem Link enthält.
@@ -186,10 +191,10 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
186
191
  - **Ein Chat wurde nach einem Neustart nicht fortgesetzt:** Nach Neustart fortsetzen war aus, als dsh beendet wurde, du hast die Runde selbst gestoppt, die Runde war beendet (fertig oder fehlgeschlagen), der Chat war archiviert, oder mehr als 20 Chats liefen (die neuesten 20 werden fortgesetzt).
187
192
  - **Die Warteschlange ist nach einem Neustart leer:** dsh selbst leert die Warteschlange beim Beenden. Nach Neustart fortsetzen stellt sie nur in einem Chat wieder her, den es fortsetzt; in anderen Chats sende die Nachrichten erneut. Eine Nachricht, die du kurz vor dem Beenden entfernt hast, kann zurückkommen: Entferne sie erneut.
188
193
  - **GitHub-Issue öffnen meldet „gh could not open the issue“:** Die Meldung ist die erste Zeile von `gh` selbst. Führe `gh auth status` in einem Terminal aus und melde dich mit `gh auth login` an. Der Ordner des Chats muss ein GitHub-Remote haben (`git remote -v`). „not installed or not on the PATH of dsh“ bedeutet, dass dsh `gh` nicht gefunden hat: Installiere es oder starte dsh aus einem Terminal, in dem `gh` funktioniert.
189
- - **Kein Branch-Etikett an einer Chatzeile:** 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).
194
+ - **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).
190
195
  - **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.
191
196
  - **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).
192
- - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.17.0`), siehe den Hinweis zur Installation oben.
197
+ - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.19.0`), siehe den Hinweis zur Installation oben.
193
198
  - **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.
194
199
  - **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.
195
200
  - **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.
@@ -209,6 +214,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
209
214
  - **Chat löschen** braucht das Archiv von dsh (dsh 0.2.0 und neuer). Ein Chat (oder einer seiner Subagent-Chats), der nicht innerhalb von 15 s stoppt oder den ein anderes dsh hält, bleibt archiviert, und nichts wird verschoben. Auf anderen Systemen als macOS muss der Papierkorb-Ordner auf demselben Laufwerk liegen wie der Chatverlauf. Ein geöffneter Chat, den du löschst, bleibt archiviert und ausgeblendet im Speicher von dsh, bis dsh neu startet. Leere den Papierkorb selbst; dsh tut das nicht.
210
215
  - Die Warteschlange von dsh hat keine `move`-Aktion. Deshalb verschiebt die Host-Hälfte des Plugins die eingereihte Nachricht selbst in der Warteschlange von dsh (eine Änderung, dieselbe Nachricht). Nachrichten mit Bildern oder Dateien lassen sich ebenfalls verschieben. Nur deine eigenen Nachrichten lassen sich verschieben: Eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange bleibt an ihrem Platz. Beginnt das Senden einer Nachricht, während du ziehst, wird nichts verschoben, und ein Hinweis meldet das.
211
216
  - dsh 0.2.1 lädt ein Update sofort, wenn die neue Version keine Einstellungen von dsh ändert. Andernfalls und unter dsh 0.2.0 starte dsh neu, um das Update zu laden. Das Plugin startet dsh nie für dich neu. Web-/CLI-Profile ohne die Plugin-Verwaltung von dsh melden nur eine neue Version.
217
+ - **Neu in Composer Plus N** zeigt die Notes in der Sprache von **App-Sprache**. Eine UI-Sprache mit einer anderen Region bekommt die Notes ihrer Grundsprache (`en-GB` die englischen, `zh-TW` die chinesischen von `zh`). Eine Sprache ohne Notes (eine, die ein anderes Sprachpaket hinzufügt, oder `pt-PT`, das nicht `pt-BR` ist) zeigt die englischen Notes. Die Notes kommen mit der neuen Version. Hat die laufende Kopie keine lesbare Notes-Datei (`release-notes.json`), zeigt das Fenster die englischen Notes von GitHub.
212
218
  - **Für diesen Chat zulassen** zählt das Zeitlimit ab dem Moment der Freigabe. Ein neues Zeitlimit gilt sofort für die laufenden Freigaben. Ein kürzeres Limit kann sie daher sofort beenden. Freigaben aus Version 1.12 und älter haben keine Zeit: Nach dem Update fragt der Agent für diese Tools noch einmal.
213
219
  - **Fokus im Eingabefeld behalten** gibt den Fokus nur nach einem `/`-Befehl oder Skill zurück. Während dsh den Befehl auflöst, bleibt das Eingabefeld einige Millisekunden lang schreibgeschützt. Tasten, die du in dieser Zeit drückst, gehen verloren. Wenn das `/`-Menü von dsh noch offen ist, wählt `Enter` die markierte Zeile und sendet nicht.
214
220
  - **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.
@@ -222,7 +228,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
222
228
  - **Dieser Chat** zählt nur Dateien, die die Datei-Tools von dsh (`write`, `edit`, `str_replace_editor`) geschrieben haben. Dateien, die ein Befehl (`bash`) geändert hat, sind nicht in dieser Ansicht. Sie erscheinen unter **Nicht committet**. Ohne Snapshot von Runde zurücknehmen für den Chat (Runde zurücknehmen aus, dsh-rewind-plugin installiert oder ein Chat, der älter als das Plugin ist) vergleicht die Ansicht mit dem letzten Commit und sagt das. Runde zurücknehmen behält die 50 neuesten Snapshots eines Chats: In einem längeren Chat vergleicht die Ansicht mit dem ältesten behaltenen, nennt die Nachricht und zählt frühere Änderungen nicht. **Leerraum-Änderungen ausblenden** ist `git diff -w`: Auch eine Zeile, die sich nur in Leerzeichen in ihrem Inneren geändert hat, wird ausgeblendet.
223
229
  - **GitHub-Issue öffnen** braucht das GitHub CLI (`gh`) im PATH von dsh und ein GitHub-Remote im Ordner des Chats. Es läuft höchstens 60 s. Dauert `gh` länger, kann das Issue auf GitHub existieren, ohne dass sein Link in der Liste steht (sieh auf GitHub nach, bevor du erneut klickst: Die Liste liest den Link nur aus einem abgeschlossenen Lauf, ein neuer Klick kann also ein zweites Issue öffnen). Ein Ordner mit mehr als einem GitHub-Remote nutzt den eigenen Standard von `gh` (`gh repo set-default`).
224
230
  - **Chats, die diese Datei geändert haben** kennt wie **Dieser Chat** nur die Datei-Tools von dsh (`write`, `edit`, `str_replace_editor`): Eine Änderung durch einen Befehl (`bash`) wird nicht aufgeführt. Die Liste liest die neuesten 300 Chats des Repositorys (nach ihrem Erstellungszeitpunkt) und sagt es, wenn es mehr gibt. Sie zeigt höchstens 100 Zeilen. Eine umbenannte Datei steht unter dem Namen, den das Tool geschrieben hat. Ein Chat, dessen Ordner außerhalb des Repositorys liegt (auch über einen anderen Pfad zu denselben Dateien), zählt nicht. Das erste Öffnen nach einem Start von dsh liest alle Chatprotokolle des Repositorys (etwa 4 s für 275 Chats). Spätere Aufrufe lesen nur die Chats, die sich seitdem geändert haben.
225
- - **Git-Branch in Chatzeilen** zeigt den Branch des Chat-Ordners zu Beginn oder am Ende der letzten Runde, nicht den aktuellen Branch: Ein Branch-Wechsel außerhalb einer Runde erscheint erst nach der nächsten Runde. Chats von vor dieser Version zeigen bis zu ihrer nächsten Runde kein Etikett. Das Etikett sitzt im Markup der Chatzeilen von dsh (dsh hat dort keinen Platz dafür). Wenn ein dsh-Update dieses Markup ändert, erscheint kein Etikett. Wenn die Projektzeile über dem Chat denselben Namen wie der Branch hat (zum Beispiel ein Ordner von „Ein Branch pro Chat“), zeigt die Chatzeile kein Etikett, aber „In einer Liste“ zeigt es weiterhin.
231
+ - **Git-Branch in Chatzeilen** zeigt den Branch des Chat-Ordners zu Beginn oder am Ende der letzten Runde, nicht den aktuellen Branch: Ein Branch-Wechsel außerhalb einer Runde erscheint erst nach der nächsten Runde. Chats von vor dieser Version zeigen bis zu ihrer nächsten Runde kein Etikett. Das Etikett sitzt im Markup der Chatzeilen von dsh (dsh hat dort keinen Platz dafür). Wenn ein dsh-Update dieses Markup ändert, erscheint kein Etikett. Das Etikett erscheint nur in „In einer Liste“.
226
232
  - **Ein Branch pro Chat** im Planmodus: dsh sendet `/plan <Nachricht>` als Befehl, nicht als Nachricht. Deshalb fängt Composer Plus das Absenden des Befehls im Eingabefeld von dsh ab (keine öffentliche API). Ändert ein dsh-Update das, läuft `/plan <Nachricht>` mit gewähltem **Neuer Branch** im offenen Bildschirm „Neuer Chat“ als eigener Befehl von dsh. Kann der Host im neuen Chat den Planmodus nicht einschalten, bleibt der Branch-Ordner, und die Nachricht wird nicht gesendet. So ändert der neue Chat keine Dateien im Standardmodus.
227
233
  - **Ein Branch pro Chat**: Wenn der Branch-Ordner eines Chats (`<project>/.worktrees/<name>`) gelöscht wird, zum Beispiel wenn der eigene Agent des Chats den Worktree entfernt und den Branch löscht, verschiebt der nächste Schritt des Chats den Chat aus diesem Ordner. Das Projekt des Branch-Ordners verschwindet aus der Seitenleiste, und der Chat erscheint unter Ohne Gruppe und bleibt offen. Ab dsh 0.2.1 läuft der Chat im Hauptordner des Projekts weiter, und das Modell bekommt einen Hinweis auf den neuen Ordner. Unter dsh 0.2.0 behält der Chat den gelöschten Ordner: Ein Befehl dort schlägt fehl, bis Sie einen neuen Chat beginnen. Auch das Projekt eines gelöschten Branches, das kein Chat nutzt, verschwindet aus der Seitenleiste: Composer Plus prüft die Branch-Ordner beim Start und alle 30 Sekunden, auch ohne Filter der Seitenleiste. Während ein Chat verschoben wird, antwortet **Neuer Branch** im selben Repository mit „erneut versuchen“. Mit ausgeschaltetem Schalter zeigt dsh wieder seinen eigenen Fehler („working-directory: directory does not exist“).
228
234
  - **Branches im Arbeitsbereichsbaum** schreibt ohne Klick in git: Wenn es einen Chat verschiebt, setzt es den Projektordner auf seinen vorherigen Branch zurück (`git switch`) und fügt einen Worktree hinzu (`git worktree add`). Es löscht nie einen Branch, einen Worktree oder eine Datei. dsh kann den Ordner eines Chats nicht ändern, daher ist ein verschobener Chat eine Kopie (dshs eigener Fork, mit neuer ID), und der alte Chat wird archiviert. Die Kopie setzt die angehaltene Aufgabe fort; ein Tool-Aufruf, der lief, als der Branch erschien, endet mit einer Ablehnung, und der Agent führt ihn im neuen Ordner erneut aus. Ein Ziel des alten Chats zieht nicht mit. Nur ein Chat, dessen Ordner der Hauptordner des Repositorys ist, wird verschoben, und nur für einen Branch, den er in diesem Durchgang erstellt und ausgecheckt hat (`git switch -c`, `git checkout -b`): Ein nur mit `git branch` erstellter Branch, ein Ordner mit nicht committeten Änderungen, ein verknüpfter Worktree oder ein Unterordner verschieben nichts. Im Baum erscheinen nur Worktrees direkt in `<project>/.worktrees/` mit einem Branch; ein losgelöster (detached) Worktree oder einer an anderer Stelle erscheint nicht. Die Kopie öffnet sich nur von selbst, wenn ihr Chat der geöffnete war (das Plugin liest das aus dshs Zeile in der Seitenleiste); sonst ist sie im Branch-Projekt.
@@ -239,8 +245,11 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
239
245
  - **Prompt verbessern** sieht nur eine kurze Projektzusammenfassung, die geänderten Pfade und die Pfade, deren Namen zu deinen Wörtern passen: nicht den Code selbst. Daher kann die Funktion die richtige Datei übersehen, und sie nennt nur Pfade, die sie bekommen hat. Lies den neuen Text, bevor du ihn sendest. Sie läuft nicht bei einem anderen Slash-Befehl als `/goal <Ziel>`, bei einem Steuerwort von `/goal` (`clear`, `pause`, `resume`) oder bei einer Nachricht mit einem Datei- oder Symbol-Chip (der neue Text ist reiner Text, der Chip ginge also verloren), und eine Nachricht kann höchstens 8.000 Zeichen haben. Für ein `/goal`-Ziel schreibt sie Bedingungen nur aus dem Entwurf und dem Kontext. Eine zu strenge Bedingung kann Zieldurchläufe kosten, lies sie also, bevor du sie sendest. Bilder bleiben angehängt: Nur der Text ändert sich. Jeder Klick kostet einen Modellaufruf; ein starkes Modell kann eine Minute brauchen (`Esc` bricht ab).
240
246
  - **Zielprüfung** prüft nur einen Abschluss, den der Agent in einem automatischen Zieldurchlauf macht: Einen Abschluss, um den du im Chat bittest, `/goal` und die Zielleiste prüft sie nicht. Der Agent kann die Tests oder die Dateien des Testbefehls selbst ändern; der Prüfer liest den Chat und kann das sehen, kann sich aber in beide Richtungen irren (ein falsches „nicht fertig“ kostet einen Durchlauf mehr; ein falsches „fertig“ schließt das Ziel). Der Prüfer sieht den Chat und `git status`, nicht den Code selbst. Ein Testlauf wird nur wiederverwendet, wenn der neueste Schritt des Agenten, der Dateien ändern kann, sein eigener erfolgreicher `bash`-Lauf genau desselben Befehls im selben Ordner war; ein Befehl mit einer Pipe (`| tail`) oder `&&` wird nicht wiederverwendet. Das Budget wird gemessen, wenn eine Runde endet. Daher kann eine Runde darüber hinausgehen. Das Token-Budget zählt auch die Aufrufe der Subagent-Chats des Chats (gelesen aus ihren gespeicherten Protokollen am Ende jeder Runde, daher dauert die Prüfung eines Chats mit vielen Subagents etwas länger). Die Nachweistabelle kommt aus der eigenen Lektüre des Chats durch den Prüfer: Einen Teil, den er bestätigt nennt, solltest du selbst ansehen, wenn er wichtig ist. `update_goal` wartet, während die Prüfung läuft (der Test höchstens 15 Minuten, der Prüfer höchstens 3 Minuten). Eine Abzweigung bekommt eine neue Chat-ID und startet daher ohne den eigenen Testbefehl und die Limits des übergeordneten Chats. Jeder Abschluss, der den Prüfer erreicht, kostet einen Modellaufruf.
241
247
  - **Geschützte Dateien** ist eine Leitplanke, keine Sandbox. Die Funktion deckt die eigenen Datei-Tools von dsh ab (`read`, `read_image`, `grep` auf eine Datei, `write`, `edit`, `str_replace_editor`). Ein Shell-Befehl (`cat .env`), ein Skript, das der Agent schreibt, die Shell eines Subagents, ein MCP-Tool, eine `glob`-Liste und ein `grep` über einen ganzen Ordner können eine geschützte Datei trotzdem erreichen. Für eine echte Grenze nutze die Sandbox-Modi von dsh oder halte Geheimnisse aus dem Projektordner heraus. Muster kennen `*`, `**` und `?`, nicht `{a,b}` oder `[ab]`, und sie ignorieren Groß- und Kleinschreibung.
248
+ - **Blockierte Befehle** ist eine Leitplanke, keine Sandbox. Die Funktion liest nur den Befehlstext der Tools `bash` und `pwsh` von dsh. Eine Variable oder ein Alias, die den Befehl nennen (`CMD=npm; $CMD publish`), eine Shell-Funktion, eine Skriptdatei, die der Agent schreibt, ein anderes Programm (`python -c`, `node -e`, `make`), ein MCP-Tool und dein eigenes Terminal können ihn trotzdem ausführen. Eine Regel passt auf mehr, als du vielleicht willst: Jedes Wort eines Befehls kann der Befehlsname sein (`echo npm publish` passt auf `npm publish`), und zwischen den Wörtern der Regel können andere Wörter stehen (`git push --force` passt auch auf `git push origin main --force`). Mach eine Regel länger, wenn sie auf zu viel passt. Eine Regel mit **zuerst fragen** braucht einen Chat, der fragen kann: In einem Chat mit der Genehmigungsrichtlinie „never“ (zum Beispiel einem delegierten Subagenten) kann dsh die Karte nicht zeigen, deshalb wird der Aufruf mit dem Grund abgelehnt. Die Genehmigungskarte zeigt den Grund auf Englisch. **Für diesen Chat zulassen** beantwortet keine Karte von **zuerst fragen**.
242
249
  - **In einem neuen Chat fortsetzen** sendet den Chat (Nachrichten, Werkzeugaufrufe und das Ende jedes Werkzeugergebnisses, höchstens etwa 60.000 Zeichen, den neuesten Teil) an das eigene Modell des Chats. Die Übergabenotiz kann eine Entscheidung oder eine Datei auslassen: Lies sie vor dem Start. Der neue Chat kennt nur die Notiz und den verlinkten Chat (dsh hängt den alten Chat als schreibgeschützten Kontext an). Sein Modellkontext beginnt klein, der alte Chat bleibt, wie er ist. Pro Chat läuft immer nur eine Notiz oder ein Start.
243
250
  - **Kontextaufschlüsselung** zeigt Schätzungen nach der eigenen Regel von dsh (etwa 4 Zeichen pro Token), derselben Regel wie beim Kontextring von dsh. Die eigene Zählung des Modells kann abweichen. Die Tool-Definitionen sind die der neuesten Anfrage. Die Funktion zeigt den Kontext so, wie das Chatprotokoll ihn enthält. Eine Runde, die gerade läuft, erscheint nach ihrem nächsten Schritt.
251
+ - **Geplante Schritte** spart nur dann Tokens, wenn das Modell plant: Solange die Funktion an ist, trägt jede Anfrage das Tool `plan_next_steps` und eine kurze Anweisung (etwa 500 Tokens), auch in Chats, in denen das Modell nie plant. Eine Bedingung beweist nur, was sie sagt (zum Beispiel: der Exit-Code des Builds war 0), nicht, dass die Arbeit stimmt. `ok` liest die eigenen Ergebnismarken von dsh (`[exit code: N]`, Zeitüberschreitungen, Sandbox-Ablehnungen); ein Befehl, der ohne Exit-Code ungleich null fehlschlägt, gilt als bestanden. Schritte laufen einzeln; zwei gleichzeitig bereite Schritte gehen an das Modell zurück. Die Nachricht des Schritts wird als Assistentennachricht des Chat-Modells gespeichert (dsh hat keine Markierung für eine Nachricht, die ein Plugin schreibt), daher sagt ihr Text, dass Composer Plus ihn ausgeführt hat. Nicht in Tether.
252
+ - **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). Die Schlagwörter kommen aus einem Modellaufruf pro gestarteter Aufgabe: 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 des Prompts. Ein Prompt, der mit einem `/`-Befehl beginnt, den dsh kennt (`/plan`, `/goal`), läuft als dieser Befehl. **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.
244
253
  - **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.
245
254
  - **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.
246
255
  - **Sicherung** nutzt einen einzigen festen Ordner, `~/Desktop/dsh-backups` (der Standardordner von dsh-backup, damit dessen Archive nutzbar bleiben); eine Einstellung für einen anderen Ordner gibt es nicht. Ein Archiv ist etwa so groß wie das dsh-Home ohne `cache/` und `dsh-runtimes/` (gemessen: 1,6 GB Dateien ergaben auf Apple Silicon in etwa 30 s ein Archiv von 830 MB; dsh reagierte weiter). Eine Datei, die sich beim Lesen ändert, wird so gespeichert, wie sie war, als die Sicherung sie geöffnet hat. Daher kann das Protokoll eines offenen Chats mit einem abgeschnittenen Datensatz enden, den dsh beim nächsten Schreiben repariert. Die Maskierung findet ein Geheimnis in einer yml-Datei am Namen seines Schlüssels in einer Zeile (`token:`, `apiKey:`, …); ein Geheimnis in einer Flow-Map (`{token: x}`), in einer Liste unter einem solchen Schlüssel, in einer JSON-Datei (zum Beispiel der `apiKey` eines MCP-Servers in einer `.json`-Datei) oder unter einem anderen Namen bleibt im Archiv. Die typisierten Archive von dsh-backup (`dsh-t-…`) werden nicht aufgelistet. **Für einen anderen Computer** kopiert das Archiv (unter APFS ein Klon: kein zusätzlicher Platz); der vault kommt nicht mit. **Jetzt sichern** löscht keine Sicherung. Eine automatische Sicherung behält die neuesten Sicherungen, die Composer Plus erstellt hat (die Einstellung **Behalten** von **Automatische Sicherung**), und löscht die älteren davon; Snapshots vor einem Upgrade werden getrennt gezählt (die neuesten 2 bleiben). Archive von dsh-backup werden nie gelöscht: Entferne sie mit **Löschen**. Solange dsh-backup noch installiert ist, zählt es die Archive von Composer Plus zu seiner eigenen Anzahl behaltener Sicherungen und kann sie löschen.
@@ -277,6 +286,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
277
286
 
278
287
  **Kann sich der Agent meine Vorlieben über Chats hinweg merken, wie das Gedächtnis von DS Bot?** Ja, mit **Projektgedächtnis** (standardmäßig aus): Schalte es unter **Einstellungen → Composer Plus** ein. Nach jeder Runde werden deine dauerhaften Vorlieben und Entscheidungen als kurze Notizen für das Projekt des Chats gespeichert, und jeder neue Chat in diesem Projekt liest sie. Bitte den Agenten, sich etwas zu merken, dann speichert er es sofort. Um die Notizen zu sehen oder zu ändern, klicke in derselben Zeile auf **Gedächtnis öffnen** und schreibe, was sich ändern soll.
279
288
 
289
+ **Kann ich alle meine Chats als Kanban-Tafel sehen und von dort neue starten?** Ja, mit **Aufgabentafel** (standardmäßig an): Öffne sie in der linken Seitenleiste. Jeder Chat ist eine Karte in **In Arbeit**, **In Prüfung** (er wartet auf dich) oder **Fertig**. **Neue Aufgabe** braucht nur einen Prompt und startet damit einen neuen Chat; klicke auf einer orangen Karte auf **Antworten**, um zu antworten, ohne den Chat zu öffnen.
290
+
280
291
  **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.
281
292
 
282
293
  **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.
@@ -301,6 +312,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
301
312
 
302
313
  **Wie sehe ich nur die Dateien, die ein Chat geändert hat?** Rechte Seitenleiste → **Änderungen** → **Dieser Chat**. Klicke auf **␣**, um Änderungen auszublenden, die nur Leerraum sind.
303
314
 
315
+ **Wie verhindere ich, dass der Agent `npm publish` oder `git push --force` ausführt?** **Einstellungen → Composer Plus → Blockierte Befehle**: Gib `npm publish` ein, wähle **blockieren** oder **zuerst fragen** und klicke dann auf **Hinzufügen**. Eine Regel mit **blockieren** lehnt den Befehl ab, und der Agent fragt dich; eine Regel mit **zuerst fragen** zeigt jedes Mal die Genehmigungskarte. „Geschützte Dateien“ deckt die Datei-Tools des Agenten ab, „Blockierte Befehle“ seine Shell-Befehle.
316
+
304
317
  **Wie verhindere ich, dass die automatische Prüfung in einem Chat immer wieder nach demselben Tool fragt?** Klicke auf der Genehmigungskarte auf **Für diesen Chat zulassen**. Das gilt nur für genau dieses Tool in diesem Chat, standardmäßig für 1 Stunde. Widerrufe es über den Chip in der Kopfzeile. Ändere die Zeit unter **Einstellungen → Composer Plus → Für diesen Chat zulassen**.
305
318
 
306
319
  **Ich habe mein iPhone verloren. Wie verhindere ich, dass es meinen Mac erreicht?** Klicke unten links in der Seitenleiste auf **Mobile Verbindung** und dann neben diesem iPhone auf **Remove**. Sein Schlüssel funktioniert sofort nicht mehr. Es kann nur mit einer neuen Kopplung zurückkommen, die du auf dem Mac bestätigst.
@@ -329,6 +342,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
329
342
 
330
343
  **Kann ich ein Foto von meinem iPhone senden?** Ja. Tippe in einem Tether-Chat auf **+** neben dem Nachrichtenfeld → Camera, Photos (bis zu 4) oder Paste image. Die Fotos kommen als Anhänge deiner Nachricht in den Chat auf dem Mac, daher sieht das Modell sie.
331
344
 
345
+ **Kann dsh den nächsten Befehl ausführen, ohne das Modell erneut zu fragen?** Ja, mit **Geplante Schritte** (standardmäßig aus): Schalte die Funktion unter Einstellungen → Composer Plus ein. Das Modell kann dann seine nächsten Befehle mit einer Bedingung planen, etwa „führe die Tests aus, wenn der Build gelingt“, und Composer Plus führt einen Schritt ohne neuen Modellaufruf aus, wenn das Ergebnis die Bedingung erfüllt. Freigaben und Sandbox bleiben, wie sie sind.
346
+
332
347
  **Funktioniert es mit der Desktop-App?** Ja: Einstellungen → Plugins → **Plugin hinzufügen** → `dsh-composer-plus`. Getestet mit dsh 0.2.0-rc.2 (Desktop und Web) und 0.2.1-rc.2 (Web).
333
348
 
334
349
  ## Entwicklung
@@ -393,6 +408,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
393
408
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
394
409
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
395
410
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
411
+ # Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
412
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
396
413
  ```
397
414
 
398
415
  ```sh
package/README.es.md CHANGED
@@ -14,7 +14,7 @@ Mejoras de comodidad al estilo de Codex para la interfaz de escritorio y web de
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness con Composer Plus: el proyecto en ejecución muestra un indicador de carga en la barra lateral y el panel de cambios muestra un diff de git"></p>
16
16
 
17
- Plugin comunitario no oficial. Las únicas llamadas de red son las de la comprobación de actualizaciones (las versiones publicadas en GitHub y el registro de npm). Desactiva **Actualizaciones automáticas** para que no se hagan al iniciar. **Ideas de funciones** llama al modelo de tu propio chat solo cuando haces clic en **Sugerir funciones**. **Predicción del siguiente mensaje** (activada de forma predeterminada) llama al modelo elegido en Configuración (el predeterminado de dsh, salvo que elijas otro) una vez después de cada turno terminado, sin ningún clic. Desactívala en **Configuración → Composer Plus** para detener estas llamadas. **Completar al escribir** (desactivado de forma predeterminada) llama al modelo elegido para esta función (de forma predeterminada, el de la predicción) en cada pausa mientras escribes, después de que lo actives. **Mejorar prompt** solo llama a un modelo cuando haces clic en su varita mágica. **Comprobación del objetivo** (activada de forma predeterminada) llama a un modelo una vez cada vez que el agente marca un `/goal` como completado en una ronda automática. **Conexión móvil** (desactivada de forma predeterminada) acepta conexiones del iPhone desde tu red local o tu tailnet solo después de que la actives.
17
+ Plugin comunitario no oficial. Las únicas llamadas de red son las de la comprobación de actualizaciones (las versiones publicadas en GitHub y el registro de npm). Desactiva **Actualizaciones automáticas** para que no se hagan al iniciar. **Ideas de funciones** llama al modelo de tu propio chat solo cuando haces clic en **Sugerir funciones**. **Predicción del siguiente mensaje** (activada de forma predeterminada) llama al modelo elegido en Configuración (el predeterminado de dsh, salvo que elijas otro) una vez después de cada turno terminado, sin ningún clic. Desactívala en **Configuración → Composer Plus** para detener estas llamadas. **Completar al escribir** (desactivado de forma predeterminada) llama al modelo elegido para esta función (de forma predeterminada, el de la predicción) en cada pausa mientras escribes, después de que lo actives. **Mejorar prompt** solo llama a un modelo cuando haces clic en su varita mágica. **Tablero de tareas** llama una vez al modelo del chat nuevo para las etiquetas de cada tarea que inicias en el tablero. **Comprobación del objetivo** (activada de forma predeterminada) llama a un modelo una vez cada vez que el agente marca un `/goal` como completado en una ronda automática. **Conexión móvil** (desactivada de forma predeterminada) acepta conexiones del iPhone desde tu red local o tu tailnet solo después de que la actives.
18
18
 
19
19
  ## Instalación
20
20
 
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de eso se encarga la app).
31
31
 
32
- > El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.17.0`.
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.19.0`.
33
33
 
34
34
  ## Funciones
35
35
 
@@ -68,11 +68,14 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
68
68
  | **Comprobación del objetivo** | <a id="feature-goalcheck"></a>Empieza un objetivo con `/goal`. Cuando el agente marca el objetivo como completado en una ronda automática, el objetivo solo se cierra tras dos comprobaciones. Primero, el comando de prueba del proyecto se ejecuta en la carpeta del chat, con el modo sandbox del chat. El comando es el tuyo o el que se encuentra en `package.json`, `Makefile`, `Cargo.toml`, `go.mod` o pytest. Si el paso más reciente del propio agente fue una ejecución correcta de esa prueba, no se vuelve a ejecutar. Después, una llamada independiente al modelo, sin herramientas, lee el objetivo, este chat, `git status` y el resultado de la prueba. El modelo responde con una tabla de evidencias: cada parte del objetivo queda verificada, incorrecta o sin resolver, con la evidencia y la corrección; el objetivo solo se cierra cuando todas las partes están verificadas. Si una comprobación falla, el objetivo sigue activo y el agente lee cada parte abierta con su evidencia y su corrección; luego continúa la ronda siguiente. Una fila bajo la barra del objetivo (**Comprobación del objetivo**) muestra la prueba, el último resultado y cuántas partes se verificaron (pasa el puntero por encima para ver la tabla). **Editar** define tu propio comando de prueba y un límite de tiempo o de tokens; al superar el límite, el objetivo queda bloqueado. El límite de tokens también cuenta los subagentes del chat. **Ejecutar ahora** ejecuta la comprobación sin cerrar el objetivo. Tiene su propio menú **Modelo** en Configuración (predeterminado: **Igual que el modelo del chat**). Cuando completas el objetivo tú mismo, no se comprueba nada. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura: Comprobación del objetivo"></a> |
69
69
  | **Continuar en un chat nuevo** | <a id="feature-handoffchat"></a>Haz clic derecho en un chat de la barra lateral (o abre su menú **…**) → **Continuar en un chat nuevo…**. Una llamada al propio modelo del chat escribe una nota de traspaso con lo que muestra el chat: Tarea, Resultados, Completado, Decisiones, Problemas abiertos y Siguiente acción (las llamadas a herramientas y sus resultados son la evidencia; los pasos que revertiste se omiten). La nota se abre en un diálogo: léela y edítala. **Volver a escribir** escribe una nota nueva. **Iniciar chat nuevo** (o `Cmd/Ctrl+Enter`) abre un chat nuevo en el mismo proyecto con la nota y un enlace al chat anterior como primer mensaje; el chat anterior queda como está. Úsalo cuando un chat largo esté lleno o lento, o para continuar mañana. No se escribe nada en el proyecto. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Captura: Continuar en un chat nuevo"></a> |
70
70
  | **Desglose del contexto** | <a id="feature-contextbreakdown"></a>Barra lateral derecha → `+` → **Contexto**. La página muestra qué llena ahora el contexto del modelo del chat abierto y cuánto de la ventana de contexto usa: el prompt del sistema, las instrucciones del proyecto (AGENTS.md), las skills, tus mensajes, las respuestas del agente y las llamadas a herramientas, los resultados de herramientas (por herramienta), los resultados de MCP (por servidor), las definiciones de herramientas, el resumen de compactación y otras notas de contexto, cada uno con sus tokens y su parte. Haz clic en una parte para ver sus herramientas o servidores. Solo lee el registro del chat, después de `/compact` y de las reversiones, y no llama a ningún modelo; vuelve a leerlo después de cada turno y con **Actualizar**. Úsalo para ver por qué un chat está lento o lleno, por ejemplo por un resultado grande de una herramienta MCP o por muchas definiciones de herramientas. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Captura: Desglose del contexto"></a> |
71
+ | **Pasos planificados** | <a id="feature-plannedsteps"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. El agente recibe la herramienta `plan_next_steps`: en el mismo mensaje que un comando, puede planificar los siguientes comandos con sus argumentos exactos y una condición, por ejemplo «ejecuta `npm test` cuando la compilación pase». Cuando el resultado cumple la condición, Composer Plus ejecuta el siguiente paso por sí mismo, sin una nueva llamada al modelo, así un chat largo usa menos tokens. El paso aparece en el chat como una línea corta, «Composer Plus · Planned steps: ran `test` … without a model call», seguida de su llamada a la herramienta y su resultado. Solo pasos de `bash`, `read`, `grep` y `glob`; las aprobaciones, el sandbox y Archivos protegidos se aplican a cada paso como siempre. El modelo vuelve a responder cuando una condición falla, cuando dos pasos están listos a la vez, después del último paso y cuando envías un mensaje. La idea viene de HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Captura: Pasos planificados"></a> |
71
72
  | **Archivos protegidos** | <a id="feature-protectedfiles"></a>Activado de forma predeterminada. Las herramientas de archivos propias del agente no pueden leer ni cambiar los archivos que coinciden con tus patrones: `read`, `read_image` y `grep` sobre un archivo se rechazan con los patrones de **lectura y escritura**, y `write`, `edit` y `str_replace_editor` con los dos tipos. El agente lee el motivo y se le indica que te pregunte. Los patrones predeterminados son `.env*`, `*.pem` y `*.key`. Configuración → Composer Plus → **Archivos protegidos**: añade un patrón (por ejemplo `published/**` o `config/*.yml`), haz clic en su tipo para cambiar entre **lectura y escritura** y **solo escritura**, quítalo con ✕ o haz clic en **Usar los valores predeterminados**. Un patrón sin `/` coincide con un nombre de archivo en cualquier carpeta. Es una barrera de protección, no un sandbox: un comando de shell (`cat .env`), un script o una herramienta MCP aún pueden llegar al archivo (consulta Límites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Captura: Archivos protegidos"></a> |
73
+ | **Comandos bloqueados** | <a id="feature-blockedcommands"></a>Activado de forma predeterminada, con una lista vacía. Los comandos de shell del agente (`bash`, `pwsh`) no pueden ejecutar un comando que coincida con tus reglas: una regla **bloquear** rechaza la llamada (el agente lee el motivo y se le indica que te pregunte), una regla **preguntar antes** muestra la tarjeta de aprobación de dsh, y el comando solo se ejecuta cuando tú lo permites. Configuración → Composer Plus → **Comandos bloqueados**: escribe una regla (por ejemplo `npm publish`, `git push --force` o `ssh *192.168.2.19`), haz clic en el tipo para cambiar entre **bloquear** y **preguntar antes** y luego haz clic en **Añadir**; haz clic en el tipo de una regla para cambiarlo y quítala con ✕. Una regla es un nombre de comando y palabras que deben venir después de él en este orden; `*` coincide con cualquier texto. La comprobación también encuentra el comando después de `&&`, `;`, `\|`, dentro de `$(…)`, `bash -c "…"` o `eval`, y después de `sudo` o `env`. Es una barrera de protección, no un sandbox: una variable (`$CMD`), un archivo de script u otro programa aún pueden ejecutar el comando (consulta Límites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Captura: Comandos bloqueados"></a> |
74
+ | **Tablero de tareas** | <a id="feature-taskboard"></a>Barra lateral izquierda → **Tablero de tareas**. 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 está en **Hecho** (verde hasta que lo abres). Elige un proyecto o **Todos los proyectos** a la izquierda; una carpeta de «Una rama por chat» cuenta como su proyecto. **Nueva tarea** (o `n`) solo pide un prompt: `Enter` inicia un chat nuevo en el proyecto, la tarjeta aparece en **Por hacer**, dsh pone nombre al chat y el modelo del chat escribe hasta 3 etiquetas. Haz clic en una tarjeta para abrir su chat. En una tarjeta naranja, haz clic en **Responder** para responderla en el tablero: **Rechazar** o **Permitir una vez**, **Aprobar** o **Solicitar cambios** para un plan, o las opciones y tu propio texto para una pregunta. **Ocultar terminados** oculta **Hecho** en este dispositivo. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Captura: Tablero de tareas"></a> |
72
75
  | **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> |
73
76
  | **Permitir en este chat** | <a id="feature-allowforchat"></a>Cuando la revisión automática te pregunta, la tarjeta de aprobación muestra **Permitir en este chat**: a partir de entonces, la misma herramienta en el mismo chat queda permitida, con cualquier argumento, hasta que termina el límite de tiempo (1 hora por defecto; elígelo en **Configuración → Composer Plus → Permitir en este chat**). Después, el agente vuelve a preguntar. Un chip en la cabecera muestra los permisos concedidos con su hora de fin y permite revocarlos. Los permisos se mantienen tras un reinicio. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Captura: Permitir en este chat"></a> |
74
77
  | **Estado del proyecto** | <a id="feature-projectstatus"></a>La fila de un proyecto en la barra lateral muestra el mismo indicador de en ejecución / en espera / terminado que sus chats, así que un proyecto contraído también te dice que un chat de dentro está trabajando o te necesita. Primero se muestra un chat que te espera, luego un chat terminado que aún no has abierto (el punto verde, también mientras otro chat sigue en ejecución) y luego el indicador de en ejecución. Pasa el puntero por encima para ver los detalles. En **Árbol de espacios de trabajo**, la fila de una carpeta superior también muestra los chats de cada proyecto que contiene (por ejemplo, cada carpeta de rama en `.worktrees/`), también cuando está contraída. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Estado del proyecto"></a> |
75
- | **Rama de Git en las filas de chat** | <a id="feature-sessionbranch"></a>Cada fila de chat de la barra lateral muestra una pequeña etiqueta gris con la rama de git en la que estaba la carpeta del proyecto del chat en su último turno (por ejemplo `main` o `feature/login`; un HEAD separado no tiene rama y no muestra etiqueta). Dos chats de un mismo proyecto en ramas distintas ya no se ven iguales, y ves enseguida cuándo vas a continuar un chat en la rama equivocada. Pasa el puntero por la etiqueta para ver el nombre completo. La parte Host lee la rama (`git branch --show-current`, solo lectura) cuando un turno empieza y cuando termina; un chat sin turnos desde que instalaste esto, o una carpeta que no es un repositorio git, no muestra etiqueta. Si la fila de proyecto sobre el chat tiene el mismo nombre que la rama (por ejemplo, una carpeta de «Una rama por chat»), la fila del chat no muestra la etiqueta, pero «En una sola lista» sí la muestra. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura: Rama de Git en las filas de chat"></a> |
78
+ | **Rama de Git en las filas de chat** | <a id="feature-sessionbranch"></a>En la vista «En una sola lista» de la barra lateral, cada fila de chat muestra una pequeña etiqueta gris con la rama de git en la que estaba la carpeta del proyecto del chat en su último turno (por ejemplo `main` o `feature/login`; un HEAD separado no tiene rama y no muestra etiqueta). Dos chats de un mismo proyecto en ramas distintas ya no se ven iguales, y ves enseguida cuándo vas a continuar un chat en la rama equivocada. Pasa el puntero por la etiqueta para ver el nombre completo. La parte Host lee la rama (`git branch --show-current`, solo lectura) cuando un turno empieza y cuando termina; un chat sin turnos desde que instalaste esto, o una carpeta que no es un repositorio git, no muestra etiqueta. En «Espacio de trabajo» y «Árbol de espacios de trabajo», ninguna fila de chat muestra la etiqueta, porque el chat ya está debajo de la fila de su proyecto. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura: Rama de Git en las filas de chat"></a> |
76
79
  | **Marcar todo como leído** | <a id="feature-markprojectread"></a>En la barra lateral, haz clic en el botón **…** de un proyecto → **Marcar todo como leído**. Todos los chats de ese proyecto pierden su punto verde de no leído a la vez; los demás proyectos conservan los suyos. La opción aparece en gris (**No hay chats sin leer**) cuando el proyecto no tiene ninguno. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Captura: Marcar todo como leído"></a> |
77
80
  | **Proyectos activos primero** | <a id="feature-activeprojectsfirst"></a>Cuando un chat empieza a ejecutarse o te necesita, su proyecto sube al principio de la barra lateral con la animación de filas propia de dsh (el mismo movimiento que al arrastrarlo allí). Los proyectos terminados se quedan donde están; arrástralos a donde quieras, como siempre. Los movimientos se guardan en el orden de proyectos de dsh, así que al desactivar esta función se mantiene el orden actual. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Proyectos activos primero"></a> |
78
81
  | **Filtro de proyectos recientes** | <a id="feature-recentprojects"></a>Barra lateral → opciones de vista (icono de controles deslizantes) → **Activos en las últimas 2 horas**. Mientras está seleccionado, la barra lateral solo muestra los proyectos con un chat activo en las últimas 2 horas: un chat actualizado en ese tiempo, un chat en ejecución o en espera, el chat abierto o un chat terminado que aún no has abierto (el punto verde de “terminado” de dsh), también después de las 2 horas. Los proyectos sin un chat así se ocultan, también los nuevos y vacíos. En **Árbol de espacios de trabajo**, una carpeta superior sigue visible mientras un proyecto dentro de ella está activo, y los chats que no estuvieron activos en las últimas 2 horas también se ocultan, así que solo se muestran los chats recientes. Selecciónalo otra vez para mostrar todos los proyectos. La elección se guarda en este dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura: Filtro de proyectos recientes"></a> |
@@ -82,7 +85,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
82
85
  | **Abrir el chat en espera si estás inactivo** | <a id="feature-idleswitch"></a>Cuando un chat hace una pregunta, espera una aprobación o una revisión del plan (el punto naranja) o termina un turno que aún no has leído (el punto verde), y no usas dsh durante 30 segundos, dsh abre ese chat. Los chats naranjas se abren antes que los verdes. En cada grupo, primero se abre el que lleva más tiempo esperando; el siguiente se abre tras otros 30 segundos sin uso. Una tecla, un clic, un movimiento del ratón, la rueda de desplazamiento o un toque reinician los 30 segundos. Texto en el campo con el foco, texto seleccionado o un menú o diálogo abierto también detienen el cambio. Mientras un chat en espera está en pantalla, nada cambia. Si sales de un chat en espera sin responder, puede volver a abrirse tras los siguientes 30 segundos sin uso. Cuando se abre un chat verde, su punto desaparece; el siguiente chat verde solo se abre después de que vuelvas a usar dsh y luego pases 30 segundos sin usarlo. También funciona con dsh en segundo plano, pero dsh no pasa al frente. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Captura: Abrir el chat en espera si estás inactivo"></a> |
83
86
  | **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> |
84
87
  | **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> |
85
- | **Actualizaciones automáticas** | <a id="feature-autoupdate"></a>Al iniciar dsh, el plugin consulta la [última versión publicada en GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Si es más reciente y ya está en npm, instala esa versión exacta con el gestor de plugins propio de dsh (el mismo camino que Configuración → Plugins) y te avisa. Reinicia dsh para cargarla. **Configuración → Composer Plus → Actualizaciones de Composer Plus** muestra la versión y tiene los botones **Buscar actualizaciones** / **Actualizar ahora**. La primera vez que dsh se inicia con la nueva versión, una ventana **Novedades de Composer Plus N** muestra una vez las notas de esa versión (de la misma comprobación de actualizaciones, sin otra llamada de red); **Cerrar** o `Esc` la cierra. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
88
+ | **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. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
86
89
  | **Copia de seguridad** | <a id="feature-backup"></a>Configuración → Composer Plus → **Copia de seguridad** → **Hacer copia ahora** guarda todo tu directorio home de dsh (chats, ajustes, plugins, MCP, skills) en un único archivo comprimido en `~/Desktop/dsh-backups`, con una suma de comprobación. Los secretos se ocultan en el archivo comprimido: los archivos de credenciales, los archivos de claves (`.pem`, `.key`) y los valores token, secret y password de los ajustes yml se quedan solo en este equipo, en el `vault` de la carpeta. `cache/`, `dsh-runtimes/` y `node_modules` no entran en el archivo comprimido (dsh los vuelve a crear). Cada copia de seguridad de la lista tiene **Comprobar** (la lee completa), **Para otro equipo** (una carpeta para copiar al equipo nuevo, con la consola de rescate) y **Eliminar**. Los archivos comprimidos de dsh-backup en la misma carpeta también aparecen y funcionan. Para restaurar, sal de dsh y usa la consola de rescate. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Captura: Copia de seguridad"></a> |
87
90
  | **Copia de seguridad automática** | <a id="feature-autobackup"></a>Activa **Copia de seguridad automática** (desactivada de forma predeterminada: cada copia ocupa más o menos lo mismo que tu directorio home de dsh sin su caché). Elige la frecuencia (**Cada**: de 6 horas a 7 días, 24 horas de forma predeterminada) y cuántas copias de seguridad se conservan (**Conservar**: de 3 a 14, 7 de forma predeterminada). La hora de la próxima copia aparece bajo el interruptor; una copia fallida también aparece allí y se vuelve a intentar 30 minutos después. Cuando dsh o Composer Plus se inicia con una versión nueva, se toma una instantánea poco después del inicio, antes de que la versión nueva haya usado tus datos mucho tiempo (se conservan las dos más recientes, marcadas como **Antes de una actualización**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Captura: Copia de seguridad automática"></a> |
88
91
  | **Comprobación de registros de sesión** | <a id="feature-sessiondoctor"></a>**Comprobar registros de sesión** lee el registro de cada chat y muestra los que dsh no puede abrir (un bloque roto, una entrada cortada, un número de secuencia incorrecto). Un final incompleto no aparece en la lista: dsh lo repara por sí mismo. **Reparar desde copias de seguridad** vuelve a poner la copia de la copia de seguridad más reciente que tenga una versión sana y guarda el archivo dañado a su lado (`.corrupt-<hora>`). Los mensajes escritos después de esa copia de seguridad no están en la copia. Un chat abierto en este dsh no se repara aquí: sal de dsh y repáralo en la consola de rescate. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Captura: Comprobación de registros de sesión"></a> |
@@ -166,7 +169,9 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
166
169
  - **Comprobación del objetivo:** solo se ejecuta cuando el agente marca un `/goal` como completado en una ronda automática (o cuando haces clic en **Ejecutar ahora**). La parte Host ejecuta el comando de prueba en la carpeta del chat con el modo sandbox del chat (como la propia herramienta `bash` de dsh: la misma política de acceso a archivos; si ese sandbox no puede iniciarse, la prueba no se ejecuta y la comprobación falla). Para encontrar el comando solo lee `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` y `pytest.ini`, como archivos normales dentro de la carpeta (sin enlaces simbólicos que salgan de ella, sin FIFO). Después envía el objetivo, el chat desde que empezó el objetivo (tus mensajes, las respuestas del agente, las llamadas a herramientas recortadas a 1.000 caracteres y los últimos 2.000 caracteres de cada resultado de herramienta; sin razonamiento ni pasos revertidos; como máximo unos 60.000 caracteres, la parte más reciente), `git status --short` y el final de la salida de la prueba al modelo elegido en **Comprobación del objetivo** (de forma predeterminada, el modelo del propio chat), en una sola petición sin herramientas. La salida de las herramientas puede contener lo que leyó el agente, así que esta petición puede incluir partes de tus archivos, igual que el propio chat. No se escribe nada en el chat ni en el proyecto. Tu comando de prueba, los límites, el último resultado (con el final de su salida) y el modelo elegido están en `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (archivo solo para el propietario, los 500 chats más recientes).
167
170
  - **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.
168
171
  - **Desglose del contexto:** la parte Host solo lee el registro del chat; ninguna llamada al modelo, ningún archivo del proyecto.
172
+ - **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. Cuando inicias una tarea, la parte Host crea un chat nuevo en el proyecto que elegiste y le envía tu prompt como primer mensaje, como si lo hubieras escrito allí, así que las aprobaciones, el sandbox y el modelo del chat se aplican como siempre. Después envía el prompt (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); 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.
169
173
  - **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.
174
+ - **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.
170
175
  - **Memoria del proyecto:** desactivada hasta que la actives. Mientras está activada, después de cada turno terminado de un chat de nivel superior, la parte Host envía los mensajes nuevos del propio chat desde la última revisión (tus mensajes y las respuestas de texto del agente; sin salida de herramientas, sin razonamiento, sin contexto oculto, sin mensajes revertidos; la copia del chat padre en un chat bifurcado queda fuera; como máximo unos 16.000 caracteres) y las notas guardadas al modelo del propio chat, como una sola petición sin herramientas. Las notas son archivos Markdown en `$DSH_HOME/storages/dsh-composer-plus/memory/` (archivos solo para el propietario): `projects/<id>/` para cada carpeta de proyecto (`<id>` es un hash de la ruta real de la carpeta; `project.json` nombra la carpeta), `global/`, `journal.jsonl` (cada cambio con la línea anterior y la posterior) y `reviewed.json` (hasta dónde se leyó cada chat). No se escribe nada en la carpeta del proyecto. Se rechazan las notas que parecen una clave, un token, una contraseña o un número de identificación. Las notas de un proyecto entran en el prompt de sistema de cada chat nuevo en esa carpeta, así que llegan al modelo con cada petición de ese chat. El interruptor está en `memory.json`, en la misma carpeta. **Abrir memoria** no envía nada hasta que pulsas **Vista previa de los cambios**; entonces envía las notas que muestra y tu texto al modelo predeterminado de dsh, en una sola petición sin herramientas. Sus cambios se escriben solo con **Aplicar**, con `editor` en el registro. Tether lee y cambia las notas por la misma ruta.
171
176
  - **Copia de seguridad:** nada sale de tu equipo. Los archivos comprimidos van a `~/Desktop/dsh-backups` (archivos solo para el propietario). Los secretos no están en un archivo comprimido: los archivos de credenciales (`.credentials.yaml`, `.env`), los archivos de claves (`.pem`, `.key`, `.p12`, `.pfx`) y los valores de los ajustes token, secret, password y API key de los archivos yml se ocultan; sus copias reales se quedan en `composer-plus-vault/<archive>/`, en la misma carpeta (solo para el propietario), solo en este equipo. **Para otro equipo** no copia ningún vault: vuelve a introducir esos secretos allí. Tus registros de chat, tus ajustes y el resto del directorio home de dsh están tal cual en el archivo comprimido: mantén la carpeta privada, igual que el propio `$DSH_HOME`. La copia de seguridad lee los archivos con `O_NOFOLLOW | O_NONBLOCK`; un enlace simbólico se guarda como enlace (nunca se sigue) y un FIFO o un dispositivo se omite. El interruptor y los ajustes de la copia de seguridad automática están en `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, el interruptor de la consola de rescate en `rescue-console.json` y, mientras dsh se ejecuta, `running/host-<pid>.json` nombra cada proceso de dsh (la consola de rescate los lee para rechazar una restauración).
172
177
  - **Consola de rescate:** un menú de terminal; no abre ningún puerto de red. Una restauración solo escribe en una carpeta nueva junto al directorio home de dsh (archivos con `O_EXCL | O_NOFOLLOW`, enlaces simbólicos al final y nunca seguidos) y rechaza un archivo comprimido con un nombre inseguro (`..`, una ruta absoluta), un dispositivo o FIFO, más de una carpeta superior o una entrada bajo un enlace.
@@ -186,10 +191,10 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
186
191
  - **Un chat no continuó tras un reinicio:** Reanudar tras reiniciar estaba desactivado cuando dsh se cerró, detuviste tú mismo ese turno, el turno ya había terminado (completado o fallido), el chat estaba archivado, o había más de 20 chats en ejecución (continúan los 20 más recientes).
187
192
  - **La cola está vacía tras un reinicio:** el propio dsh vacía la cola al cerrarse. Reanudar tras reiniciar solo la devuelve en un chat que continúa; en los demás chats, envía los mensajes de nuevo. Un mensaje que quitaste justo antes del cierre puede volver: quítalo de nuevo.
188
193
  - **Abrir issue en GitHub dice «gh could not open the issue»:** el mensaje es la primera línea del propio `gh`. Ejecuta `gh auth status` en una terminal e inicia sesión con `gh auth login`; la carpeta del chat debe tener un remoto de GitHub (`git remote -v`). «not installed or not on the PATH of dsh» significa que dsh no encontró `gh`: instálalo o inicia dsh desde una terminal donde `gh` funcione.
189
- - **No hay etiqueta de rama en una fila de chat:** el chat no tuvo ningún turno desde que instalaste esta versión, su carpeta no es un repositorio git o **Rama de Git en las filas de chat** está desactivada. Después de una actualización, reinicia dsh (la parte Host registra la rama).
194
+ - **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).
190
195
  - **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.
191
196
  - **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).
192
- - **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.17.0`); consulta la nota de instalación de más arriba.
197
+ - **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.19.0`); consulta la nota de instalación de más arriba.
193
198
  - **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.
194
199
  - **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.
195
200
  - **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.
@@ -209,6 +214,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
209
214
  - **Eliminar chat** necesita el archivado de dsh (dsh 0.2.0 y posteriores). Un chat (o uno de los chats de sus subagentes) que no se detiene en 15 s, o que tiene abierto otro dsh, sigue archivado y no se mueve nada. En sistemas distintos de macOS, la carpeta de la papelera tiene que estar en el mismo disco que el historial de chats. Un chat abierto que eliminas se queda en la memoria de dsh, archivado y oculto, hasta que dsh se reinicia. Vacía tú la Papelera; dsh no lo hace.
210
215
  - La cola de dsh no tiene una acción `move`, así que la parte Host del plugin mueve el propio mensaje dentro de la cola de dsh (un solo cambio, el mismo mensaje). Los mensajes con imágenes o archivos también se mueven. Solo se mueven tus propios mensajes: una ronda de un objetivo o una respuesta a una pregunta en la cola se queda donde está. Si un mensaje empieza a enviarse mientras arrastras, no se mueve nada y un aviso lo indica.
211
216
  - dsh 0.2.1 carga una actualización de inmediato cuando la nueva versión no cambia ningún ajuste de dsh; en caso contrario, y en dsh 0.2.0, reinicia dsh para cargarla. El plugin nunca reinicia dsh por ti. Los perfiles web/CLI sin el gestor de plugins de dsh solo avisan de que hay una versión nueva.
217
+ - **Novedades de Composer Plus N** muestra las notas en el idioma de **Idioma de la aplicación**. Un idioma de interfaz con otra región recibe las notas de su idioma base (`en-GB` recibe las notas en inglés y `zh-TW`, las notas en chino de `zh`). Un idioma sin notas (uno que añade otro paquete de idioma, o `pt-PT`, que no es `pt-BR`) muestra las notas en inglés. Las notas llegan con la nueva versión. Si la copia en ejecución no tiene un archivo de notas legible (`release-notes.json`), la ventana muestra las notas en inglés de GitHub.
212
218
  - **Permitir en este chat** cuenta el límite de tiempo desde el momento en que se concede el permiso. Un nuevo límite de tiempo se aplica al instante a los permisos vigentes, así que uno más corto puede terminarlos al instante. Los permisos de la versión 1.12 y anteriores no tienen hora: después de la actualización, el agente vuelve a preguntar una vez por esas herramientas.
213
219
  - **Mantener el foco en el editor** solo devuelve el foco después de un comando `/` o una skill. Mientras dsh resuelve el comando, el editor queda en solo lectura unos milisegundos, así que las teclas que pulses en ese tiempo se pierden. Si el menú `/` de dsh sigue abierto, `Enter` elige la fila resaltada y no envía.
214
220
  - **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.
@@ -222,7 +228,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
222
228
  - **Este chat** solo cuenta los archivos que escribieron las herramientas de archivos de dsh (`write`, `edit`, `str_replace_editor`). Los archivos que cambió un comando (`bash`) no están en esta vista; aparecen en **Sin confirmar**. Sin una instantánea de Revertir turno del chat (Revertir turno desactivado, dsh-rewind-plugin instalado o un chat anterior al plugin), la vista compara con el último commit y lo indica. Revertir turno guarda las 50 instantáneas más recientes de un chat: en un chat más largo, la vista compara con la más antigua que se guardó, indica desde qué mensaje y no cuenta los cambios anteriores. **Ocultar cambios de espacios en blanco** es `git diff -w`: también se oculta una línea que solo cambió en los espacios de su interior.
223
229
  - **Abrir issue en GitHub** necesita GitHub CLI (`gh`) en el PATH de dsh y un remoto de GitHub en la carpeta del chat. Se ejecuta como máximo 60 s; si `gh` tarda más, la issue puede existir en GitHub sin su enlace en la lista (antes de volver a hacer clic, mira en GitHub: la lista solo lee el enlace de una ejecución terminada, así que otro clic puede abrir una segunda issue). Una carpeta con más de un remoto de GitHub usa el valor predeterminado del propio `gh` (`gh repo set-default`).
224
230
  - **Chats que cambiaron este archivo** solo conoce las herramientas de archivos de dsh (`write`, `edit`, `str_replace_editor`), como **Este chat**: un cambio hecho por un comando (`bash`) no aparece. Lee los 300 chats más recientes del repositorio (según cuándo se crearon) y lo indica cuando hay más; muestra como máximo 100 filas. Un archivo renombrado aparece con el nombre que escribió la herramienta. No cuenta un chat cuya carpeta está fuera del repositorio (tampoco a través de otra ruta a los mismos archivos). La primera vez que se abre después de iniciar dsh, lee todos los registros de chat del repositorio (unos 4 s para 275 chats); las siguientes veces solo lee los chats que cambiaron desde entonces.
225
- - **Rama de Git en las filas de chat** muestra la rama de la carpeta del chat cuando su último turno empezó o terminó, no la rama actual: un cambio de rama fuera de un turno aparece después del siguiente turno. Los chats de antes de esta versión no muestran etiqueta hasta su siguiente turno. La etiqueta va en el marcado de las filas de chat de dsh (dsh no tiene un espacio ahí); si una actualización de dsh cambia ese marcado, no aparece ninguna etiqueta. Si la fila de proyecto sobre el chat tiene el mismo nombre que la rama (por ejemplo, una carpeta de «Una rama por chat»), la fila del chat no muestra la etiqueta, pero «En una sola lista» sí la muestra.
231
+ - **Rama de Git en las filas de chat** muestra la rama de la carpeta del chat cuando su último turno empezó o terminó, no la rama actual: un cambio de rama fuera de un turno aparece después del siguiente turno. Los chats de antes de esta versión no muestran etiqueta hasta su siguiente turno. La etiqueta va en el marcado de las filas de chat de dsh (dsh no tiene un espacio ahí); si una actualización de dsh cambia ese marcado, no aparece ninguna etiqueta. La etiqueta solo aparece en «En una sola lista».
226
232
  - **Una rama por chat** en modo plan: dsh envía `/plan <mensaje>` como un comando, no como un mensaje, así que Composer Plus intercepta el envío del comando en el editor de dsh (no es una API pública). Si una actualización de dsh lo cambia, `/plan <mensaje>` con **Nueva rama** elegida se ejecuta en el Chat nuevo abierto como comando propio de dsh. Cuando el Host no puede activar el modo plan en el chat nuevo, la carpeta de la rama se queda y el mensaje no se envía, así que el chat nuevo no cambia archivos en el modo predeterminado.
227
233
  - **Una rama por chat**: cuando se elimina la carpeta de la rama de un chat (`<project>/.worktrees/<name>`), por ejemplo cuando el propio agente del chat quita el worktree y elimina la rama, el siguiente paso del chat lo saca de esa carpeta. El proyecto de la carpeta de la rama desaparece de la barra lateral, y el chat aparece en Sin agrupar y sigue abierto. En dsh 0.2.1 y posteriores, el chat continúa en la carpeta principal del proyecto, y el modelo recibe una nota sobre la nueva carpeta. En dsh 0.2.0, el chat conserva la carpeta eliminada: un comando allí falla hasta que empieces un chat nuevo. El proyecto de una rama eliminada que ningún chat usa también desaparece de la barra lateral: Composer Plus revisa las carpetas de ramas al iniciar y cada 30 segundos, también sin ningún filtro de la barra lateral. Mientras un chat se mueve, **Nueva rama** en el mismo repositorio responde «inténtalo de nuevo». Con el interruptor apagado, vuelve a aparecer el error propio de dsh («working-directory: directory does not exist»).
228
234
  - **Ramas en el árbol de espacios de trabajo** escribe en git sin un clic: cuando mueve un chat, devuelve la carpeta del proyecto a su rama anterior (`git switch`) y añade un worktree (`git worktree add`). Nunca borra una rama, un worktree ni un archivo. dsh no puede cambiar la carpeta de un chat, así que un chat movido es una copia (la bifurcación propia de dsh, con un id nuevo) y el chat anterior se archiva. La copia sigue con la tarea detenida; una llamada a herramienta que se ejecutaba cuando apareció la rama termina con un rechazo, y el agente la vuelve a ejecutar en la carpeta nueva. Un objetivo del chat anterior no se mueve con él. Solo se mueve un chat cuya carpeta es la carpeta principal del repositorio, y solo por una rama que creó y a la que cambió en ese turno (`git switch -c`, `git checkout -b`): una rama hecha solo con `git branch`, una carpeta con cambios sin confirmar, un worktree vinculado o una subcarpeta no mueven nada. En el árbol solo aparecen los worktrees que están directamente en `<project>/.worktrees/` y tienen una rama; un worktree separado (detached) o uno en otro lugar no aparece. La copia se abre sola solo cuando su chat era el abierto (el plugin lo lee de la fila de la barra lateral de dsh); si no, está en el proyecto de la rama.
@@ -239,8 +245,11 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
239
245
  - **Mejorar prompt** solo ve un breve resumen del proyecto, las rutas modificadas y las rutas cuyos nombres coinciden con tus palabras: no el código en sí. Por eso puede pasar por alto el archivo correcto, y solo nombra rutas que recibió. Lee el texto nuevo antes de enviarlo. No se ejecuta con un comando de barra que no sea `/goal <objetivo>`, con una palabra de control de `/goal` (`clear`, `pause`, `resume`) ni con un mensaje que tenga un chip de archivo o de símbolo (el texto nuevo es texto plano, así que perdería el chip), y un mensaje puede tener como máximo 8.000 caracteres. Para un objetivo de `/goal`, solo escribe condiciones a partir del borrador y del contexto; una condición demasiado estricta puede costar rondas del objetivo, así que léela antes de enviarla. Las imágenes siguen adjuntas: solo cambia el texto. Cada clic cuesta una llamada al modelo; un modelo potente puede tardar un minuto (`Esc` lo cancela).
240
246
  - **Comprobación del objetivo** solo comprueba una finalización que el agente hace en una ronda automática del objetivo: una finalización que pides en el chat, `/goal` y la barra del objetivo no se comprueban. El agente puede cambiar las pruebas o los archivos del comando de prueba por sí mismo; el verificador lee el chat y puede verlo, pero puede equivocarse en ambos sentidos (un «no terminado» erróneo cuesta una ronda más; un «terminado» erróneo cierra el objetivo). El verificador ve el chat y `git status`, no el código en sí. Una ejecución de prueba solo se reutiliza cuando el paso más reciente del agente que puede cambiar archivos fue su propia ejecución correcta de `bash` con exactamente el mismo comando en la misma carpeta; un comando con una tubería (`| tail`) o `&&` no se reutiliza. El presupuesto se mide cuando termina un turno, así que un turno puede superarlo. El presupuesto de tokens también cuenta las llamadas de los chats de subagentes del chat (se leen de sus registros guardados al final de cada turno, así que un chat con muchos subagentes tarda un poco más en comprobarse). La tabla de evidencias viene de la propia lectura del chat que hace el verificador: una parte que marca como verificada aún necesita que la revises tú cuando importa. `update_goal` espera mientras se ejecuta la comprobación (la prueba como máximo 15 minutos, el verificador como máximo 3 minutos). Una bifurcación recibe un nuevo id de chat, así que empieza sin el comando de prueba ni los límites propios del chat original. Cada finalización que llega al verificador cuesta una llamada al modelo.
241
247
  - **Archivos protegidos** es una barrera de protección, no un sandbox. Cubre las herramientas de archivos propias de dsh (`read`, `read_image`, `grep` en un archivo, `write`, `edit`, `str_replace_editor`). Un comando de shell (`cat .env`), un script que escribe el agente, el shell de un subagente, una herramienta MCP, un listado de `glob` y un `grep` sobre una carpeta entera aún pueden llegar a un archivo protegido. Para un límite real, usa los modos sandbox de dsh o deja los secretos fuera de la carpeta del proyecto. Los patrones conocen `*`, `**` y `?`, no `{a,b}` ni `[ab]`, y no distinguen mayúsculas de minúsculas.
248
+ - **Comandos bloqueados** es una barrera de protección, no un sandbox. Solo lee el texto del comando de las herramientas `bash` y `pwsh` de dsh. Una variable o un alias que nombra el comando (`CMD=npm; $CMD publish`), una función de shell, un archivo de script que escribe el agente, otro programa (`python -c`, `node -e`, `make`), una herramienta MCP y tu propia terminal aún pueden ejecutarlo. Una regla puede coincidir con más de lo que quieres: cualquier palabra de un comando puede ser el nombre del comando (`echo npm publish` coincide con `npm publish`), y puede haber otras palabras entre las palabras de la regla (`git push --force` también coincide con `git push origin main --force`). Alarga una regla cuando coincida con demasiado. **preguntar antes** necesita un chat que pueda preguntar: en un chat cuya política de aprobación es never (por ejemplo, un subagente delegado), dsh no puede mostrar la tarjeta, así que la llamada se rechaza con el motivo. La tarjeta de aprobación muestra el motivo en inglés. **Permitir en este chat** no responde a una tarjeta de **preguntar antes**.
242
249
  - **Continuar en un chat nuevo** envía el chat (mensajes, llamadas a herramientas y el final de cada resultado de herramienta, como máximo unos 60.000 caracteres, la parte más reciente) al modelo del propio chat. La nota de traspaso puede omitir una decisión o un archivo: léela antes de empezar. El chat nuevo solo conoce la nota y el chat enlazado (dsh adjunta el chat anterior como contexto de solo lectura); su contexto del modelo empieza pequeño y el chat anterior se queda como está. Solo una nota o un inicio por chat a la vez.
243
250
  - **Desglose del contexto** muestra estimaciones con la regla propia de dsh (unos 4 caracteres por token), la misma regla que usa el anillo de contexto de dsh; el recuento propio del modelo puede ser distinto. Las definiciones de herramientas son las de la petición más reciente. Muestra el contexto tal como lo tiene el registro del chat; un turno que se está ejecutando aparece después de su siguiente paso.
251
+ - **Pasos planificados** ahorra tokens solo cuando el modelo planifica: mientras está activada, cada solicitud lleva la herramienta `plan_next_steps` y una instrucción breve (unos 500 tokens), también en los chats donde el modelo nunca planifica. Una condición prueba solo lo que dice (por ejemplo: el código de salida de la compilación fue 0), no que el trabajo sea correcto. `ok` lee las marcas de resultado propias de dsh (`[exit code: N]`, tiempos de espera, rechazos del sandbox); un comando que falla sin un código de salida distinto de cero pasa. Los pasos se ejecutan de uno en uno; dos pasos listos a la vez vuelven al modelo. El mensaje del paso se guarda como un mensaje del asistente del modelo del chat (dsh no tiene una marca para un mensaje escrito por un plugin), por eso su texto dice que Composer Plus lo ejecutó. No está en Tether.
252
+ - **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). Las etiquetas vienen de una llamada al modelo por cada tarea iniciada: 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 prompt. Un prompt que empieza con un comando `/` que dsh conoce (`/plan`, `/goal`) se ejecuta como ese comando. **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.
244
253
  - **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.
245
254
  - **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.
246
255
  - **Copia de seguridad** usa una sola carpeta fija, `~/Desktop/dsh-backups` (la predeterminada de dsh-backup, para que sus archivos comprimidos sigan sirviendo); no hay ningún ajuste para otra carpeta. Un archivo comprimido ocupa más o menos lo mismo que el directorio home de dsh sin `cache/` ni `dsh-runtimes/` (medido: 1,6 GB de archivos dieron un archivo comprimido de 830 MB en unos 30 s en Apple Silicon; dsh siguió respondiendo). Un archivo que cambia mientras se lee se guarda tal como estaba cuando la copia de seguridad lo abrió, así que el registro de un chat abierto puede terminar en una entrada cortada, que dsh repara en su siguiente escritura. El ocultamiento encuentra un secreto en un archivo yml por el nombre de su clave en una línea (`token:`, `apiKey:`, …); un secreto en un mapa de flujo (`{token: x}`), en una lista bajo una de esas claves, en un archivo JSON (por ejemplo, la `apiKey` de un servidor MCP en un archivo `.json`) o con otro nombre se queda en el archivo comprimido. Los archivos comprimidos por tipo de dsh-backup (`dsh-t-…`) no aparecen en la lista. **Para otro equipo** copia el archivo comprimido (un clon en APFS: sin espacio adicional); el vault no va con él. **Hacer copia ahora** no elimina ninguna copia de seguridad. Una copia de seguridad automática conserva las copias más recientes que hizo Composer Plus (el ajuste **Conservar** de **Copia de seguridad automática**) y elimina sus copias más antiguas; las instantáneas anteriores a una actualización se cuentan aparte (se quedan las 2 más recientes). Los archivos comprimidos de dsh-backup nunca se eliminan: quítalos con **Eliminar**. Mientras dsh-backup siga instalado, cuenta los archivos comprimidos de Composer Plus en su propio número de copias que conserva y puede eliminarlos.
@@ -277,6 +286,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
277
286
 
278
287
  **¿Puede el agente recordar mis preferencias entre chats, como la memoria de DS Bot?** Sí, con **Memoria del proyecto** (desactivada de forma predeterminada): actívala en **Configuración → Composer Plus**. Después de cada turno, tus preferencias y decisiones duraderas se guardan como notas breves para el proyecto del chat, y cada chat nuevo de ese proyecto las lee. Pide al agente que recuerde algo y lo guarda al momento. Para ver o cambiar las notas, pulsa **Abrir memoria** en la misma fila y escribe qué cambiar.
279
288
 
289
+ **¿Puedo ver todos mis chats como un tablero kanban e iniciar chats nuevos desde él?** Sí, con **Tablero de tareas** (activado de forma predeterminada): ábrelo en la barra lateral izquierda. Cada chat es una tarjeta en **En curso**, **En revisión** (te espera) o **Hecho**. **Nueva tarea** solo pide un prompt e inicia un chat nuevo con él; haz clic en **Responder** en una tarjeta naranja para responderla sin abrir el chat.
290
+
280
291
  **¿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.
281
292
 
282
293
  **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.
@@ -301,6 +312,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
301
312
 
302
313
  **¿Cómo veo solo los archivos que cambió un chat?** Barra lateral derecha → **Cambios** → **Este chat**. Haz clic en **␣** para ocultar los cambios que solo son espacios en blanco.
303
314
 
315
+ **¿Cómo evito que el agente ejecute `npm publish` o `git push --force`?** **Configuración → Composer Plus → Comandos bloqueados**: escribe `npm publish`, elige **bloquear** o **preguntar antes** y luego haz clic en **Añadir**. **bloquear** rechaza el comando y el agente te pregunta; **preguntar antes** muestra la tarjeta de aprobación cada vez. Archivos protegidos cubre las herramientas de archivos del agente; Comandos bloqueados cubre sus comandos de shell.
316
+
304
317
  **¿Cómo evito que la revisión automática pregunte por la misma herramienta en un chat?** Haz clic en **Permitir en este chat** en la tarjeta de aprobación. Solo cubre esa herramienta exacta en ese chat, durante 1 hora por defecto; revoca el permiso desde el chip de la cabecera. Cambia el tiempo en **Configuración → Composer Plus → Permitir en este chat**.
305
318
 
306
319
  **Perdí mi iPhone. ¿Cómo evito que llegue a mi Mac?** Haz clic en **Conexión móvil**, abajo a la izquierda de la barra lateral, y haz clic en **Remove** junto a ese iPhone. Su clave deja de funcionar al instante; solo puede volver con un nuevo emparejamiento que apruebes en el Mac.
@@ -329,6 +342,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
329
342
 
330
343
  **¿Puedo enviar una foto desde mi iPhone?** Sí. En un chat de Tether, toca **+** junto al campo de mensaje → Camera, Photos (hasta 4) o Paste image. Las fotos llegan al chat del Mac como adjuntos de tu mensaje, así que el modelo las ve.
331
344
 
345
+ **¿Puede dsh ejecutar el siguiente comando sin volver a preguntar al modelo?** Sí, con **Pasos planificados** (desactivada de forma predeterminada): actívala en Configuración → Composer Plus. El modelo puede entonces planificar sus próximos comandos con una condición, por ejemplo «ejecuta las pruebas cuando la compilación pase», y Composer Plus ejecuta un paso sin una nueva llamada al modelo cuando el resultado cumple la condición. Las aprobaciones y el sandbox siguen igual.
346
+
332
347
  **¿Funciona con la app de escritorio?** Sí: Configuración → Plugins → **Añadir plugin** → `dsh-composer-plus`. Probado en dsh 0.2.0-rc.2 (escritorio y web) y 0.2.1-rc.2 (web).
333
348
 
334
349
  ## Desarrollo
@@ -393,6 +408,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
393
408
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
394
409
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
395
410
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
411
+ # Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
412
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
396
413
  ```
397
414
 
398
415
  ```sh