dsh-composer-plus 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +96 -19
- package/README.es.md +96 -19
- package/README.fr.md +96 -19
- package/README.hi.md +96 -19
- package/README.id.md +96 -19
- package/README.ja.md +96 -19
- package/README.ko.md +96 -19
- package/README.md +96 -19
- package/README.pt-BR.md +96 -19
- package/README.ru.md +96 -19
- package/README.tr.md +96 -19
- package/README.vi.md +96 -19
- package/README.zh.md +96 -19
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/copyMessageLink.webp +0 -0
- package/assets/features/defaultWorkspace.webp +0 -0
- package/assets/features/findInChat.webp +0 -0
- package/assets/features/goalCheck.webp +0 -0
- package/assets/features/markProjectRead.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/worktreeChats.webp +0 -0
- package/client.js +1983 -199
- package/index.js +1824 -106
- package/package.json +7 -3
- package/tether/gateway/admin.html +47 -3
- package/tether/gateway/server.mjs +100 -29
package/README.de.md
CHANGED
|
@@ -14,7 +14,7 @@ Komfortfunktionen im Stil von Codex für die Desktop- und Weboberfläche von [De
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness mit Composer Plus: Das laufende Projekt zeigt einen Spinner in der Seitenleiste, und der Änderungsbereich zeigt einen git-Diff"></p>
|
|
16
16
|
|
|
17
|
-
Inoffizielles Community-Plugin. Die einzigen Netzwerkaufrufe sind die Update-Prüfung (GitHub-Releases und die npm-Registry). Schalte **Automatische Updates** aus, um sie beim Start zu stoppen. **Funktionsideen** ruft das eigene Modell deines Chats nur auf, wenn du auf **Funktionen vorschlagen** klickst. **Vorhersage der nächsten Nachricht** (standardmäßig an) ruft nach jeder beendeten Runde einmal das in den Einstellungen gewählte Modell auf (den dsh-Standard, wenn du kein anderes wählst), ohne Klick. Schalte sie unter **Einstellungen → Composer Plus** aus, um diese Aufrufe zu stoppen. **Beim Tippen vervollständigen** (standardmäßig aus) ruft bei jeder Pause beim Tippen das dafür gewählte Modell auf (standardmäßig das der Vorhersage), nachdem du die Funktion eingeschaltet hast. **Prompt verbessern** ruft ein Modell nur auf, wenn du auf seinen Zauberstab klickst. **Mobile Verbindung** (standardmäßig aus) nimmt iPhone-Verbindungen aus deinem lokalen Netz oder Tailnet erst an, wenn du sie einschaltest.
|
|
17
|
+
Inoffizielles Community-Plugin. Die einzigen Netzwerkaufrufe sind die Update-Prüfung (GitHub-Releases und die npm-Registry). Schalte **Automatische Updates** aus, um sie beim Start zu stoppen. **Funktionsideen** ruft das eigene Modell deines Chats nur auf, wenn du auf **Funktionen vorschlagen** klickst. **Vorhersage der nächsten Nachricht** (standardmäßig an) ruft nach jeder beendeten Runde einmal das in den Einstellungen gewählte Modell auf (den dsh-Standard, wenn du kein anderes wählst), ohne Klick. Schalte sie unter **Einstellungen → Composer Plus** aus, um diese Aufrufe zu stoppen. **Beim Tippen vervollständigen** (standardmäßig aus) ruft bei jeder Pause beim Tippen das dafür gewählte Modell auf (standardmäßig das der Vorhersage), nachdem du die Funktion eingeschaltet hast. **Prompt verbessern** ruft ein Modell nur auf, wenn du auf seinen Zauberstab klickst. **Zielprüfung** (standardmäßig an) ruft jedes Mal einmal ein Modell auf, wenn der Agent ein `/goal` in einem automatischen Durchlauf als abgeschlossen markiert. **Mobile Verbindung** (standardmäßig aus) nimmt iPhone-Verbindungen aus deinem lokalen Netz oder Tailnet erst an, wenn du sie einschaltest.
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; dieses Profil verwaltet die App.)
|
|
31
31
|
|
|
32
|
-
> Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.
|
|
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.14.0`.
|
|
33
33
|
|
|
34
34
|
## Funktionen
|
|
35
35
|
|
|
@@ -37,10 +37,10 @@ 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. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Screenshot: Änderungsbereich"></a> |
|
|
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, die letzten
|
|
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> |
|
|
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
|
-
| **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. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Screenshot: Runde zurücknehmen"></a> |
|
|
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> |
|
|
44
44
|
| **Chat löschen** | <a id="feature-deletechat"></a>Seitenleiste → Menü **…** eines Chats (oder Rechtsklick) → **Löschen…** → **Löschen**. dsh selbst kann nur archivieren. Der Chat stoppt (seine Runde, Jobs, Subagents und geplanten Erinnerungen, wie beim Archivieren in dsh). Sein gespeicherter Verlauf kommt mit den Chats seiner Subagents in den macOS-Papierkorb (auf anderen Systemen: `$DSH_HOME/trash`). Um ihn zurückzuholen, lege den Ordner zurück und starte dsh neu: Der Chat erscheint in der Ansicht **Nur archivierte** der Seitenleiste. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Screenshot: Chat löschen"></a> |
|
|
45
45
|
| **Projektname im Eingabefeld** | <a id="feature-projectname"></a>Die Zeile unter dem Eingabefeld (Runden, Tokens, Cache-Treffer, Kontext) beginnt mit dem Projektnamen des Chats. So siehst du immer, in welchem Projekt ein Chat arbeitet. Es ist der eigene Projekttitel von dsh oder der Ordnername, wenn das Projekt keinen Titel hat. Fahre mit der Maus darüber, um den vollständigen Ordnerpfad zu sehen. Klicke darauf, um den Chat in der Seitenleiste zu finden, in der Listen- oder Projektansicht: Die Seitenleiste und das Projekt öffnen sich (auch ein eingeklapptes Projekt und sein **N weitere Sitzungen anzeigen**), die Liste scrollt zum Chat, und der Chat blinkt 5 Sekunden lang. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Screenshot: Projektname im Eingabefeld"></a> |
|
|
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> |
|
|
@@ -49,22 +49,30 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
|
|
|
49
49
|
| **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
50
|
| **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
51
|
| **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> |
|
|
52
53
|
| **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
|
+
| **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> |
|
|
53
55
|
| **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> |
|
|
54
56
|
| **Projektpfad kopieren** | <a id="feature-copyprojectpath"></a>Rechtsklick auf ein Projekt in der Seitenleiste → **Pfad kopieren** kopiert den vollständigen Pfad seines Ordners. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Screenshot: Projektpfad kopieren"></a> |
|
|
55
57
|
| **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
|
+
| **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
|
+
| **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 neben der Projektschaltfläche → **Neuer Branch**. Gib dann die erste Nachricht ein und sende sie. 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> |
|
|
56
61
|
| **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> |
|
|
57
62
|
| **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> |
|
|
58
63
|
| **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> |
|
|
59
|
-
| **
|
|
64
|
+
| **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> |
|
|
65
|
+
| **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> |
|
|
60
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> |
|
|
67
|
+
| **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. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Screenshot: Git-Branch in Chatzeilen"></a> |
|
|
68
|
+
| **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> |
|
|
61
69
|
| **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> |
|
|
62
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> |
|
|
63
71
|
| **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> |
|
|
64
72
|
| **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> |
|
|
65
73
|
| **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> |
|
|
66
74
|
| **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> |
|
|
67
|
-
| **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, 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. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Screenshot: Mobile Verbindung (iPhone)"></a> |
|
|
75
|
+
| **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> |
|
|
68
76
|
| **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> |
|
|
69
77
|
|
|
70
78
|
<!-- END GENERATED FEATURES -->
|
|
@@ -73,7 +81,7 @@ Schaltflächen, Tooltips, Hinweise und Benachrichtigungen folgen der gewählten
|
|
|
73
81
|
|
|
74
82
|
## Einstellungen
|
|
75
83
|
|
|
76
|
-
Jede Funktion lässt sich einzeln ein- oder ausschalten: dsh **Einstellungen → Composer Plus**. Jede Zeile hat einen kleinen Screenshot: Fahre mit der Maus darüber für eine größere Vorschau, oder klicke darauf, um ihn in voller Größe zu öffnen (`Esc` schließt ihn). Das Feld **Funktionen suchen** oben filtert die Seite nach Name oder Beschreibung (in jeder Sprache, ohne Unterschied bei Groß- und Kleinschreibung oder Akzenten); `Esc` leert es. Jede Zeile hat einen Schalter und eine kurze Beschreibung. Das kleine **?** nach dem Namen einer Zeile öffnet den Teil dieser README, der die Funktion beschreibt, in der README der Oberflächensprache von dsh. Änderungen gelten sofort, ohne Neustart, und bleiben auf diesem Gerät gespeichert. Alles ist standardmäßig an, außer **Mobile Verbindung**, **Nach Neustart fortsetzen** und **Beim Tippen vervollständigen**. Der Host von dsh speichert die Schalter dieser drei Funktionen sowie von **Inhaltssuche**, **Runde zurücknehmen
|
|
84
|
+
Jede Funktion lässt sich einzeln ein- oder ausschalten: dsh **Einstellungen → Composer Plus**. Jede Zeile hat einen kleinen Screenshot: Fahre mit der Maus darüber für eine größere Vorschau, oder klicke darauf, um ihn in voller Größe zu öffnen (`Esc` schließt ihn). Das Feld **Funktionen suchen** oben filtert die Seite nach Name oder Beschreibung (in jeder Sprache, ohne Unterschied bei Groß- und Kleinschreibung oder Akzenten); `Esc` leert es. Jede Zeile hat einen Schalter und eine kurze Beschreibung. Das kleine **?** nach dem Namen einer Zeile öffnet den Teil dieser README, der die Funktion beschreibt, in der README der Oberflächensprache von dsh. Änderungen gelten sofort, ohne Neustart, und bleiben auf diesem Gerät gespeichert. Alles ist standardmäßig an, außer **Mobile Verbindung**, **Nach Neustart fortsetzen** und **Beim Tippen vervollständigen**. Der Host von dsh speichert die Schalter dieser drei Funktionen sowie von **Inhaltssuche**, **Runde zurücknehmen**, **Vorhersage der nächsten Nachricht** und **Zielprüfung**. Deshalb gelten sie für jedes Fenster und bleiben nach einem Neustart erhalten. Der Host speichert auch die Wahl unter **Modell** für **Vorhersage der nächsten Nachricht**, die für **Beim Tippen vervollständigen** (standardmäßig **Wie Vorhersage der nächsten Nachricht**), die für **Prompt verbessern**, die für **Zielprüfung** (beide standardmäßig **Wie das Modell des Chats**) und das **Zeitlimit** von **Für diesen Chat zulassen** (standardmäßig 1 Stunde). **Inhaltssuche** ändert sich erst nach einem Neustart von dsh (dsh liest den Schalter beim Start). Bis dahin steht in ihrer Zeile **Starte dsh neu, damit diese Änderung gilt.**
|
|
77
85
|
|
|
78
86
|
<p align="center"><img src="docs/images/settings.webp" width="720" alt="Einstellungen → Composer Plus: Funktionssuche, Sprachauswahl, Update-Zeile und ein Schalter pro Funktion, mit Screenshot-Vorschau beim Darüberfahren"></p>
|
|
79
87
|
|
|
@@ -87,7 +95,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
87
95
|
|
|
88
96
|
Die ganze App wechselt sofort. Die Auswahl ist die eigene gespeicherte `locale.preference` von dsh (dieselbe wie unter Allgemein → Sprache). Deshalb bleibt sie nach Neustarts erhalten. **Systemsprache** löscht diese Auswahl: Die Desktop-App folgt der Sprache des Betriebssystems, die Weboberfläche der Sprache des Browsers. Eine nicht unterstützte Sprache fällt auf Englisch zurück. Die Installation des Plugins überschreibt nie eine Sprache, die du schon gewählt hast.
|
|
89
97
|
|
|
90
|
-
Jedes Paket hat 3.
|
|
98
|
+
Jedes Paket hat 3.280 Texte: jeden Oberflächentext von dsh `0.2.0-rc.2` und `0.2.1-rc.2` (Chats, Seitenleiste, Einstellungen, Genehmigungen, Automatisierungsaufgaben, Dateivorschauen, Plugin-Verwaltung, Plugin-Marktplatz), die eigenen Bedienelemente des Plugins und das beliebte Plugin [dsh-rewind](https://github.com/SiriLee/dsh-rewind). Nicht übersetzt werden: deine Nachrichten, die Ausgabe des Modells, Code, Namen von Slash-Befehlen (`/plan`, `/compact`), Bezeichnungen der Anbieter wie die Reasoning-Stufe `High`, Texte anderer Plugins sowie die nativen Menüs und Update-Dialoge der Desktop-App (dsh liefert diese nur auf Englisch und Chinesisch aus). Texte, die eine neuere dsh-Version hinzufügt, erscheinen auf Englisch, bis die Pakete aktualisiert sind. Wenn ein anderes Plugin eine Sprache bereits bereitstellt, behält dieses Plugin die Sprache.
|
|
91
99
|
|
|
92
100
|
## Tastenkürzel
|
|
93
101
|
|
|
@@ -107,6 +115,12 @@ Jedes Paket hat 3.143 Texte: jeden Oberflächentext von dsh `0.2.0-rc.2` und `0.
|
|
|
107
115
|
| `Tab` | leeres Eingabefeld mit einer Vorhersage | Vorhersage ins Eingabefeld setzen |
|
|
108
116
|
| `Tab` | graue Vervollständigung nach dem Cursor | Vervollständigung zur Nachricht hinzufügen |
|
|
109
117
|
| `Esc` | leeres Eingabefeld mit einer Vorhersage | Vorhersage ausblenden |
|
|
118
|
+
| `Cmd/Ctrl+Z` | Eingabefeld, nach **Prompt verbessern** | den Text zurückholen, den du getippt hast |
|
|
119
|
+
| `Esc` | Eingabefeld, während **Prompt verbessern** läuft | Verbesserung abbrechen |
|
|
120
|
+
| `Enter` / `Esc` | eingereihte Nachricht, auf die du doppelgeklickt hast | Bearbeitung speichern / abbrechen |
|
|
121
|
+
| `Cmd+F` auf einem Mac, `Ctrl+F` unter Windows und Linux | geöffneter Chat | **Im Chat suchen** öffnen |
|
|
122
|
+
| `Enter` / `Shift+Enter`, `↓` / `↑` | Feld von **Im Chat suchen** | nächster / vorheriger Treffer |
|
|
123
|
+
| `Esc` | Feld von **Im Chat suchen** | Feld schließen |
|
|
110
124
|
|
|
111
125
|
Ein geöffnetes `/`- oder `@`-Menü behält diese Tasten für sich.
|
|
112
126
|
|
|
@@ -119,19 +133,24 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
119
133
|
- **Fortsetzen:** Der authentifizierte lokale Endpunkt setzt nur die letzte unterbrochene Runde fort, lehnt veraltete oder doppelte Anfragen ab und behält die vorhandenen Genehmigungs-Hooks bei. Er sendet keine neue Benutzernachricht.
|
|
120
134
|
- **Nach Neustart fortsetzen:** aus, bis du es einschaltest. Die Host-Hälfte speichert nur Chat-IDs und Startzeiten in `$DSH_HOME/storages/dsh-composer-plus/resume.json` (Rechte nur für den Besitzer), und nichts verlässt deinen Rechner. Sie setzt einen Chat nur fort, wenn das eigene Protokoll von dsh sagt, dass dsh (nicht du) seine letzte Runde gestoppt hat. Genehmigungen und die automatische Prüfung gelten für die fortgesetzte Runde wie gewohnt.
|
|
121
135
|
|
|
122
|
-
- **Änderungsbereich:** git läuft nur lesend auf deinem Rechner, im eigenen Ordner des Chats, über den authentifizierten `/api`-Kanal von dsh. Es führt nie Commits, Staging oder Fetches aus und zeigt nur Pfade, die git selbst aufgelistet hat.
|
|
123
|
-
- **Funktionsideen:** Nichts läuft, bis du auf **Funktionen vorschlagen** klickst. Dann liest die Host-Hälfte nur den eigenen Ordner des Chats (der Browser sendet nie einen Pfad): die Namen der Einträge auf oberster Ebene, die ersten 6 kB von README, AGENTS.md und Manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) und `git log --
|
|
136
|
+
- **Änderungsbereich:** git läuft nur lesend auf deinem Rechner, im eigenen Ordner des Chats, über den authentifizierten `/api`-Kanal von dsh. Es führt nie Commits, Staging oder Fetches aus und zeigt nur Pfade, die git selbst aufgelistet hat. Der Baum listet bis zu 1000 lokale und entfernte Branches und zeigt die neuesten 300 Commits eines Branches: seine First-Parent-Linie, ein Merge-Commit steht also für die Commits, die er gebracht hat. Er wechselt nie den Branch (Checkout). **Dieser Chat** liest das eigene Protokoll des Chats, um die Dateien zu finden, die seine Datei-Tools geschrieben haben. Er vergleicht sie mit dem Snapshot von Runde zurücknehmen für diesen Chat, in einem temporären Ordner, der sofort gelöscht wird. Er schreibt nichts in dein Repository und nichts in den Snapshot-Speicher.
|
|
137
|
+
- **Funktionsideen:** Nichts läuft, bis du auf **Funktionen vorschlagen** klickst. Dann liest die Host-Hälfte nur den eigenen Ordner des Chats (der Browser sendet nie einen Pfad): die Namen der Einträge auf oberster Ebene, die ersten 6 kB von README, AGENTS.md und Manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …), eine Gliederung des restlichen README (Überschriften, Tabellenzeilen, Listenpunkte; höchstens 6 kB) und die Titel der neuesten Commits (`git log --format=%s`, höchstens 6 kB), insgesamt höchstens 28 kB. Sie überspringt `.env*`, Schlüsseldateien und Ordner wie `node_modules`. Sie liest nur reguläre Dateien, die im Ordner bleiben: Ein Symlink, der aus dem Ordner hinauszeigt, ein FIFO oder ein Gerät wird übersprungen. Diese Zusammenfassung geht als eine einzige Anfrage an das Modell, das der Chat nutzt, über die eigenen Anbietereinstellungen von dsh. Sie wird keinem Chat hinzugefügt. Im Projekt wird nichts geschrieben. Eine nach rechts gewischte Idee startet einen neuen Chat im Planmodus, also gelten Genehmigungen und Planprüfung wie gewohnt. **Sofort umsetzen** startet den Chat ohne Planmodus: Das Modell kann sofort Dateien ändern, mit den üblichen Genehmigungen des Chats und der automatischen Prüfung. Für später gemerkte Ideen (Titel, Zusammenfassung, Begründung, Aufwand) werden mit dem Ordnerpfad des Projekts in `storages/dsh-composer-plus/later.json` im dsh-Home gespeichert (Datei nur für den Besitzer). Ins Projekt kommt nichts. Der Verlauf der vorgeschlagenen Ideen (Titel, Zusammenfassung, Begründung, Aufwand, Datum, ob gestartet) wird auf dieselbe Weise in `storages/dsh-composer-plus/idea-history.json` gespeichert, höchstens 200 pro Projekt (die ältesten fallen zuerst weg). Seine Titel gehen beim nächsten **Funktionen vorschlagen** in diesem Projekt an das Modell.
|
|
124
138
|
- **Inhaltssuche:** Kein neuer Code durchsucht deine Chats. Das Plugin schaltet nur den eigenen Nachrichtenindex von dsh ein (SQLite FTS5, `dsh-session-query-sqlite`) und gibt ihm eine Datei: `$DSH_HOME/cache/composer-plus/session-search.db` (Datei und Ordner nur für den Besitzer). Die Datei enthält den Text deiner Benutzer- und Assistentennachrichten. Sie ist also so privat wie die Chatprotokolle in `$DSH_HOME/sessions`. Nichts verlässt deinen Rechner. Die Datei ist eine Kopie, die dsh neu erstellen kann: Du kannst sie löschen, während dsh geschlossen ist. Der Schalter liegt in `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
|
|
125
|
-
- **Runde zurücknehmen:** Vor jeder deiner Nachrichten macht der Host einen git-Snapshot des Chat-Ordners in einem eigenen Speicher: `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (Ordner nur für den Besitzer). Er enthält Kopien der Dateien in diesem Ordner, die git sieht (keine ignorierten Dateien), und ist also so privat wie das Projekt. Er liest die Objekte deines Repositorys (keine Kopie dessen, was git schon hat) und schreibt nie in Index, `HEAD`, Branches, Tags, Stash oder Config deines Repositorys. Die einzige Änderung, die git dort macht, ist ein neuerer Zeitstempel an Objektdateien, die es wiederverwendet (das verzögert ihre Bereinigung durch `git gc`). Ein Zurücknehmen mit Dateien schreibt nur reguläre Dateien im Ordner des Chats. Es überspringt Symlinks, Pipes und alles außerhalb des Ordners. Nichts verlässt deinen Rechner. Du kannst den Speicher löschen, während dsh geschlossen ist (das Zurücknehmen funktioniert dann nur für den Chat, bis neue Nachrichten kommen). **Chat löschen** löscht auch den Speicher eines Chats. Der Schalter liegt in `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
|
|
139
|
+
- **Runde zurücknehmen:** Vor jeder deiner Nachrichten macht der Host einen git-Snapshot des Chat-Ordners in einem eigenen Speicher: `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (Ordner nur für den Besitzer). Er enthält Kopien der Dateien in diesem Ordner, die git sieht (keine ignorierten Dateien), und ist also so privat wie das Projekt. Er liest die Objekte deines Repositorys (keine Kopie dessen, was git schon hat) und schreibt nie in Index, `HEAD`, Branches, Tags, Stash oder Config deines Repositorys. Die einzige Änderung, die git dort macht, ist ein neuerer Zeitstempel an Objektdateien, die es wiederverwendet (das verzögert ihre Bereinigung durch `git gc`). Ein Zurücknehmen mit Dateien schreibt nur reguläre Dateien im Ordner des Chats. Es überspringt Symlinks, Pipes und alles außerhalb des Ordners. Nichts verlässt deinen Rechner. Du kannst den Speicher löschen, während dsh geschlossen ist (das Zurücknehmen funktioniert dann nur für den Chat, bis neue Nachrichten kommen). **Chat löschen** löscht auch den Speicher eines Chats. Der Schalter liegt in `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Ein Zurücknehmen mit Dateien behält auch die Dateien, wie sie direkt davor waren (`refs/r/…` im selben Speicher), für **Wiederholen**. Die wiederholten Rücknahmen stehen in `$DSH_HOME/storages/dsh-composer-plus/redone.json` (nur für den Besitzer).
|
|
140
|
+
- **GitHub-Issue öffnen** (Funktionsideen → Liste **Später**): läuft nur, wenn du darauf klickst. Die Host-Hälfte führt dein eigenes GitHub CLI (`gh issue create`) im Ordner des Chats aus, mit dem gespeicherten Titel und der Zusammenfassung der Idee (und warum sie wichtig ist). `gh` nutzt seine eigene Anmeldung und das GitHub-Remote des Ordners. Daher landet das Issue mit deinem Konto in diesem Repository, und GitHub zeigt es allen, die dieses Repository sehen können. dsh entfernt Variablen, deren Name wie ein Token aussieht, aus den Befehlen, die es startet. Wenn du `gh` ein Token über `GH_TOKEN` oder `GITHUB_TOKEN` gegeben hast, gibt das Plugin nur diese an `gh` weiter. Der Link zum Issue wird mit der Idee in `later.json` gespeichert.
|
|
141
|
+
- **Chats, die diese Datei geändert haben** (Änderungen, das Menü „…“ einer Datei): Die Host-Hälfte liest die Protokolle der Chats, deren Ordner im selben Repository liegt, so wie dsh sie speichert, und liefert den Titel jedes Chats, die Zeit und die erste Zeile der Anfrage. Die Datei selbst öffnet sie nie.
|
|
142
|
+
- **Git-Branch in Chatzeilen:** Die Host-Hälfte führt `git branch --show-current` (nur lesend) im Ordner des Chats aus, wenn eine Runde beginnt und wenn sie endet, und speichert nur die Chat-ID, den Branch-Namen und die Zeit in `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` (Datei nur für den Besitzer, die neuesten 2000 Chats). Der Schalter liegt daneben in `branches.json`.
|
|
143
|
+
- **Im Chat suchen** läuft nur auf der Seite: Die Funktion liest den Text, den die Seite zeigt, und sendet nichts.
|
|
126
144
|
- **Chat als Markdown exportieren:** Die Host-Hälfte liest nur das eigene Protokoll des Chats (dieselben Nachrichten, die dsh zeigt) und gibt sie an die Seite. Sie liest keine Projektdatei und sendet nichts über das Netzwerk. Das Markdown geht nur in deine Zwischenablage oder in die Datei, die du speicherst.
|
|
127
145
|
- **Chat löschen:** verschiebt die eigenen Protokollordner des Chats (`$DSH_HOME/sessions/<project>/<chat>`) in den Papierkorb. Den Projektordner fasst es nicht an.
|
|
128
|
-
- **Für diesen Chat zulassen:** Freigaben werden in `$DSH_HOME/storages/dsh-composer-plus/grants.json` gespeichert (Rechte nur für den Besitzer). Eine Freigabe gilt für genau ein Tool in einem Chat. Wenn dieses Tool schreiben kann, deckt die Freigabe auch jeden Schreibvorgang ab. Widerrufe sie über den Chip in der Kopfzeile.
|
|
146
|
+
- **Für diesen Chat zulassen:** Freigaben werden mit dem Zeitpunkt, zu dem sie erteilt wurden, in `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` gespeichert (Rechte nur für den Besitzer). Eine Freigabe gilt für genau ein Tool in einem Chat, bis das Zeitlimit abläuft (standardmäßig 1 Stunde). Wenn dieses Tool schreiben kann, deckt die Freigabe auch jeden Schreibvorgang ab. Widerrufe sie über den Chip in der Kopfzeile.
|
|
129
147
|
- Die automatische Prüfung läuft weiterhin bei jedem Aufruf. Fehlgeschlagene Prüfungen werden nie automatisch erlaubt.
|
|
130
|
-
- **Mobile Verbindung:** aus, bis du sie einschaltest. Solange sie an ist, betreibt die Host-Hälfte das Tether-Gateway: HTTPS auf Port 19390, das nur dein WLAN-Subnetz und dein Tailnet (100.64.0.0/10) annimmt, und eine Kopplungsseite auf `127.0.0.1:19391` (nur dieser Mac). Ein Telefon braucht einen Einmalcode aus dem QR-Code (5 Minuten gültig) und deine Bestätigung mit **Approve** auf dem Mac. Das Telefon pinnt das Zertifikat des Gateways. Der Mac speichert von jedem Telefon-Token nur einen Hash (30 Tage, wird bei Nutzung verlängert). **Remove** schließt die Verbindungen dieses Telefons sofort. Telefone können nur dsh-Methoden aus einer Positivliste aufrufen (Chats, Prompts, Anhänge, Slash-Befehle, Genehmigungen, Fragen, Modelle, Agenten, Ziele), aber keine Einstellungen, Zugangsdaten, den Dateibrowser oder das Terminal. Daten: `$DSH_HOME/storages/dsh-composer-plus/mobile
|
|
148
|
+
- **Mobile Verbindung:** aus, bis du sie einschaltest. Solange sie an ist, betreibt die Host-Hälfte das Tether-Gateway: HTTPS auf Port 19390, das nur dein WLAN-Subnetz und dein Tailnet (100.64.0.0/10) annimmt, und eine Kopplungsseite auf `127.0.0.1:19391` (nur dieser Mac). Ein Telefon braucht einen Einmalcode aus dem QR-Code (5 Minuten gültig) und deine Bestätigung mit **Approve** auf dem Mac. Das Telefon pinnt das Zertifikat des Gateways. Der Mac speichert von jedem Telefon-Token nur einen Hash (30 Tage, wird bei Nutzung verlängert). **Remove** schließt die Verbindungen dieses Telefons sofort. Telefone können nur dsh-Methoden aus einer Positivliste aufrufen (Chats, Prompts, Anhänge, Slash-Befehle, Genehmigungen, Fragen, Modelle, Agenten, Ziele), aber keine Einstellungen, Zugangsdaten, den Dateibrowser oder das Terminal. „Tailscale only“ lehnt jede Verbindung aus dem lokalen Netzwerk ab, auch bereits offene. Das Zugriffsprotokoll speichert die neuesten 200 Verbindungsversuche (Zeit, IP-Adresse, Gerätename, zugelassen oder abgelehnt und warum) in `access.json`. Es enthält nie ein Token oder einen Kopplungscode. Daten: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (Dateien nur für den Besitzer). Details: [tether/README.md](tether/README.md).
|
|
131
149
|
- **Updates:** Die Host-Hälfte fragt `api.github.com` nach dem neuesten Release und `registry.npmjs.org` nach genau dieser Version. Über dich oder deine Chats wird nichts gesendet. Die Installation nutzt die Plugin-Verwaltung von dsh (`pnpm add dsh-composer-plus@<version>`; wenn dsh 0.2.1 das für ein installiertes Plugin ablehnt, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, und das Profil führt danach diese URL als Quelle des Plugins). Deshalb gelten die eigenen Prüfungen von dsh für Registry, Skripte und Versionskompatibilität. Pre-Release-Tags und ältere Versionen werden nie installiert.
|
|
132
150
|
- **Vorhersage der nächsten Nachricht:** standardmäßig an. Schalte sie unter **Einstellungen → Composer Plus** aus, um diese Modellaufrufe zu stoppen. Nach jeder beendeten Runde sendet die Host-Hälfte deine eigenen Nachrichten im Chat und die Textantworten des Agenten (keine Werkzeugausgabe, kein verborgener Kontext, kein Reasoning), höchstens etwa 6.000 Zeichen (den neuesten Teil), an das gewählte Modell (den dsh-Standard, wenn du kein anderes wählst). Das geht als eine einzige Anfrage über die eigenen Anbietereinstellungen von dsh. Im Chat wird nichts gespeichert: Die Vermutung kommt nicht in den Chatverlauf. Der Schalter und die Modellwahl liegen in `$DSH_HOME/storages/dsh-composer-plus/predict.json` (Datei nur für den Besitzer).
|
|
133
151
|
- **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).
|
|
134
152
|
- **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
|
+
- **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).
|
|
135
154
|
|
|
136
155
|
## Fehlerbehebung
|
|
137
156
|
|
|
@@ -144,8 +163,13 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
144
163
|
- **Keine ↶-Schaltfläche an meinen Nachrichten:** Runde zurücknehmen ist aus, der Chat ist ein Subagent-Chat, oder dsh-rewind-plugin ist installiert (nutze dessen ↶-Schaltfläche). Starte dsh nach einem Update neu.
|
|
145
164
|
- **Chat und Dateien ist ausgegraut:** Das Projekt ist kein git-Repository, es gibt keinen Snapshot von vor dieser Nachricht (die Nachricht ist älter als das Plugin, oder einer der 50 neuesten Snapshots hat ihn ersetzt), oder keine Datei hat sich geändert.
|
|
146
165
|
- **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
|
+
- **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.
|
|
147
167
|
- **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).
|
|
148
|
-
- **Die
|
|
168
|
+
- **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
|
+
- **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
|
+
- **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
|
+
- **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.14.0`), siehe den Hinweis zur Installation oben.
|
|
149
173
|
|
|
150
174
|
## Grenzen
|
|
151
175
|
|
|
@@ -161,17 +185,28 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
161
185
|
- **Chat löschen** braucht das Archiv von dsh (dsh 0.2.0 und neuer). Ein Chat (oder einer seiner Subagent-Chats), der nicht innerhalb von 15 s stoppt oder den ein anderes dsh hält, bleibt archiviert, und nichts wird verschoben. Auf anderen Systemen als macOS muss der Papierkorb-Ordner auf demselben Laufwerk liegen wie der Chatverlauf. Ein geöffneter Chat, den du löschst, bleibt archiviert und ausgeblendet im Speicher von dsh, bis dsh neu startet. Leere den Papierkorb selbst; dsh tut das nicht.
|
|
162
186
|
- Die Warteschlange von dsh hat keine `move`-Aktion. Deshalb verschiebt die Host-Hälfte des Plugins die eingereihte Nachricht selbst in der Warteschlange von dsh (eine Änderung, dieselbe Nachricht). Nachrichten mit Bildern oder Dateien lassen sich ebenfalls verschieben. Nur deine eigenen Nachrichten lassen sich verschieben: Eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange bleibt an ihrem Platz. Beginnt das Senden einer Nachricht, während du ziehst, wird nichts verschoben, und ein Hinweis meldet das.
|
|
163
187
|
- 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
|
+
- **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.
|
|
164
189
|
- **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.
|
|
165
|
-
- **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`. 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.
|
|
166
|
-
- Ein Sitzungslink funktioniert in Chats; ein Klick darauf öffnet den Chat 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.
|
|
191
|
+
- 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
|
+
- **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).
|
|
194
|
+
- **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.
|
|
195
|
+
- **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
|
+
- **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
|
+
- **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
|
+
- **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.
|
|
199
|
+
- **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).
|
|
167
200
|
- Eine Benachrichtigung, die vor einem Neustart gesendet wurde, holt dsh beim Klicken nur in den Vordergrund.
|
|
168
201
|
- 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.
|
|
169
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.
|
|
170
203
|
- 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.
|
|
171
204
|
- 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
|
+
- 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.
|
|
172
206
|
- dsh hat auch für einen Hinweis im Eingabefeld keinen Erweiterungspunkt. Deshalb liegt der Text von **Vorhersage der nächsten Nachricht** über dem eigenen Platzhalter von dsh (`[data-composer-placeholder]`). Wenn ein dsh-Update dieses Markup ändert, erscheint keine Vorhersage. Solange die Funktion an ist, kostet jede beendete Runde einen kurzen Modellaufruf.
|
|
173
207
|
- 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.
|
|
174
208
|
- **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
|
+
- **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.
|
|
175
210
|
- 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).
|
|
176
211
|
|
|
177
212
|
## Häufige Fragen
|
|
@@ -198,9 +233,29 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
198
233
|
|
|
199
234
|
**Kann dsh meinen Prompt vor dem Senden verbessern, wie die Schaltfläche Enhance prompt in Roo Code oder Augment?** Ja, mit **Prompt verbessern** (standardmäßig an): Tippe eine grobe Anfrage und klicke auf den Zauberstab neben dem Modellmenü. Die Funktion schreibt den Text mit diesem Chat und dem Projekt als Kontext neu, in deiner Sprache, und sendet ihn nicht. `Cmd/Ctrl+Z` oder **Verbesserung rückgängig machen** holt deinen Text zurück. Wähle ihr Modell unter **Einstellungen → Composer Plus → Prompt verbessern → Modell**.
|
|
200
235
|
|
|
236
|
+
**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
|
+
|
|
201
238
|
**Wie ordne ich eingereihte Nachrichten in dsh neu?** Ziehe den Griff ⠿ an einer eingereihten Nachricht, oder setze den Fokus darauf und drücke `↑` / `↓`.
|
|
202
239
|
|
|
203
|
-
**Wie
|
|
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.
|
|
241
|
+
|
|
242
|
+
**Wie entferne ich alle Ungelesen-Punkte eines Projekts auf einmal?** Seitenleiste → Schaltfläche **…** des Projekts → **Alle als gelesen markieren**.
|
|
243
|
+
|
|
244
|
+
**Kann ich auf eine einzelne Nachricht in einem langen Chat verlinken?** Ja: Fahre mit der Maus über die Nachricht und klicke auf **🔗**. Sende den Link in einem Chat: Ab dsh 0.2.1 öffnet ein Klick darauf den Chat an dieser Nachricht.
|
|
245
|
+
|
|
246
|
+
**Ich habe eine Runde aus Versehen zurückgenommen. Bekomme ich sie zurück?** Ja, mit **Wiederholen** über dem Eingabefeld, direkt nach dem Zurücknehmen: Es startet einen neuen Chat ab dem Moment direkt vor dem Zurücknehmen, mit denselben Nachrichten. Mit **Chat und Dateien** holt es auch die Dateien zurück.
|
|
247
|
+
|
|
248
|
+
**Welcher Chat hat diese Datei geändert?** Rechte Seitenleiste → **Änderungen** → **…** der Datei → **Chats, die diese Datei geändert haben**. Klicke auf eine Zeile, um diesen Chat bei der Anfrage zu öffnen, die die Änderung gemacht hat.
|
|
249
|
+
|
|
250
|
+
**Kann ich in einem langen Chat suchen?** Ja: Drücke im Chat `Cmd+F` auf einem Mac (`Ctrl+F` unter Windows und Linux). **Im Chat suchen** hebt jeden Treffer hervor und springt mit `Enter` und `Shift+Enter` zwischen ihnen.
|
|
251
|
+
|
|
252
|
+
**Wie sehe ich nur die Dateien, die ein Chat geändert hat?** Rechte Seitenleiste → **Änderungen** → **Dieser Chat**. Klicke auf **␣**, um Änderungen auszublenden, die nur Leerraum sind.
|
|
253
|
+
|
|
254
|
+
**Wie verhindere ich, dass die automatische Prüfung in einem Chat immer wieder nach demselben Tool fragt?** Klicke auf der Genehmigungskarte auf **Für diesen Chat zulassen**. Das gilt nur für genau dieses Tool in diesem Chat, standardmäßig für 1 Stunde. Widerrufe es über den Chip in der Kopfzeile. Ändere die Zeit unter **Einstellungen → Composer Plus → Für diesen Chat zulassen**.
|
|
255
|
+
|
|
256
|
+
**Ich habe mein iPhone verloren. Wie verhindere ich, dass es meinen Mac erreicht?** Klicke unten links in der Seitenleiste auf **Mobile Verbindung** und dann neben diesem iPhone auf **Remove**. Sein Schlüssel funktioniert sofort nicht mehr. Es kann nur mit einer neuen Kopplung zurückkommen, die du auf dem Mac bestätigst.
|
|
257
|
+
|
|
258
|
+
**Kann ich Tether mit Face ID sperren?** Ja: Schalte in Tether „Settings → Privacy → Lock with Face ID“ ein. Tether fragt dann beim Öffnen und bei der Rückkehr zur App nach Face ID (oder dem Code).
|
|
204
259
|
|
|
205
260
|
**Wie zeige ich in der Seitenleiste von dsh nur die Projekte, die ich heute genutzt habe?** Seitenleiste → Ansichtsoptionen (Schieberegler-Symbol) → **In den letzten 2 Stunden aktiv**. Wähle die Option erneut, um alle Projekte zu zeigen.
|
|
206
261
|
|
|
@@ -214,6 +269,12 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
214
269
|
|
|
215
270
|
**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.
|
|
216
271
|
|
|
272
|
+
**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
|
+
|
|
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 → **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.
|
|
275
|
+
|
|
276
|
+
**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
|
+
|
|
217
278
|
**Funktioniert es mit der Desktop-App?** Ja: Einstellungen → Plugins → **Plugin hinzufügen** → `dsh-composer-plus`. Getestet mit dsh 0.2.0-rc.2 (Desktop und Web) und 0.2.1-rc.2 (Web).
|
|
218
279
|
|
|
219
280
|
## Entwicklung
|
|
@@ -250,6 +311,22 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path
|
|
|
250
311
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
|
|
251
312
|
# Improve prompt (fake model, made-up git project): the wand sends the draft with the chat and the project, the answer replaces the draft, Cmd+Z and Undo bring it back + its thumbnail
|
|
252
313
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
|
|
314
|
+
# Goal check (fake model, made-up project): a failing test and a verifier "not done" keep the goal open, the agent's own test run is reused, a pass closes it, a token budget blocks it + its thumbnail
|
|
315
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
|
+
# 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
|
+
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
|
|
319
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
|
+
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
|
+
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
323
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-predict.mjs /path/to/dsh/lib/bin.js
|
|
324
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-complete.mjs /path/to/dsh/lib/bin.js
|
|
325
|
+
# Project search in a new chat: A–Z order, filter, Enter + its thumbnail
|
|
326
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path/to/dsh/lib/bin.js
|
|
327
|
+
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
253
330
|
```
|
|
254
331
|
|
|
255
332
|
```sh
|
|
@@ -260,7 +337,7 @@ npm test
|
|
|
260
337
|
|
|
261
338
|
**Regel für neue Funktionen:** Jede Funktionszeile unter Einstellungen → Composer Plus zeigt einen Screenshot. Füge die ID der Funktion zu `SHOT_OF` in `client.js` und zu `SHOTS` in `index.js` hinzu, und liefere `assets/features/<id>.webp` mit aus (aufgenommen im Wegwerf-Demo-dsh, englische Oberfläche, etwa 60 kB oder weniger). Trage die Funktion mit demselben Bild in `docs/features.json` ein und führe `npm run build:readme` aus: Es schreibt die Funktionstabelle von `README.md` und jeder übersetzten `README.<id>.md` sowie die Liste in `llms.txt`. `test/shots.test.mjs` schlägt fehl, wenn eine Funktion keinen Screenshot hat, und `test/browser-settings-shots.mjs` prüft die echte Einstellungsseite. Die vollständige Checkliste für jede Änderung steht in [AGENTS.md](AGENTS.md).
|
|
262
339
|
|
|
263
|
-
Die Tests führen das echte `client.js` gegen ein Fake-React/DOM aus und das echte `index.js` (Host-Hälfte) gegen ein temporäres git-Repository. Die Tests des Tether-Gateways (`test/tether-gateway.test.mjs`) nutzen einen Mock-dsh-Host und ein echtes TLS-Gateway. Die iPhone-App liegt in `tether/ios` (siehe [tether/README.md](tether/README.md) und [tether/AGENTS.md](tether/AGENTS.md)). `node test/browser-history.mjs '<dsh web URL with ?token=…>'` prüft den Eingabeverlauf in einem echten Browser gegen ein Wegwerf-`dsh web` mit eigenem `DSH_HOME`.
|
|
340
|
+
Die Tests führen das echte `client.js` gegen ein Fake-React/DOM aus und das echte `index.js` (Host-Hälfte) gegen ein temporäres git-Repository. Die Tests des Tether-Gateways (`test/tether-gateway.test.mjs`) nutzen einen Mock-dsh-Host und ein echtes TLS-Gateway. Die iPhone-App liegt in `tether/ios` (siehe [tether/README.md](tether/README.md) und [tether/AGENTS.md](tether/AGENTS.md)). [docs/ROUTES.md](docs/ROUTES.md) listet jede Host-Route, ihre Anfrage und ob Tether sie aufrufen kann. `node test/browser-history.mjs '<dsh web URL with ?token=…>'` prüft den Eingabeverlauf in einem echten Browser gegen ein Wegwerf-`dsh web` mit eigenem `DSH_HOME`.
|
|
264
341
|
|
|
265
342
|
Sprachpakete sind reine Daten-JSON-Dateien in `locales/<id>.json`. `npm run build:locales` bettet sie in den einzigen Client-Einstiegspunkt ein (kein Übersetzungsdienst, kein Download zur Laufzeit). `npm test` prüft jedes Paket auf vollständige Schlüsselabdeckung, identische Platzhalter und Zeilenumbrüche sowie auf das Verhalten von Systemsprache und manueller Auswahl. Für isolierte Prüfungen in der echten App mit einem lokal installierten Playwright:
|
|
266
343
|
|