dsh-composer-plus 1.15.0 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.de.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; dieses Profil verwaltet die App.)
31
31
 
32
- > Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.15.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.16.1`.
33
33
 
34
34
  ## Funktionen
35
35
 
@@ -37,7 +37,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
37
37
 
38
38
  | Funktion | So nutzt du sie | Screenshot |
39
39
  |---|---|---|
40
- | **Änderungsbereich** | <a id="feature-changespanel"></a>Rechte Seitenleiste → `+` → **Änderungen**. Wähle **Nicht committet**, **Nicht gestagt**, **Gestagt** oder **Branch**, um die geänderten Dateien mit `+/-`-Zählern zu sehen. Klicke auf eine Datei, um ihren Diff zu sehen. **Letzte Runde** öffnet die eigene Prüfansicht von dsh für die letzte Runde. Klicke auf den Branch-Namen (oder wähle **Baum**), um den Branch-Baum zu sehen. Ein Klick auf einen Branch darüber springt zu diesem Branch, ein Klick auf einen Commit zeigt seine Dateien und Diffs. **Dieser Chat** listet nur die Dateien auf, die die Datei-Tools (write, edit) des offenen Chats in allen seinen Runden geschrieben haben, mit ihrem gesamten Diff seit seiner ersten Nachricht. Die Schaltfläche **␣** blendet Leerraum-Änderungen aus (`git diff -w`): Zeilen, die sich nur in der Einrückung oder den Zeilenenden geändert haben, werden nicht angezeigt. Das Menü **…** einer Datei → **Chats, die diese Datei geändert haben** listet die Chats desselben Repositorys auf, deren Schreib- oder Bearbeitungs-Tools diese Datei geändert haben, die neuesten zuerst, mit der Anfrage, die die Änderung gemacht hat; ein Klick öffnet diesen Chat bei dieser Anfrage. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Screenshot: Änderungsbereich"></a> |
40
+ | **Änderungsbereich** | <a id="feature-changespanel"></a>Rechte Seitenleiste → `+` → **Änderungen**. Die Seite öffnet sich mit **Baum**: einer Branch-Karte des Repositorys des Chats. Drei Kacheln zählen die Branches: alle, die gemergten und die, die auf einen Merge warten. Klicke auf eine Kachel, um nur diese Branches anzuzeigen; klicke erneut darauf, um alle anzuzeigen. Jeder Branch ist ein Kasten mit seinem letzten Commit: grün, wenn der Haupt-Branch seine Arbeit enthält, orange, wenn nicht, blau für den Haupt-Branch. Ein Pfeil führt von jedem Branch zu dem Branch, der ihn aufgenommen hat (✅ **Gemergt**), oder zu dem Branch, von dem er ausging (⏳ **Wartet**, gestrichelt). Klicke auf einen Kasten, um die Commits des Branches zu sehen, und dann auf einen Commit, um seine Dateien und Diffs zu sehen. Klicke auf **Gemergt**, um die Dateien des Merge-Commits zu sehen, oder auf **Wartet**, um die Dateien zu sehen, die der Branch in sein Ziel bringt. Ein Remote-Branch erscheint nur, wenn kein lokaler Branch denselben Namen hat. Wähle im Modusmenü **Nicht committet**, **Nicht gestagt**, **Gestagt** oder **Branch**, um die geänderten Dateien mit `+/-`-Zählern zu sehen. Klicke auf eine Datei, um ihren Diff zu sehen. **Letzte Runde** öffnet die eigene Prüfansicht von dsh für die letzte Runde. **Dieser Chat** listet nur die Dateien auf, die die Datei-Tools (write, edit) des offenen Chats in allen seinen Runden geschrieben haben, mit ihrem gesamten Diff seit seiner ersten Nachricht. Die Schaltfläche **␣** blendet Leerraum-Änderungen aus (`git diff -w`): Zeilen, die sich nur in der Einrückung oder den Zeilenenden geändert haben, werden nicht angezeigt. Das Menü **…** einer Datei → **Chats, die diese Datei geändert haben** listet die Chats desselben Repositorys auf, deren Schreib- oder Bearbeitungs-Tools diese Datei geändert haben, die neuesten zuerst, mit der Anfrage, die die Änderung gemacht hat; ein Klick öffnet diesen Chat bei dieser Anfrage. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Screenshot: Änderungsbereich"></a> |
41
41
  | **Funktionsideen** | <a id="feature-featureideas"></a>Rechte Seitenleiste → `+` → **Funktionsideen** → **Funktionen vorschlagen**. Das eigene Modell des Chats liest eine kurze Zusammenfassung des Projekts (Dateien der obersten Ebene, den Anfang von README und Manifest, eine Gliederung des restlichen README, die Titel der letzten Commits). Dann schlägt es bis zu 8 Funktionen vor. Sie erscheinen als Kartenstapel in der Oberflächensprache von dsh. Wische eine Karte nach rechts (oder klicke auf **✓** oder drücke `→`; die Karte fliegt in jedem Fall zu ihrer Seite hinaus), um einen neuen Chat im selben Projekt zu starten. Dieser Chat startet im Planmodus mit der Idee als Anfrage. So ändert sich nichts, bevor du den Plan genehmigst. Um den Plan auszulassen, klicke auf **▶ Sofort umsetzen** (oder drücke `↑`; die Karte fliegt nach oben hinaus). Dann startet der neue Chat sofort mit der Idee als normaler Anfrage, und das Modell nimmt die Änderung vor und führt seine Prüfungen aus (Genehmigungen gelten wie gewohnt). Wische nach links (oder **✕** oder `←`), um die Karte zu überspringen. **Rückgängig** (oder `Z`) holt eine übersprungene Karte zurück. Klicke auf **↓** (oder drücke `↓`), um eine gute Idee für später zu merken. Sie kommt in die Liste **Später** des Projekts. Jeder Chat im selben Projektordner zeigt diese Liste (auch nach einem Neustart). **Später (N)** öffnet die Liste. **Planen** startet für die Idee denselben Chat im Planmodus, **Sofort umsetzen** den Chat ohne Plan. Beide nehmen die Idee von der Liste. **Alle planen (N)** startet einen einzigen Chat im Planmodus für alle Ideen der Liste. So werden gemeinsame Teile nur einmal geplant. **Aus der Liste entfernen** löscht sie. **Als Checkliste kopieren** kopiert die ganze Liste als Markdown-Checkliste (`- [ ] Title — Summary`, eine Zeile pro Idee) in die Zwischenablage, für einen Issue-Tracker oder eine TODO-Datei; dabei gibt es keinen Netzwerkaufruf. **GitHub-Issue öffnen** an einer Idee öffnet im GitHub-Repository des Projekts ein Issue mit ihrem Titel und ihrer Zusammenfassung (und warum sie wichtig ist), mit deiner eigenen Anmeldung bei GitHub CLI (`gh`); danach steht der Link **Issue #N** neben der Idee und öffnet das Issue. **Weitere Ideen** fügt Karten hinzu. Für Ideen zu nur einem Bereich tippe ein kurzes **Fokusthema** in das Feld neben **Funktionen vorschlagen** (höchstens 80 Zeichen; `Enter` schlägt ebenfalls vor), oder klicke auf eines der festen Themen darunter: **Leistung**, **Barrierefreiheit**, **Tests**, **Sicherheit**, **Bedienbarkeit** oder **Dokumentation** (ein erneuter Klick leert es). Das Modell schlägt dann nur Funktionen zu diesem Thema vor; ein leeres Feld bedeutet jede Funktion. In einem Projekt wird keine Idee zweimal vorgeschlagen: Jede vorgeschlagene Idee (übersprungen, gemerkt oder gestartet) kommt in den **Verlauf** des Projekts. Das Modell erhält die Anweisung, diese Ideen nicht erneut vorzuschlagen, und ein wiederholter Titel wird verworfen. **Verlauf** listet sie mit **Gestartet** oder **Vorgeschlagen**; **Vergessen** (oder **Alle vergessen**) lässt eine Idee wieder zu; eine Idee, die noch in der Liste **Später** steht, bleibt aus den Vorschlägen heraus, bis du sie dort entfernst. Das Modell läuft nur, wenn du klickst. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Screenshot: Funktionsideen"></a> |
42
42
  | **Inhaltssuche** | <a id="feature-contentsearch"></a>Die eigene Seitenleisten-Suche von dsh (die Lupe neben **Arbeitsbereiche**; `Cmd+K` in der Desktop-App, `Cmd+Alt+K` im Browser) findet Chats auch über die Wörter in deinen Nachrichten und in den Antworten, nicht nur über den Titel. Unter dem Chat zeigt sie den passenden Text. dsh hat diese Suche bereits, liefert sie aber ausgeschaltet aus. Diese Funktion schaltet sie ein, mit einer Suchindex-Datei auf deinem Computer. Der Index entsteht bei der ersten Suche nach einem Start (etwa 15 s für 250 Chats, siehe Grenzen) und bleibt für die nächsten Starts erhalten. Standardmäßig an; eine Änderung gilt, nachdem du dsh neu gestartet hast. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Screenshot: Inhaltssuche"></a> |
43
43
  | **Runde zurücknehmen** | <a id="feature-turnrollback"></a>Fahre mit der Maus über eine deiner Nachrichten und klicke auf **↶** (neben Kopieren). **Nur Chat** nimmt diese Nachricht und alles danach (Antworten, Tool-Aufrufe) aus dem Chat und aus dem Kontext des Modells. Die Nachricht kommt zurück ins Eingabefeld: Ändere sie und sende sie erneut. **Chat und Dateien** listet zuerst die Projektdateien auf, die sich seit dieser Nachricht geändert haben. Dann setzt es auch diese Dateien auf ihren alten Stand zurück, einschließlich Änderungen durch Befehle (`bash`), nicht nur durch die Bearbeitungs-Tools von dsh. Eine laufende Runde stoppt zuerst. Das Chatprotokoll wird nie umgeschrieben: Eine verborgene Markierung blendet den zurückgenommenen Teil aus, so wie `/compact` von dsh alte Nachrichten ausblendet. Wenn [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) installiert ist, übernimmt es diese Aufgabe, und Composer Plus zeigt keine zweite Schaltfläche. Nach dem Zurücknehmen erscheint über dem Eingabefeld eine Leiste mit **Wiederholen**. Sie startet einen neuen Chat ab dem Moment direkt vor dem Zurücknehmen (dieselben Nachrichten und derselbe Kontext). Mit **Chat und Dateien** holt sie auch die Dateien zurück. Eine Datei, die du nach dem Zurücknehmen geändert hast, wird aufgelistet und bleibt erhalten, außer du setzt das Häkchen, das sie überschreibt. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Screenshot: Runde zurücknehmen"></a> |
@@ -46,10 +46,12 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
46
46
  | **Eingabeverlauf** | <a id="feature-inputhistory"></a>Drücke in einem leeren Eingabefeld `↑` / `↓`, um wie in einem Terminal durch deine gesendeten Nachrichten zu gehen. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Screenshot: Eingabeverlauf"></a> |
47
47
  | **Planmodus mit Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` fügt `/plan ` am Anfang des Entwurfs ein (erneutes Drücken entfernt es wieder). Wenn der Chat schon im Planmodus ist, verlässt `Shift+Tab` den Planmodus. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Screenshot: Planmodus mit Shift+Tab"></a> |
48
48
  | **Fokus im Eingabefeld behalten** | <a id="feature-keepfocus"></a>Nachdem du einen `/`-Befehl oder einen Skill gesendet hast, bleibt der Cursor im Eingabefeld, und du kannst sofort weitertippen. Das gilt auch für Tastaturmakros, die einen Befehl tippen und `Enter` drücken. dsh schaltet das Eingabefeld schreibgeschützt, während es den Befehl auflöst, und der Browser nimmt dann den Fokus weg. Diese Funktion setzt den Fokus zurück, außer ein Menü, ein Dialog oder ein anderes Feld hat ihn. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Screenshot: Fokus im Eingabefeld behalten"></a> |
49
+ | **Fragekarte an das Fenster anpassen** | <a id="feature-questionfit"></a>Wenn der Agent dir eine Frage stellt, scrollen Frage und Antworten zusammen in der Karte, und **Überspringen** und **Senden** bleiben unten sichtbar. Die Karte nutzt die Höhe des Fensters (abzüglich 200 px für die Chat-Kopfzeile und einen Streifen des Chats), sie wächst und schrumpft also mit dem Fenster. Ohne diese Funktion begrenzt dsh die Karte auf 60 % des Fensters (höchstens 520 px), und nur die Antworten scrollen: Eine lange Frage kann ihr eigenes Ende, die Antworten und die Schaltflächen aus der Karte drängen. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Screenshot: Fragekarte an das Fenster anpassen"></a> |
49
50
  | **Fortsetzen mit einem Klick** | <a id="feature-continuebutton"></a>Nach einer gestoppten, fehlgeschlagenen oder abgebrochenen Runde zeigt ein leeres Eingabefeld **▶**. Ein Klick setzt das vorhandene Gespräch fort. Dabei schreibt er nichts ins Eingabefeld und fügt keine sichtbare Chatnachricht hinzu. (Das Modell erhält einen kurzen verborgenen Hinweis „mach dort weiter, wo du aufgehört hast“, weil manche Anbieter, etwa Claude, eine Anfrage ablehnen, die mit einer Assistentenantwort endet.) Nachrichten in der Warteschlange bleiben dort: ▶ setzt nur die gestoppte Aufgabe fort, danach läuft die Warteschlange. Nach einer abgeschlossenen Runde bleibt die normale Senden-Schaltfläche. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Screenshot: Fortsetzen mit einem Klick"></a> |
50
51
  | **Nach Neustart fortsetzen** | <a id="feature-resumeafterrestart"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Wenn du dsh beendest (oder dsh sich schließt), während ein Chat arbeitet, macht dieser Chat von selbst weiter, sobald du dsh wieder öffnest. Er bekommt denselben verborgenen Hinweis wie bei Fortsetzen mit einem Klick. Lief gerade eine Zielrunde (`/goal`), geht das Ziel mit seiner nächsten Runde weiter (dsh pausiert Ziele bei jedem Start, bis du sie fortsetzt). Chats, die du gestoppt hast, die abgeschlossen sind oder die fehlgeschlagen sind, werden nicht fortgesetzt. dsh selbst hat dafür keine Einstellung: Es markiert eine solche Runde nur als unterbrochen. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Screenshot: Nach Neustart fortsetzen"></a> |
51
52
  | **Warteschlange per Drag-and-drop** | <a id="feature-queuereorder"></a>Eingereihte Nachrichten bekommen einen Griff (⠿). Ziehe ihn, um die Reihenfolge zu ändern, oder setze den Fokus auf den Griff und drücke `↑` / `↓`. `Esc` bricht ab. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Screenshot: Warteschlange per Drag-and-drop"></a> |
52
- | **Eingereihte Nachricht direkt bearbeiten** | <a id="feature-queueedit"></a>Doppelklicke auf eine eingereihte Nachricht. Sie wird zum eigenen Bearbeitungsfeld von dsh: Ändere den Text und drücke `Enter` zum Speichern oder `Esc` zum Abbrechen. Die Nachricht behält ihren Platz in der Warteschlange. Nachrichten mit Bildern oder Dateien lassen sich so nicht bearbeiten (die Warteschlange von dsh bearbeitet nur Text). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Screenshot: Eingereihte Nachricht direkt bearbeiten"></a> |
53
+ | **Eingereihte Nachricht direkt bearbeiten** | <a id="feature-queueedit"></a>Doppelklicke auf eine eingereihte Nachricht oder klicke auf ihre Schaltfläche „Bearbeiten“ (**Eingereihte Nachricht bearbeiten**). In der Zeile öffnet sich ein Editor: Ändere den Text, entferne ein Bild oder eine Datei mit dem ✕ daran, oder füge mit der Büroklammer (**Bilder oder Dateien hinzufügen**) oder durch Einfügen eines Bildes neue hinzu. `Enter` speichert, `Esc` bricht ab, `Shift+Enter` fügt eine Zeile hinzu. Die Nachricht behält ihren Platz in der Warteschlange, und die Bilder und Dateien, die du behältst, bleiben unverändert. Solange der Editor offen ist, lässt sich die Warteschlange nicht umsortieren. In Tether: Menü der eingereihten Nachricht → Edit. | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Screenshot: Eingereihte Nachricht direkt bearbeiten"></a> |
54
+ | **Neue Nachricht nach Stoppen zuerst** | <a id="feature-stopsendfirst"></a>Standardmäßig an. Stoppe einen Chat, während Nachrichten in seiner Warteschlange warten, und sende dann eine neue Nachricht: Sie läuft sofort und allein. Die eingereihten Nachrichten behalten ihre Reihenfolge und laufen danach, eine pro Runde. Ohne diese Funktion hängt dsh die neue Nachricht ans Ende der Warteschlange und führt stattdessen die erste eingereihte Nachricht aus, sodass die neue zuletzt läuft. Eine Nachricht, die du sendest, während der Chat arbeitet, wartet weiterhin am Ende der Warteschlange. | <a href="assets/features/stopSendFirst.webp"><img src="assets/features/stopSendFirst.webp" width="160" alt="Screenshot: Neue Nachricht nach Stoppen zuerst"></a> |
53
55
  | **Sitzungslink kopieren** | <a id="feature-copydeeplink"></a>Rechtsklick auf einen Chat in der Seitenleiste → **Sitzungslink kopieren**. Füge den Link `dsh-session:…` in einen anderen Chat ein, um diesen Chat als schreibgeschützten Kontext anzuhängen. dsh 0.2.1 hat ein eigenes **Sitzungs-ID kopieren**, das nur die reine ID kopiert. Dieser Eintrag steht direkt danach. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Screenshot: Sitzungslink kopieren"></a> |
54
56
  | **Nachrichtenlink kopieren** | <a id="feature-copymessagelink"></a>Fahre mit der Maus über eine Nachricht und klicke auf **🔗** (in ihrer Aktionszeile, bei einer Antwort neben der Uhrzeit). Der Link ist der Sitzungslink plus die Nachrichtennummer: `dsh-session:…#42`. Füge ihn in eine Nachricht ein und sende sie. Ab dsh 0.2.1 erscheint der Link als Chip. Ein Klick darauf öffnet diesen Chat, scrollt zur Nachricht und hebt sie 2 Sekunden lang hervor. Wie ein Sitzungslink hängt er diesen Chat auch als schreibgeschützten Kontext an. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Screenshot: Nachrichtenlink kopieren"></a> |
55
57
  | **Chat als Markdown exportieren** | <a id="feature-exportmarkdown"></a>Rechtsklick auf einen Chat in der Seitenleiste (oder sein Menü **…** öffnen) → **Als Markdown exportieren…**. Ein Dialog zeigt, wie viele Nachrichten der Chat hat. **In die Zwischenablage kopieren** kopiert den Chat als Markdown, **.md-Datei speichern** speichert ihn als `<chat title>.md` über den Download des Browsers (dsh-Desktop: in deinen Ordner Downloads oder über einen Speichern-Dialog, je nach Einstellung deines Systems). Die Datei enthält den Chattitel, den Projektnamen und das Datum, dann pro Nachricht einen Abschnitt `## Du` oder `## Assistent`. Codeblöcke bleiben, wie sie sind; ein Codeblock, den eine Nachricht offen lässt, wird geschlossen. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Screenshot: Chat als Markdown exportieren"></a> |
@@ -57,23 +59,30 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
57
59
  | **Projektsuche im neuen Chat** | <a id="feature-projectpicker"></a>Neuer Chat → die Projektschaltfläche über dem Eingabefeld. Die Projekte erscheinen in A–Z-Reihenfolge, oben mit dem Feld **Projekte durchsuchen**. Gib einen Teil eines Namens ein (Groß- und Kleinschreibung und Akzente spielen keine Rolle) und drücke `Enter`, um den ersten Treffer zu wählen. Passt nichts, erscheint **Kein passendes Projekt**. Die gespeicherte Projektreihenfolge von dsh in der Seitenleiste ändert sich nicht. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Screenshot: Projektsuche im neuen Chat"></a> |
58
60
  | **Standard-Arbeitsbereich für Neue Sitzung** | <a id="feature-defaultworkspace"></a>Einstellungen → Composer Plus → **Standard-Arbeitsbereich für Neue Sitzung** → **Neue Sitzung öffnen in**: Wähle ein Projekt oder **Allgemeiner Ordner (default-workspace)** (der Standard: der eigene Ordner von dsh, `Documents/deepseek-harness/default-workspace`, der bei der ersten Nutzung entsteht). Dann öffnet die Schaltfläche **Neue Sitzung** oben in der Seitenleiste (und ihr Tastenkürzel) den neuen Chat immer dort, auch während ein Chat eines anderen Projekts offen ist. Das `+` neben einem Projekt öffnet weiterhin dieses Projekt, und die Projektschaltfläche über dem Eingabefeld des neuen Chats wechselt weiterhin das Projekt. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Screenshot: Standard-Arbeitsbereich für Neue Sitzung"></a> |
59
61
  | **Im Chat suchen** | <a id="feature-findinchat"></a>Drücke in einem Chat `Cmd+F` auf einem Mac (`Ctrl+F` unter Windows und Linux): Über dem Chat öffnet sich ein Suchfeld. Tippe ein Wort: Jeder Treffer in den Nachrichten und Antworten auf dem Bildschirm wird hervorgehoben, der aktuelle in einer kräftigeren Farbe, und das Feld zeigt n / gesamt. `Enter` oder `↓` springt zum nächsten Treffer und `Shift+Enter` oder `↑` zum vorherigen (auch die Pfeilschaltflächen); der Chat scrollt den Treffer in die Mitte. Groß- und Kleinschreibung, Akzente und das türkische punktlose ı spielen keine Rolle. `Esc` schließt das Feld und setzt den Cursor wieder dorthin, wo er war. Die Suche folgt dem Chat, während eine Antwort eintrifft. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Screenshot: Im Chat suchen"></a> |
60
- | **Ein Branch pro Chat** | <a id="feature-worktreechats"></a>Neuer Chat → die Schaltfläche main (Branch-Symbol) zwischen der Projektschaltfläche und der Modusschaltfläche → **Neuer Branch**. Gib dann die erste Nachricht ein und sende sie. Die erste Nachricht kann Bilder und Dateien enthalten. Die KI benennt den Branch (`feat/…`, `fix/…`) nach dieser Nachricht, Composer Plus legt dafür einen Git-Worktree in `<project>/.worktrees/` an, kopiert die ignorierten Dateien, die `.worktreeinclude` auflistet (zum Beispiel `.env` und `node_modules/`), und öffnet dort einen neuen Chat mit deiner Nachricht. Die Kopfzeile des offenen Chats zeigt ⑂ Branch · N Änderungen · ↑ ↓ (oder **nicht gepusht**); klicke darauf, um **Änderungen** zu öffnen. Dasselbe Menü listet die offenen Worktrees auf: Wähle einen, um darin einen Chat zu starten. Um die Branch-Ordner in der Seitenleiste in ihrem Projekt zu sehen, wähle in dsh **Ansichtsoptionen** → **Arbeitsbereichsbaum**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Screenshot: Ein Branch pro Chat"></a> |
62
+ | **Ein Branch pro Chat** | <a id="feature-worktreechats"></a>Im Bildschirm „Neuer Chat“ zeigt die Branch-Schaltfläche (Branch-Symbol) zwischen der Projektschaltfläche und der Modusschaltfläche standardmäßig **Neuer Branch**. Gib die erste Nachricht ein und sende sie. Um auf dem aktuellen Branch zu bleiben, wähle in derselben Schaltfläche „Aktueller Branch (main)“. Die erste Nachricht kann Bilder und Dateien enthalten. Im Planmodus startet auch der neue Chat im Planmodus: Sende die Nachricht als `/plan <Nachricht>` (Shift+Tab) oder schalte vorher den Bildschirm „Neuer Chat“ in den Planmodus. Die KI benennt den Branch (`feat/…`, `fix/…`) nach dieser Nachricht, Composer Plus legt dafür einen Git-Worktree in `<project>/.worktrees/` an, kopiert die ignorierten Dateien, die `.worktreeinclude` auflistet (zum Beispiel `.env` und `node_modules/`), und öffnet dort einen neuen Chat mit deiner Nachricht. Die Kopfzeile des offenen Chats zeigt ⑂ Branch · N Änderungen · ↑ ↓ (oder **nicht gepusht**); klicke darauf, um **Änderungen** zu öffnen. Dasselbe Menü listet die offenen Worktrees auf: Wähle einen, um darin einen Chat zu starten. Um die Branch-Ordner in der Seitenleiste in ihrem Projekt zu sehen, wähle in dsh **Ansichtsoptionen** → **Arbeitsbereichsbaum**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Screenshot: Ein Branch pro Chat"></a> |
63
+ | **Branches im Arbeitsbereichsbaum** | <a id="feature-branchtree"></a>Einstellungen → Composer Plus → **Branches im Arbeitsbereichsbaum** (standardmäßig aus). Jeder Branch mit einem Worktree-Ordner in `<project>/.worktrees/` erscheint dann als Projekt in seinem Projekt; wähle in dsh **Ansichtsoptionen** → **Arbeitsbereichsbaum**, um ihn verschachtelt zu sehen. Ein Branch, dessen Ordner gelöscht wird, verschwindet aus der Liste, und dsh zeigt seine Chats unter **Ohne Gruppe**. Wenn der Agent eines Chats im Projektordner einen Branch erstellt und zu ihm wechselt (`git switch -c`, `git checkout -b`), während der Ordner keine nicht committeten Änderungen hat, geht der Projektordner auf seinen vorherigen Branch zurück, der Branch bekommt einen eigenen Ordner, und der Chat zieht dorthin um: Eine Kopie öffnet sich im Branch-Projekt und setzt die Aufgabe fort, der alte Chat wird archiviert. Die Liste wird beim Start, alle 30 Sekunden, nach jedem Durchgang und bei der Rückkehr ins Fenster geprüft. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Screenshot: Branches im Arbeitsbereichsbaum"></a> |
61
64
  | **Vorhersage der nächsten Nachricht** | <a id="feature-nextprediction"></a>Standardmäßig an: Du kannst die Funktion unter **Einstellungen → Composer Plus** ausschalten. Wenn der Agent eine Runde beendet (keine gestoppte oder fehlgeschlagene), zeigt das leere Eingabefeld in Grau eine Vermutung deiner nächsten Nachricht, mit dem Hinweis **Tab zum Übernehmen**. `Tab` setzt den Text ins Eingabefeld, sendet ihn aber nicht. `Esc` blendet die Vermutung für diese Runde aus. Auch Tippen blendet sie aus, und eine neue Runde ersetzt sie. Das Menü **Modell** unter dem Schalter listet die eigenen Modelle von dsh (dieselbe Liste wie im Modellmenü von dsh). **dsh-Standard** ist vorausgewählt und folgt dem Standardmodell von dsh. Jede beendete Runde kostet einen kurzen Modellaufruf. In Tether erscheint die Vermutung über dem leeren Eingabefeld: Tippe darauf, um sie ins Feld zu setzen. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Screenshot: Vorhersage der nächsten Nachricht"></a> |
62
65
  | **Beim Tippen vervollständigen** | <a id="feature-typingcompletion"></a>Standardmäßig aus: Du kannst die Funktion unter **Einstellungen → Composer Plus** einschalten. Während du tippst, zeigt grauer Text direkt nach dem Cursor, wie deine Nachricht weitergehen kann. `Tab` fügt ihn der Nachricht hinzu, sendet sie aber nicht. `Esc` blendet ihn aus. Er schlägt nur deine eigenen nächsten Wörter vor: nie eine Antwort an dich und keine erfundenen Fehlertexte oder Namen. Wenn die Nachricht fertig aussieht oder das Modell nicht sicher ist, erscheint nichts. Wenn du die nächsten Buchstaben des grauen Texts tippst, bleibt er stehen, ohne neuen Modellaufruf. Die Funktion hat ein eigenes Menü **Modell** unter ihrem Schalter. Der erste Eintrag, **Wie Vorhersage der nächsten Nachricht**, nutzt das Modell von **Vorhersage der nächsten Nachricht** (das ist der Standard). Wähle ein anderes Modell, um für jede Funktion ein eigenes Modell zu nutzen, zum Beispiel ein schnelleres Modell für Vervollständigungen. Sie macht bei jeder Pause beim Tippen einen Modellaufruf und verbraucht deshalb viel mehr Tokens als die Vorhersage: Wähle ein schnelles, günstiges Modell. Sie läuft nicht bei einem Slash-Befehl, bei einer Nachricht mit einem Datei-Chip oder wenn der Cursor nicht am Ende steht. In Tether erscheint der Rest beim Tippen über dem Feld: Tippe darauf, um ihn hinzuzufügen. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Screenshot: Beim Tippen vervollständigen"></a> |
63
66
  | **Prompt verbessern** | <a id="feature-promptimprove"></a>Tippe eine grobe Anfrage und klicke dann auf den Zauberstab (**Prompt verbessern**) neben dem Modellmenü. Ein Modellaufruf schreibt sie als klareren Prompt neu: zuerst das Ziel, kurze nummerierte Schritte, wenn es mehrere Teile gibt, und die Prüfung, die laufen soll. Die Funktion liest diesen Chat (ohne zurückgenommene Nachrichten), README, AGENTS.md und Manifest des Projekts, die geänderten Dateien und die Dateien, deren Namen zu deinen Wörtern passen, und behält deine Sprache bei. Sie erfindet nie Dateinamen. Der neue Text ersetzt deinen Entwurf, wird aber nicht gesendet: Lies ihn, bearbeite ihn und drücke dann `Enter`. `Cmd/Ctrl+Z` holt deinen Text in einem Schritt zurück, ebenso die Schaltfläche (**Verbesserung rückgängig machen**). Wenn du tippst, während sie arbeitet, bleibt dein neuer Text stehen. `Esc` oder ein zweiter Klick bricht ab. Sie hat ein eigenes Menü **Modell** in den Einstellungen (Standard: **Wie das Modell des Chats**). Nicht für Slash-Befehle oder eine Nachricht mit einem Datei-Chip. In Tether ist der Zauberstab neben dem Feld. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Screenshot: Prompt verbessern"></a> |
64
67
  | **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. Schlägt eine Prüfung fehl, bleibt das Ziel aktiv, der Agent liest den Grund, und der nächste Durchlauf geht weiter. Eine Zeile unter der Zielleiste (**Zielprüfung**) zeigt den Test und das letzte Ergebnis. **Bearbeiten** legt deinen eigenen Testbefehl und ein Zeit- oder Token-Limit fest; über dem Limit wird das Ziel blockiert. **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> |
68
+ | **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. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Screenshot: Projektgedächtnis"></a> |
65
69
  | **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> |
66
- | **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. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Projektstatus"></a> |
70
+ | **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> |
67
71
  | **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 zeigt seine kurze Commit-ID in Klammern). 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> |
68
72
  | **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> |
69
73
  | **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> |
70
- | **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. 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> |
74
+ | **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> |
71
75
  | **Alle Projekte einklappen** | <a id="feature-collapseprojects"></a>Solange ein Projekt in der Seitenleiste geöffnet ist, erscheint neben den Ansichtsoptionen (Schieberegler-Symbol) eine Schaltfläche. Klicke darauf, um alle geöffneten Projekte auf einmal zu schließen, zum Beispiel 3 geöffnete von 5 Projekten. Die Schaltfläche verschwindet wieder, wenn kein Projekt geöffnet ist. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Screenshot: Alle Projekte einklappen"></a> |
72
76
  | **Nach Status sortieren** | <a id="feature-statusorder"></a>Seitenleiste → Ansichtsoptionen → **Sortieren nach** → **Nach Status** (mit **In einer Liste**). Fertige Chats kommen zuerst (mit dem „Fertig“-Punkt von dsh, den auch eine mit Fehler beendete Runde bekommt). Danach kommen laufende oder wartende Chats, dann Chats mit einer aktiven Automatisierungsaufgabe und dann der Rest in der Reihenfolge von dsh. Wenn du einen fertigen Chat öffnest, rückt er nach unten. Nur die Ansicht ändert sich: Wähle **Manuell** oder **Zuletzt aktualisiert**, um zurückzugehen. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Screenshot: Nach Status sortieren"></a> |
73
77
  | **Hintergrundbenachrichtigungen** | <a id="feature-notifications"></a>Solange dsh im Hintergrund läuft, bekommst du eine Benachrichtigung, wenn eine Runde fertig ist (erste Zeile der Antwort). Du bekommst auch eine, wenn ein Chat wirklich auf dich wartet: auf eine Genehmigung (Toolname), eine Antwort (die Frage) oder eine Planprüfung. Eine Anfrage muss 1,5 s später noch offen sein. So bleiben automatisch beantwortete Genehmigungen (Freigaben der automatischen Prüfung, andere Plugins) stumm. Eine Benachrichtigung verschwindet, sobald ihre Anfrage beantwortet ist. Das Kennzeichen im Dock bzw. in der Taskleiste zählt die wartenden Chats. Ein Klick öffnet den Chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Screenshot: Hintergrundbenachrichtigungen"></a> |
78
+ | **Wartenden Chat bei Inaktivität öffnen** | <a id="feature-idleswitch"></a>Wenn ein Chat eine Frage stellt oder auf eine Genehmigung oder eine Planprüfung wartet (der orangefarbene Punkt) und du dsh 30 Sekunden lang nicht benutzt, öffnet dsh diesen Chat. Warten mehrere Chats, ö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. 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> |
74
79
  | **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> |
75
80
  | **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> |
76
81
  | **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> |
82
+ | **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> |
83
+ | **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> |
84
+ | **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> |
85
+ | **Rettungskonsole** | <a id="feature-rescueconsole"></a>Jede Sicherung legt auch eine Rettungskonsole in den Sicherungsordner. Wenn dsh geschlossen ist oder nicht startet, öffne `Composer Plus Rescue` in diesem Ordner (macOS: `Composer Plus Rescue.command`): Ein Menü in einem Terminalfenster listet Sicherungen auf, prüft sie und stellt sie wieder her, und es prüft und repariert Sitzungsprotokolle. Sie öffnet keinen Netzwerkport. Eine Wiederherstellung bittet dich, `RESTORE` einzugeben, behält dein aktuelles dsh-Home als `.dsh.pre-restore-<Zeit>`, legt die maskierten Geheimnisse aus dem vault zurück und verschiebt `cache/`, `dsh-runtimes/` und `node_modules` aus dem alten Ordner. Sie funktioniert ohne dsh: Sie nutzt Node.js oder die App DeepSeek Harness selbst. Auf einem neuen Computer kopierst du den Ordner von **Für einen anderen Computer** und öffnest dort `Composer Plus Rescue`. | <a href="assets/features/rescueConsole.webp"><img src="assets/features/rescueConsole.webp" width="160" alt="Screenshot: Rettungskonsole"></a> |
77
86
 
78
87
  <!-- END GENERATED FEATURES -->
79
88
 
@@ -117,7 +126,7 @@ Jedes Paket hat 3.280 Texte: jeden Oberflächentext von dsh `0.2.0-rc.2` und `0.
117
126
  | `Esc` | leeres Eingabefeld mit einer Vorhersage | Vorhersage ausblenden |
118
127
  | `Cmd/Ctrl+Z` | Eingabefeld, nach **Prompt verbessern** | den Text zurückholen, den du getippt hast |
119
128
  | `Esc` | Eingabefeld, während **Prompt verbessern** läuft | Verbesserung abbrechen |
120
- | `Enter` / `Esc` | eingereihte Nachricht, auf die du doppelgeklickt hast | Bearbeitung speichern / abbrechen |
129
+ | `Enter` / `Esc` | Editor der eingereihten Nachricht | Bearbeitung speichern / abbrechen |
121
130
  | `Cmd+F` auf einem Mac, `Ctrl+F` unter Windows und Linux | geöffneter Chat | **Im Chat suchen** öffnen |
122
131
  | `Enter` / `Shift+Enter`, `↓` / `↑` | Feld von **Im Chat suchen** | nächster / vorheriger Treffer |
123
132
  | `Esc` | Feld von **Im Chat suchen** | Feld schließen |
@@ -151,6 +160,9 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
151
160
  - **Beim Tippen vervollständigen:** aus, bis du die Funktion einschaltest. Solange sie an ist, sendet die Host-Hälfte bei jeder Pause beim Tippen den bisher getippten Text sowie deine eigenen Nachrichten im Chat und die Textantworten des Agenten (keine Werkzeugausgabe, kein verborgener Kontext, kein Reasoning), höchstens etwa 3.000 Zeichen aus dem Chat, an das unter **Beim Tippen vervollständigen** gewählte Modell (standardmäßig das Modell von **Vorhersage der nächsten Nachricht**). Eine neuere Pause stoppt die ältere Anfrage. Im Chat wird nichts gespeichert. Der Schalter liegt in `$DSH_HOME/storages/dsh-composer-plus/complete.json` (Datei nur für den Besitzer).
152
161
  - **Prompt verbessern:** Nichts läuft, bis du auf den Zauberstab klickst. Dann sendet die Host-Hälfte deinen Entwurf, deine eigenen Nachrichten im Chat und die Textantworten des Agenten (keine Werkzeugausgabe, kein verborgener Kontext, kein Reasoning, keine zurückgenommenen Nachrichten; höchstens etwa 6.000 Zeichen, den neuesten Teil), dieselbe Projektzusammenfassung wie **Funktionsideen** (mit denselben Dateiregeln: keine `.env*`- oder Schlüsseldateien, kein Symlink aus dem Ordner hinaus, kein FIFO), die Pfade, die `git status` als geändert listet, und bis zu 30 verfolgte oder unverfolgte (nicht ignorierte) Pfade, deren Namen Wörter mit deinem Entwurf teilen. Das geht als eine einzige Anfrage an das unter **Prompt verbessern** gewählte Modell (standardmäßig das eigene Modell des Chats). Andere Dateiinhalte als diese Zusammenfassung werden nicht gesendet. In den Chat und ins Projekt wird nichts geschrieben: Die Antwort ersetzt nur deinen Entwurf im Eingabefeld, und du entscheidest, ob du ihn sendest. Die Modellwahl liegt in `$DSH_HOME/storages/dsh-composer-plus/improve.json` (Datei nur für den Besitzer).
153
162
  - **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).
163
+ - **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.
164
+ - **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).
165
+ - **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.
154
166
 
155
167
  ## Fehlerbehebung
156
168
 
@@ -165,11 +177,15 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
165
177
  - **Löschen meldet, dass ein anderes dsh diesen Chat geöffnet hat:** Ein zweites dsh mit demselben dsh-Home hält die Sperre des Chats. Schließe dieses Fenster oder dieses dsh und lösche dann erneut. Der Chat bleibt in der Zwischenzeit archiviert.
166
178
  - **Mein iPhone verbindet sich nicht, seit ich „Tailscale only“ eingeschaltet habe:** Tailscale muss auf dem Mac und auf dem iPhone eingeschaltet sein. Das Panel Mobile Verbindung warnt, wenn es auf dem Mac aus ist. Das Zugriffsprotokoll zeigt jeden abgelehnten Versuch mit seinem Grund.
167
179
  - **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).
180
+ - **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.
168
181
  - **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.
169
182
  - **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).
170
183
  - **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.
171
184
  - **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).
172
- - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.15.0`), siehe den Hinweis zur Installation oben.
185
+ - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.16.1`), siehe den Hinweis zur Installation oben.
186
+ - **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.
187
+ - **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.
188
+ - **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.
173
189
 
174
190
  ## Grenzen
175
191
 
@@ -177,6 +193,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
177
193
  - **Funktionsideen** behält die Karten für jeden Chat im Speicher, bis dsh oder die Seite neu lädt. Danach fragt **Funktionen vorschlagen** das Modell erneut. Die Karten kommen in der Oberflächensprache, die dsh beim Klicken hat. Nach einem Sprachwechsel behalten Karten, die schon auf dem Stapel liegen, ihre Sprache, und **Weitere Ideen** nutzt die neue Sprache. Das Modell sieht nur die kurze Projektzusammenfassung, nicht den Code. Eine Idee kann also etwas wiederholen, das das Projekt schon hat: Überspringe sie. Der neue Chat läuft nur im Planmodus, wenn das Profil den Befehl `/plan` von dsh hat. Sonst geht die Idee als normale erste Nachricht hinaus. Die Liste **Später** gehört zum Ordnerpfad des Chats: Derselbe Ordner hat über einen Symlink geöffnet eine eigene Liste. Sie hält höchstens 50 Ideen pro Projekt (entferne eine, um weitere hinzuzufügen) und denselben Titel nur einmal. Das Ziehen einer Karte entscheidet nur über links oder rechts; nutze **↓**, um sie zu merken, und **▶**, um sie sofort umzusetzen. Eine Wiederholung wird nur am Titel erkannt: Das Modell kann eine frühere Idee unter einem neuen Namen trotzdem vorschlagen; überspringe sie. Antwortet das Modell nur mit früheren Ideen, erscheint nichts Neues: Klicke erneut. Ein enges Fokusthema macht das wahrscheinlicher; nutze ein breiteres Thema oder leere es. Das Fokusthema bleibt für jeden Chat im Feld, bis dsh oder die Seite neu lädt.
178
194
  - **Chat als Markdown exportieren** enthält nur deine eigenen Nachrichten und die Textantworten des Assistenten. Werkzeugaufrufe und ihre Ausgabe, Reasoning, Bilder (eine Zeile `[image]` markiert sie), verborgener Kontext und Nachrichten, die Runde zurücknehmen oder dsh-rewind-plugin entfernt hat, fehlen. Die Antworten einer Runde werden zu einem Abschnitt zusammengefasst. Ein Export enthält höchstens etwa 4 Millionen Zeichen; bei einem längeren Chat enthält er den ersten Teil und einen Hinweis.
179
195
  - **Nach Neustart fortsetzen** setzt die Runde fort; es spielt sie nicht erneut ab. Ein Tool-Aufruf, der beim Beenden lief, endet mit dem Ergebnis „outcome unknown“ von dsh, und das Modell erhält die Anweisung, fertige Arbeit nicht zu wiederholen. Ein Befehl, der nicht sicher zweimal laufen kann, kann aber erneut laufen. Subagents, Genehmigungen und Fragen, die offen waren, werden nicht wiederhergestellt: Ihr übergeordneter Chat macht weiter und fragt erneut. Höchstens 20 Chats werden bei einem Start fortgesetzt.
196
+ - **Nach Neustart fortsetzen** und die Warteschlange: dsh leert beim Beenden die Warteschlange eines Chats. Das Plugin stellt deine Nachrichten aus dem Protokoll des Chats wieder her, mit Reihenfolge, Änderungen, Bildern und Dateien; sie laufen nach der fortgesetzten Runde. Nur Chats, die fortgesetzt werden, bekommen ihre Warteschlange zurück (Schalter an, Beenden während die Runde lief). dsh protokolliert dein eigenes Entfernen der letzten Nachrichten in der Warteschlange genauso: Wenn du sie entfernst und dsh beendet wird, bevor der nächste Schritt beginnt, kommen sie zurück.
180
197
 
181
198
  - **Inhaltssuche** ist die eigene Suche von dsh und hat daher die Grenzen von dsh. Sie durchsucht nur Benutzer- und Assistentennachrichten: keine Tool-Ausgabe (Befehle, Dateiinhalte, Ergebnisse) und kein Reasoning. Sie hat auch keinen Filter für Benutzer-, Assistenten- oder Tool-Nachrichten. Sie findet ganze Wörter, keine Wortteile (`deploy` findet nicht `deployment`). Buchstaben mit Akzent passen auch ohne Akzent (`seker` findet `şeker`). Eine Zeile pro Chat, mit dem Ausschnitt von 240 Zeichen von dsh, höchstens 20 Zeilen.
182
199
  - Aufwand der **Inhaltssuche**, gemessen an einer Kopie von 247 echten Chatprotokollen (159 MB, dsh 0.2.1-rc.2, Apple Silicon, 32 GB): Die erste Suche nach einem Start baut den Index in etwa 15 s auf. In dieser Zeit antwortet der Host von dsh etwa 7 s lang nicht. Andere Chats streamen in diesem Moment also nicht (die Seite selbst friert nicht ein). Der Speicher des Hosts wächst in der Spitze um etwa 1,1 GB. Eine Minute später liegt er noch etwa 0,5–0,6 GB über dem Startwert, bis dsh beendet wird. Die Indexdatei hat etwa 165 MB. Spätere Suchen dauern etwa 0,5 s. Nach einem Neustart dauert die erste Suche etwa 1 s (nur neue oder geänderte Chats kommen hinzu) und fügt etwa 70 MB hinzu. Schalte die Funktion aus, wenn dein Computer wenig Arbeitsspeicher hat.
@@ -187,19 +204,25 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
187
204
  - 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.
188
205
  - **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.
189
206
  - **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.
190
- - **Mobile Verbindung** funktioniert nur unter macOS (sie nutzt `en0`, `openssl`, `swift` und `dns-sd`). Sie nutzt die festen Ports 19390 und 19391. Daher kann auf jedem Mac nur ein dsh sie gleichzeitig ausführen (jeder Mac ist ein Eintrag in der Mac-Liste des Telefons). Das Telefon bekommt Benachrichtigungen nur, solange Tether offen ist oder gerade in den Hintergrund gewechselt ist (kein Push-Dienst). Die iOS-App ist noch nicht im App Store: Baue sie mit Xcode aus `tether/ios`. „Tailscale only“ braucht trotzdem eine WLAN- oder Ethernet-Adresse auf dem Mac (das Gateway startet nur mit einer solchen Adresse). Das Zugriffsprotokoll gilt pro Mac und speichert nur die neuesten 200 Versuche. Ein wiederholter Versuch innerhalb einer Minute zählt dieselbe Zeile um eins hoch. Die App-Sperre von Tether blendet Mitteilungsvorschauen auf dem Sperrbildschirm des iPhone nicht aus: Schalte sie in den iOS-Einstellungen aus. Die grünen Punkte in Tether folgen dem Mac: Ein Chat, den du in dsh öffnest, verliert seinen Punkt auch auf dem Telefon. Ein Chat, den du in Tether öffnest, verliert seinen Punkt nur auf den Telefonen. Der eigene Punkt von dsh auf dem Mac bleibt, bis du den Chat dort öffnest.
207
+ - **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.
208
+ - **Mobile Verbindung** funktioniert nur unter macOS (sie nutzt `en0`, `openssl`, `swift` und `dns-sd`). Sie nutzt die festen Ports 19390 und 19391. Daher kann auf jedem Mac nur ein dsh sie gleichzeitig ausführen (jeder Mac ist ein Eintrag in der Mac-Liste des Telefons). Das Telefon bekommt Benachrichtigungen nur, solange Tether offen ist oder gerade in den Hintergrund gewechselt ist (kein Push-Dienst). Tether sendet sie erst, wenn du in Tether „Settings → Notifications → Send notifications“ einschaltest. Der Schalter ist standardmäßig aus, und iOS fragt beim Einschalten nach der Erlaubnis. Die iOS-App ist noch nicht im App Store: Baue sie mit Xcode aus `tether/ios`. „Tailscale only“ braucht trotzdem eine WLAN- oder Ethernet-Adresse auf dem Mac (das Gateway startet nur mit einer solchen Adresse). Das Zugriffsprotokoll gilt pro Mac und speichert nur die neuesten 200 Versuche. Ein wiederholter Versuch innerhalb einer Minute zählt dieselbe Zeile um eins hoch. Die App-Sperre von Tether blendet Mitteilungsvorschauen auf dem Sperrbildschirm des iPhone nicht aus: Schalte sie in den iOS-Einstellungen aus. Die grünen Punkte in Tether folgen dem Mac: Ein Chat, den du in dsh öffnest, verliert seinen Punkt auch auf dem Telefon. Ein Chat, den du in Tether öffnest, verliert seinen Punkt nur auf den Telefonen. Der eigene Punkt von dsh auf dem Mac bleibt, bis du den Chat dort öffnest.
191
209
  - Ein Sitzungslink funktioniert in Chats; ein Klick darauf öffnet den Chat nicht. Ein mit **Nachrichtenlink kopieren** erstellter Link öffnet seine Nachricht nur ab dsh 0.2.1 und nur aus einer Nachricht in einem Chat (dsh 0.2.0 hat keine Regeln für Benutzertext, dort wird der Link kopiert, erscheint aber als einfacher Text). Eine Nachricht, die ein Zurücknehmen entfernt hat oder die die Komprimierung aus dem Verlauf entfernt hat, den dsh lädt, kann nicht angezeigt werden: Der Link sagt das dann. Die 🔗-Schaltflächen hängen sich an die Nachrichtenzeilen von dsh. Wenn ein dsh-Update dieses Markup ändert, erscheinen sie nicht.
192
210
  - **Alle als gelesen markieren** ändert die eigenen Ungelesen-Punkte von dsh über einen Teil von dsh, der keine öffentliche API ist (die Liste `completionUnread` im Sitzungsstatus von dsh). Wenn ein dsh-Update sie umbenennt, erscheint der Eintrag nicht. Der Eintrag kommt in das „…“-Menü des Projekts in dsh, das keinen Platz für Plugins hat. Wenn dsh dieses Menü ändert, erscheint der Eintrag ebenfalls nicht.
193
- - **Eingereihte Nachricht direkt bearbeiten** öffnet den eigenen Warteschlangen-Editor von dsh und hat daher dessen Grenzen: Eine Nachricht mit Bildern oder Dateien lässt sich nicht bearbeiten, und eine Nachricht, deren Senden inzwischen begonnen hat, wird nicht geändert (dsh zeigt seinen eigenen Fehler).
211
+ - **Eingereihte Nachricht direkt bearbeiten** ändert keine Nachricht, deren Senden inzwischen begonnen hat, und überschreibt keine Nachricht, die sich inzwischen geändert hat (zum Beispiel in Tether auf dem iPhone): Ein Hinweis meldet das. Ein neues Bild braucht ein Modell, das Bilder annimmt (die eigenen Bildgrenzen von dsh gelten), und eine neue Datei muss fertig hochgeladen sein, bevor du speichern kannst. Nur deine eigenen eingereihten Nachrichten lassen sich bearbeiten: Eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange nicht. Nach einem Update des Plugins funktionieren nur Textänderungen sofort: Starte dsh neu, bevor du eine Nachricht mit Bildern oder Dateien speicherst (die Host-Hälfte lädt beim Start).
194
212
  - **Wiederholen** ändert nie den zurückgenommenen Chat: Es startet einen neuen Chat ab dem Moment direkt vor dem Zurücknehmen (die eigene Abzweigung von dsh, derselbe Kontext des Modells). Der neue Chat hat daher eine neue ID und einen neuen Titel. Nur das neueste Zurücknehmen eines Chats lässt sich wiederholen, einmal, und nur solange danach nichts kam (eine neue Nachricht beendet das Angebot). Eine Datei, die du nach dem Zurücknehmen geändert hast, bleibt erhalten, außer du setzt das Häkchen, das sie überschreibt. Wiederholen braucht den Snapshot, den das Zurücknehmen behalten hat (dasselbe Fenster von 50 Einträgen). Ein Zurücknehmen vor dieser Version oder mit **Nur Chat** holt nur die Nachrichten zurück.
213
+ - Die Branch-Karte der Ansicht **Baum** errät, wohin jeder Pfeil führt, weil git nicht speichert, in welchen Branch ein Branch gemergt wird. Ein gemergter Branch zeigt auf den Branch, dessen Merge-Commit ihn zuerst aufgenommen hat. Ein wartender Branch zeigt auf den nächsten Branch, von dem er ausging (bevorzugt den Haupt-Branch); wenn zwei Branches vom selben Commit ausgingen, kann die Karte den falschen wählen. Ein Branch, der per Fast-Forward vorgerückt ist, hat keinen Merge-Commit, daher öffnet sein Label **Gemergt** nichts. Der Haupt-Branch ist der Standard-Branch von `origin`, sonst `main` oder `master`, sonst der offene Branch. Die Karte liest die neuesten 20.000 Commits und zeigt höchstens 60 Branches; bei einem längeren Verlauf weist sie darauf hin, dass einige Pfeile falsch sein können. Ein Branch, der mit Squash oder Rebase gemergt wurde (zum Beispiel auf GitHub), erscheint als **Wartet**: Git behält keine Verbindung zu seinen Commits.
195
214
  - **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.
196
215
  - **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`).
197
216
  - **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.
198
217
  - **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.
218
+ - **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.
219
+ - **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“).
220
+ - **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.
199
221
  - **Im Chat suchen** durchsucht nur, was die Seite zeigt: die geladenen Nachrichten und Antworten (scrolle nach oben oder klicke auf **Ältere laden** für ältere), nicht geschlossene Tool-Schritte und nicht den eingeklappten Text in der Ausgabe eines Tools. Die Suche zählt höchstens 2.000 Treffer (dann „2000+“). Sie nutzt die Highlight-API des Browsers (Chromium 105 und neuer; die Desktop-App hat sie): In einem älteren Browser funktionieren die Zählung und das Springen ohne die Farbe. `Cmd+F` auf einem Mac (`Ctrl+F` unter Windows und Linux) öffnet sie nur, solange ein Chat auf dem Bildschirm ist. Anderswo funktioniert die eigene Suche des Browsers wie bisher. Auf einem Mac behält `Ctrl+F` in Textfeldern seine macOS-Funktion (der Cursor geht ein Zeichen weiter).
222
+ - **Wartenden Chat bei Inaktivität öffnen** kennt nur, was das Fenster von dsh sieht: Arbeit in einer anderen App zählt nicht. Ist dsh im Hintergrund, kann es also nach 30 Sekunden einen wartenden Chat öffnen. dsh kommt dabei nicht in den Vordergrund. Lesen ohne Taste, Klick oder Mausbewegung zählt als Inaktivität. Es achtet nur auf Chats mit dem orangefarbenen Punkt von dsh (eine Frage, eine Genehmigung oder eine Planprüfung); die Anfrage eines Subagenten erscheint in seinem übergeordneten Chat. Solange ein wartender Chat auf dem Bildschirm ist, öffnet sich kein anderer; ein Chat, den du ohne Antwort verlassen hast, kann sich nach den nächsten 30 Sekunden ohne Benutzung wieder öffnen. Die 30 Sekunden lassen sich nicht ändern.
200
223
  - Eine Benachrichtigung, die vor einem Neustart gesendet wurde, holt dsh beim Klicken nur in den Vordergrund.
201
224
  - Aktive Projekte werden über die gespeicherte Projektreihenfolge von dsh verschoben. Die neue Reihenfolge bleibt also nach einem Neustart erhalten. Chats außerhalb eines Projekts („Ohne Gruppe“) lassen sich nicht verschieben; dsh listet sie immer zuletzt.
202
- - dsh hat keinen Erweiterungspunkt im Menü der Ansichtsoptionen der Seitenleiste. Deshalb kommt die Option für aktuelle Projekte in das eigene Menü von dsh. Wenn ein dsh-Update dieses Menü ändert, erscheint die Option nicht, und alle Projekte bleiben sichtbar. Der Filter wirkt auf Projektzeilen, daher wird **In einer Liste** nicht gefiltert. Nutze ihn mit **Arbeitsbereich**: In **Arbeitsbereichsbaum** blendet ein ausgeblendeter übergeordneter Ordner auch die aktiven Projekte darin aus. **Nach Status** hat dieselbe Art von Grenze: dsh hat keinen Platz für eine Sortierung. Deshalb hängen sich der Eintrag und die Zeilenreihenfolge an das Menü- und Listen-Markup von dsh.
225
+ - dsh hat keinen Erweiterungspunkt im Menü der Ansichtsoptionen der Seitenleiste. Deshalb kommt die Option für aktuelle Projekte in das eigene Menü von dsh. Wenn ein dsh-Update dieses Menü ändert, erscheint die Option nicht, und alle Projekte bleiben sichtbar. Der Filter wirkt auf Projektzeilen, daher wird **In einer Liste** nicht gefiltert. In **Arbeitsbereichsbaum** bleibt ein übergeordneter Ordner sichtbar, solange ein Projekt darin aktiv ist, und auch die Chatzeilen, die in den letzten 2 Stunden nicht aktiv waren, werden ausgeblendet; in **Arbeitsbereich** werden nur Projektzeilen gefiltert. Der Filter liest die Ansicht, die dsh zeigt, aus der gespeicherten Ansichtseinstellung von dsh (keine öffentliche API); benennt ein dsh-Update sie um, wird **Arbeitsbereichsbaum** wie **Arbeitsbereich** gefiltert. Die Funktion Projektstatus liest dieselbe Einstellung: In **Arbeitsbereichsbaum** zählt die Zeile eines übergeordneten Ordners auch die Chats der Projekte darin; benennt dsh die Einstellung um, zeigt jede Zeile nur ihre eigenen Chats. **Nach Status** hat dieselbe Art von Grenze: dsh hat keinen Platz für eine Sortierung. Deshalb hängen sich der Eintrag und die Zeilenreihenfolge an das Menü- und Listen-Markup von dsh.
203
226
  - dsh hat auch kein Menü für Projektzeilen und keinen Platz in der Kopfzeile der Arbeitsbereiche. **Pfad kopieren** findet die Projektzeile über das Zeilen-Markup von dsh. **Alle Projekte einklappen** sitzt in der Kopfzeile von dsh und schließt jedes geöffnete Projekt mit demselben Klick wie die Projektzeile. Wenn ein dsh-Update dieses Markup ändert, zeigt ein Rechtsklick das Menü des Browsers, und die Schaltfläche erscheint nicht.
204
227
  - dsh hat auch im Projektmenü eines neuen Chats keinen Erweiterungspunkt. Deshalb hängen sich das Feld **Projekte durchsuchen** und die A–Z-Reihenfolge an das Menü-Markup von dsh. Wenn ein dsh-Update dieses Markup ändert, erscheint das Menü so, wie dsh es zeichnet: in der gespeicherten Reihenfolge und ohne das Feld. Die A–Z-Reihenfolge ist nur eine Ansicht: Sie ändert die gespeicherte Projektreihenfolge von dsh nicht.
205
228
  - dsh hat auch keinen Erweiterungspunkt, der wählt, wo **Neue Sitzung** öffnet. **Standard-Arbeitsbereich für Neue Sitzung** umhüllt eine Methode von dsh, die keine öffentliche API ist (`startSession` des Arbeitsbereich-Dienstes von dsh). Wenn ein dsh-Update sie umbenennt, öffnet **Neue Sitzung** dort, wo dsh es wählt (das geöffnete oder das letzte Projekt). Jeder Aufruf ohne Projekt nutzt den Standard: die Schaltfläche in der Seitenleiste, ihr Tastenkürzel, das Logo und auch **Neu** auf der Seite **Automatisierungsaufgaben**. dsh öffnet beim Start weiterhin den letzten Chat. Der allgemeine Ordner wird bei der ersten Nutzung angelegt und zu deinen Projekten hinzugefügt; unter Windows oder Linux mit verschobenem Documents-Ordner kann er ein anderer Ordner als der von dsh sein.
@@ -207,6 +230,12 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
207
230
  - Der Text von **Beim Tippen vervollständigen** erscheint über den eigenen Eingabehinweis von dsh (den Stil `--dsh-composer-hint`, den dsh für den Argumenthinweis eines Slash-Befehls nutzt). Die Funktion läuft nicht bei einem Slash-Befehl, bei einer Nachricht mit einem Datei- oder Symbol-Chip oder wenn der Cursor nicht am Ende der Nachricht steht. Wenn ein dsh-Update diesen Stil ändert, erscheint keine Vervollständigung. Jede Pause beim Tippen kostet einen Modellaufruf.
208
231
  - **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 Slash-Befehl 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. Bilder bleiben angehängt: Nur der Text ändert sich. Jeder Klick kostet einen Modellaufruf; ein starkes Modell kann eine Minute brauchen (`Esc` bricht ab).
209
232
  - **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. Nur die eigenen Modellaufrufe des Chats zählen (nicht die seiner Subagents). `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.
233
+ - **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.
234
+ - **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. Öffne die Dateien zur Kontrolle und bearbeite oder lösche sie von Hand, während dsh geschlossen ist. 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.
235
+ - **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.
236
+ - **Wiederherstellen** läuft nur in der Rettungskonsole, während dsh geschlossen ist, und ersetzt das ganze dsh-Home. Das alte bleibt daneben als `.dsh.pre-restore-<time>`, bis du es entfernst; die Festplatte braucht also Platz für beide. Chats behalten ihre Projektpfade: Auf einem anderen Computer erscheint ein Projekt unter einem anderen Pfad als fehlend, bis du es neu hinzufügst. Symlinks, die aus dem dsh-Home hinaus zeigen (zum Beispiel Skills, die aus einem anderen Ordner verlinkt sind), kommen als Links zurück; ihre Ziele müssen auf diesem Computer existieren.
237
+ - **Sitzungsprotokoll-Prüfung** liest das neueste Protokoll jedes Chats mit den eigenen Regeln von dsh dafür, was aufgeht: Eine Zeile, die kein JSON ist oder nicht in der richtigen Reihenfolge steht, zählt nur dann als Schaden, wenn danach ein Rundenende kommt (sonst öffnet dsh den Chat ohne die Zeilen ab dort, daher wird er nicht aufgelistet). Sie prüft die Ereignisse eines Protokolls nicht gegen die eigenen Ereignisregeln von dsh. Daher kann ein Protokoll, das sie für intakt hält, nach einem dsh-Upgrade trotzdem nicht aufgehen. Eine Reparatur nimmt die Kopie aus einer Sicherung: Die Nachrichten nach dieser Sicherung gehen in diesem Chat verloren (die beschädigte Datei bleibt daneben). Ein Chat, der in diesem dsh offen ist, wird in den Einstellungen nicht repariert: dsh hält ihn.
238
+ - **Automatische Sicherung** läuft nur, während dsh läuft: Eine Sicherung, die fällig war, während dsh geschlossen war, läuft etwa 45 s nach dem nächsten Start. Der Snapshot für eine neue Version entsteht nach diesem Start, nicht vor dem Update.
210
239
  - Eingebaute Unterstützung ist upstream angefragt: `move` für die Warteschlange in [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), ein Zustand für Fortsetzen in [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
211
240
 
212
241
  ## Häufige Fragen
@@ -235,9 +264,19 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
235
264
 
236
265
  **Kann der Agent aufhören, seine eigene Arbeit als fertig zu markieren, wie bei den Prüfschleifen im Loop Engineering?** Ja, mit **Zielprüfung** (standardmäßig an): Starte ein Ziel mit `/goal`. Wenn der Agent sagt, dass das Ziel abgeschlossen ist, laufen die Tests des Projekts, und ein unabhängiger Modellaufruf prüft das Ziel anhand des Chats; schlägt eins davon fehl, bleibt das Ziel offen und der Agent liest den Grund. Lege deinen eigenen Testbefehl, ein Zeitlimit oder ein Token-Limit mit **Bearbeiten** in der Zeile **Zielprüfung** unter dem Ziel fest.
237
266
 
267
+ **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.
268
+
269
+ **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.
270
+
271
+ **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.
272
+
273
+ **Wie ziehe ich dsh auf einen neuen Computer um?** Auf dem alten: **Sicherung** → **Für einen anderen Computer** neben einer Sicherung. Kopiere diesen Ordner auf den neuen Computer, installiere dort dsh, beende es, öffne `Composer Plus Rescue` im kopierten Ordner und stelle wieder her. Gib deine API-Schlüssel neu ein (sie bleiben auf dem alten Computer).
274
+
275
+ **Ein Chat öffnet sich nach einem Absturz nicht mehr. Kann ich ihn reparieren?** **Einstellungen → Composer Plus → Sitzungsprotokoll-Prüfung → Sitzungsprotokolle prüfen**. Ein beschädigter Chat kommt mit **Aus Sicherungen reparieren** aus der neuesten Sicherung zurück (die Nachrichten nach dieser Sicherung gehen verloren).
276
+
238
277
  **Wie ordne ich eingereihte Nachrichten in dsh neu?** Ziehe den Griff ⠿ an einer eingereihten Nachricht, oder setze den Fokus darauf und drücke `↑` / `↓`.
239
278
 
240
- **Wie korrigiere ich einen Tippfehler in einer eingereihten Nachricht?** Doppelklicke auf die Nachricht in der Warteschlange, ändere den Text und drücke `Enter` (`Esc` bricht ab). Sie behält ihren Platz in der Warteschlange.
279
+ **Wie korrigiere ich einen Tippfehler in einer eingereihten Nachricht?** Doppelklicke auf die Nachricht in der Warteschlange, ändere den Text und drücke `Enter` (`Esc` bricht ab). Sie behält ihren Platz in der Warteschlange. Dort kannst du auch ihre Bilder und Dateien entfernen oder neue hinzufügen.
241
280
 
242
281
  **Wie entferne ich alle Ungelesen-Punkte eines Projekts auf einmal?** Seitenleiste → Schaltfläche **…** des Projekts → **Alle als gelesen markieren**.
243
282
 
@@ -265,13 +304,17 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
265
304
 
266
305
  **Wie bekomme ich Benachrichtigungen unter macOS / Windows, wenn eine dsh-Aufgabe fertig ist oder eine Genehmigung braucht?** Lass **Hintergrundbenachrichtigungen** an (Standard) und erlaube Benachrichtigungen für DeepSeek Harness in den Einstellungen des Betriebssystems.
267
306
 
307
+ **Kann dsh den Chat, der mir eine Frage stellt, von selbst öffnen?** Ja, mit **Wartenden Chat bei Inaktivität öffnen** (standardmäßig an): Wartet ein Chat auf eine Antwort, eine Genehmigung oder eine Planprüfung und du benutzt dsh 30 Sekunden lang nicht, öffnet dsh ihn. Solange du tippst, scrollst oder die Maus bewegst, wartet es.
308
+
268
309
  **Wie stelle ich die Oberfläche von DeepSeek Harness auf Türkisch, Spanisch, Japanisch … um?** Einstellungen → Composer Plus → **App-Sprache**.
269
310
 
270
311
  **Wie nutze ich dsh von meinem iPhone aus?** Baue die Tether-App aus `tether/ios` (Xcode). Schalte **Einstellungen → Composer Plus → Mobile Verbindung (iPhone)** ein und klicke unten links auf **Mobile Verbindung**. Scanne den QR-Code (mit der iPhone-Kamera oder mit **Scan code** in Tether), tippe auf **Connect** und klicke auf **Approve**. Unterwegs nutzt du Tailscale auf beiden Geräten.
271
312
 
272
313
  **Wie öffnet sich Neue Sitzung immer im selben Projekt?** Einstellungen → Composer Plus → **Standard-Arbeitsbereich für Neue Sitzung** → **Neue Sitzung öffnen in** → wähle das Projekt. Das `+` neben einem anderen Projekt öffnet weiterhin dieses Projekt.
273
314
 
274
- **Wie arbeite ich gleichzeitig an mehreren Funktionen eines Projekts, jede auf ihrem eigenen Branch?** Mit **Ein Branch pro Chat**: neuer Chat → die Schaltfläche main mit dem Branch-Symbol → **Neuer Branch**, dann sende die erste Nachricht. Jeder Chat bekommt einen eigenen Branch und einen eigenen Worktree-Ordner, mit deiner `.env` und deinem `node_modules`, wenn `.worktreeinclude` sie auflistet. Die Kopfzeile des Chats zeigt, auf welchem Branch du bist.
315
+ **Wie arbeite ich gleichzeitig an mehreren Funktionen eines Projekts, jede auf ihrem eigenen Branch?** Mit **Ein Branch pro Chat**: Im Bildschirm „Neuer Chat“ zeigt die Branch-Schaltfläche standardmäßig **Neuer Branch**: Sende die erste Nachricht. Jeder Chat bekommt einen eigenen Branch und einen eigenen Worktree-Ordner, mit deiner `.env` und deinem `node_modules`, wenn `.worktreeinclude` sie auflistet. Die Kopfzeile des Chats zeigt, auf welchem Branch du bist.
316
+
317
+ **Kann die Seitenleiste jeden Branch eines Projekts zeigen und meinen Chat verschieben, wenn der Agent einen Branch erstellt?** Ja, mit **Branches im Arbeitsbereichsbaum** (standardmäßig aus): Schalte es in Einstellungen → Composer Plus ein und wähle in dsh **Ansichtsoptionen** → **Arbeitsbereichsbaum**. Jeder Branch mit einem Worktree in `<project>/.worktrees/` erscheint in seinem Projekt. Wenn du den Agenten im Projektordner bittest, einen Branch zu erstellen und dort zu arbeiten, und der Ordner keine nicht committeten Änderungen hat, zieht der Chat von selbst in den Branch um. Lösche den Ordner des Branches, dann verschwindet er aus der Liste; seine Chats kommen nach **Ohne Gruppe**.
275
318
 
276
319
  **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.
277
320
 
@@ -287,6 +330,7 @@ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh
287
330
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
288
331
  # recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
289
332
  PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
333
+ PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
290
334
  # Order by status (fake model + Schedule): real-app test + its thumbnail
291
335
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
292
336
  # every Settings feature row shows a loading screenshot and a ? link to its README row
@@ -297,10 +341,14 @@ PLAYWRIGHT=/path/to/playwright node test/browser-whats-new.mjs /path/to/dsh/lib/
297
341
  PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
298
342
  # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
299
343
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
344
+ # Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
345
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
300
346
  # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
301
347
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
302
348
  # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
303
349
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
350
+ # Resume after restart with a queue (fake model, real quit and start): text, image, file, a drag and an edit come back in order
351
+ PLAYWRIGHT=/path/to/playwright node test/browser-resume-queue.mjs /path/to/dsh/lib/bin.js
304
352
  # Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list, a focus topic chip, Copy as checklist + its thumbnail
305
353
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
306
354
  # Export chat as Markdown (fake model, made-up project): right-click → Export as Markdown…, copy and save keep the code blocks, switch off + its thumbnail
@@ -315,8 +363,10 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path
315
363
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
316
364
  # Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
317
365
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
318
- # Changes Tree (fake model, made-up git history): branch list, a branch's commits, commit files and diffs, back marks the row + its thumbnail
366
+ # Changes Tree (fake model, made-up git history): the branch map (counts, colors, arrows), a branch's commits, commit files and diffs, Merged and Waiting files, back marks the box + its thumbnail
319
367
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
368
+ # Branches in the workspace tree (fake model, made-up git project): a worktree becomes a project, the agent's new branch moves the chat, a deleted folder leaves the tree + its thumbnail
369
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-branch-tree.mjs /path/to/dsh/lib/bin.js
320
370
  # Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
321
371
  PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
322
372
  # Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
@@ -327,6 +377,9 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path
327
377
  # Queue drag-and-drop and Continue with a queued message (slow fake model)
328
378
  PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
329
379
  PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
380
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
381
+ # Edit queued message in place with images and files (slow fake model) + its thumbnail
382
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
330
383
  ```
331
384
 
332
385
  ```sh