dsh-composer-plus 1.22.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.de.md CHANGED
@@ -14,7 +14,7 @@ Komfortfunktionen im Stil von Codex für die Desktop- und Weboberfläche von [De
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness mit Composer Plus: Das laufende Projekt zeigt einen Spinner in der Seitenleiste, und der Änderungsbereich zeigt einen git-Diff"></p>
16
16
 
17
- Inoffizielles Community-Plugin. Die einzigen Netzwerkaufrufe sind die Update-Prüfung (GitHub-Releases und die npm-Registry). Schalte **Automatische Updates** aus, um sie beim Start zu stoppen. **Funktionsideen** ruft das eigene Modell deines Chats nur auf, wenn du auf **Funktionen vorschlagen** klickst. **Vorhersage der nächsten Nachricht** (standardmäßig an) ruft nach jeder beendeten Runde einmal das in den Einstellungen gewählte Modell auf (den dsh-Standard, wenn du kein anderes wählst), ohne Klick. Schalte sie unter **Einstellungen → Composer Plus** aus, um diese Aufrufe zu stoppen. **Beim Tippen vervollständigen** (standardmäßig aus) ruft bei jeder Pause beim Tippen das dafür gewählte Modell auf (standardmäßig das der Vorhersage), nachdem du die Funktion eingeschaltet hast. **Prompt verbessern** ruft ein Modell nur auf, wenn du auf seinen Zauberstab klickst. **Aufgabentafel** ruft für jede Aufgabe, die du auf der Tafel startest, einmal das Modell des neuen Chats für die Schlagwörter auf. Mit der Einstellung **KI-Zusammenfassung** (Standard ist **Schnell (ohne KI)**) ruft sie auch das Modell eines laufenden Chats für eine kurze Fortschrittsnotiz auf, während du den Fortschritt dieser Aufgabe auf der Tafel oder in Tether ansiehst. **Zielprüfung** (standardmäßig an) ruft jedes Mal einmal ein Modell auf, wenn der Agent ein `/goal` in einem automatischen Durchlauf als abgeschlossen markiert. **Mobile Verbindung** (standardmäßig aus) nimmt iPhone-Verbindungen aus deinem lokalen Netz oder Tailnet erst an, wenn du sie einschaltest.
17
+ Inoffizielles Community-Plugin. Die Update-Prüfung macht Netzwerkaufrufe (GitHub-Releases und die npm-Registry). Schalte **Automatische Updates** aus, um sie beim Start zu stoppen. **Türkisches Skill-Paket** (standardmäßig an) lädt turkish-anti-ai-skill von GitHub und sucht einmal am Tag nach einer neuen Version, nur solange **App-Sprache** Türkçe ist; schalte es in **Einstellungen → Composer Plus** aus, um diese Aufrufe zu stoppen. **Funktionsideen** ruft das eigene Modell deines Chats nur auf, wenn du auf **Funktionen vorschlagen** klickst. **Vorhersage der nächsten Nachricht** (standardmäßig an) ruft nach jeder beendeten Runde einmal das in den Einstellungen gewählte Modell auf (den dsh-Standard, wenn du kein anderes wählst), ohne Klick. Schalte sie unter **Einstellungen → Composer Plus** aus, um diese Aufrufe zu stoppen. **Beim Tippen vervollständigen** (standardmäßig aus) ruft bei jeder Pause beim Tippen das dafür gewählte Modell auf (standardmäßig das der Vorhersage), nachdem du die Funktion eingeschaltet hast. **Prompt verbessern** ruft ein Modell nur auf, wenn du auf seinen Zauberstab klickst. **Aufgabentafel** ruft für jede Aufgabe, die du auf der Tafel startest, einmal das Modell des neuen Chats für die Schlagwörter auf. Mit der Einstellung **KI-Zusammenfassung** (Standard ist **Schnell (ohne KI)**) ruft sie auch das Modell eines laufenden Chats für eine kurze Fortschrittsnotiz auf, während du den Fortschritt dieser Aufgabe auf der Tafel oder in Tether ansiehst. **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.22.0`.
32
+ > Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.24.0`.
33
33
 
34
34
  ## Funktionen
35
35
 
@@ -48,6 +48,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
48
48
  | **Fokus im Eingabefeld behalten** | <a id="feature-keepfocus"></a>Nachdem du einen `/`-Befehl oder einen Skill gesendet hast, bleibt der Cursor im Eingabefeld, und du kannst sofort weitertippen. Das gilt auch für Tastaturmakros, die einen Befehl tippen und `Enter` drücken. dsh schaltet das Eingabefeld schreibgeschützt, während es den Befehl auflöst, und der Browser nimmt dann den Fokus weg. Diese Funktion setzt den Fokus zurück, außer ein Menü, ein Dialog oder ein anderes Feld hat ihn. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Screenshot: Fokus im Eingabefeld behalten"></a> |
49
49
  | **Fragekarte an das Fenster anpassen** | <a id="feature-questionfit"></a>Wenn der Agent dir eine Frage stellt, scrollen Frage und Antworten zusammen in der Karte, und **Überspringen** und **Senden** bleiben unten sichtbar. Die Karte nutzt die Höhe des Fensters (abzüglich 200 px für die Chat-Kopfzeile und einen Streifen des Chats), sie wächst und schrumpft also mit dem Fenster. Ohne diese Funktion begrenzt dsh die Karte auf 60 % des Fensters (höchstens 520 px), und nur die Antworten scrollen: Eine lange Frage kann ihr eigenes Ende, die Antworten und die Schaltflächen aus der Karte drängen. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Screenshot: Fragekarte an das Fenster anpassen"></a> |
50
50
  | **Chat-Kopfzeile an Fenster anpassen** | <a id="feature-headerfit"></a>In einem schmalen Fenster überdecken sich die Schaltflächen in dsh's Chat-Kopfzeile (Modus, Subagenten, Hintergrundaufgaben, Öffnen in, die Branch-Plakette und die Freigabe-Plakette) nicht mehr. Der Chat-Titel behält mindestens 120 px; Schaltflächen, die nicht passen, rücken rechts in eine zweite Zeile, und jede bleibt anklickbar. Passt alles in eine Zeile (breites Fenster), ist die Kopfzeile genau die von dsh. Ohne diese Funktion verkleinert dsh nur den Titel: Mit einem Subagenten und Hintergrundaufgaben schieben sich seine Schaltflächen in einer schmalen Chat-Spalte übereinander. Die Branch-Plakette (**Ein Branch pro Chat**) und die Freigabe-Plakette (**Für diesen Chat zulassen**) passen sich auch bei ausgeschaltetem Schalter an die Kopfzeile an. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Screenshot: Chat-Kopfzeile an Fenster anpassen"></a> |
51
+ | **Fenstergröße merken** | <a id="feature-windowsize"></a>Die Desktop-App von dsh öffnet ihr Fenster bei jedem Start in 1280 × 820. Mit dieser Funktion öffnet es sich mit der Größe und Position, die das Fenster zuletzt hatte. Die Größe wird bei jeder Größenänderung oder Verschiebung des Fensters gespeichert und kommt beim nächsten Start zurück, sobald das Plugin lädt. Ein Fenster im Vollbild oder minimiert wird nicht gespeichert; eine Position auf einem Bildschirm, der nicht mehr angeschlossen ist, kommt auf dem Hauptbildschirm zurück. Nur in der Desktop-App: Ein Browser-Tab kann die Größe seines Fensters nicht ändern. | <a href="assets/features/windowSize.webp"><img src="assets/features/windowSize.webp" width="160" alt="Screenshot: Fenstergröße merken"></a> |
51
52
  | **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> |
52
53
  | **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> |
53
54
  | **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> |
@@ -69,9 +70,12 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
69
70
  | **In einem neuen Chat fortsetzen** | <a id="feature-handoffchat"></a>Rechtsklick auf einen Chat in der Seitenleiste (oder sein Menü **…** öffnen) → **In einem neuen Chat fortsetzen…**. Ein Aufruf an das eigene Modell des Chats schreibt aus dem, was der Chat zeigt, eine Übergabenotiz: Aufgabe, Ergebnisse, Erledigt, Entscheidungen, Offene Punkte und Nächster Schritt (Tool-Aufrufe und ihre Ergebnisse sind die Belege; Schritte, die du zurückgenommen hast, werden weggelassen). Die Notiz öffnet sich in einem Dialog: Lies und bearbeite sie. **Neu schreiben** schreibt eine neue Notiz. **Neuen Chat starten** (oder `Cmd/Ctrl+Enter`) öffnet einen neuen Chat im selben Projekt, mit der Notiz und einem Link zum alten Chat als erster Nachricht; der alte Chat bleibt, wie er ist. Nutze die Funktion, wenn ein langer Chat voll oder langsam ist, oder um morgen weiterzumachen. Nichts wird in das Projekt geschrieben. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Screenshot: In einem neuen Chat fortsetzen"></a> |
70
71
  | **Kontextaufschlüsselung** | <a id="feature-contextbreakdown"></a>Rechte Seitenleiste → `+` → **Kontext**. Die Seite zeigt, was den Modellkontext des geöffneten Chats gerade füllt und wie viel vom Kontextfenster belegt ist: System-Prompt, Projektanweisungen (AGENTS.md), Skills, deine Nachrichten, Agent-Antworten und Tool-Aufrufe, Tool-Ergebnisse (nach Tool), MCP-Ergebnisse (nach Server), Tool-Definitionen, die Komprimierungszusammenfassung und weitere Kontexthinweise, jeweils mit Tokens und Anteil. Klicke auf einen Teil, um seine Tools oder Server zu sehen. Die Seite liest nur das Chatprotokoll, nach `/compact` und Rücknahmen, und ruft kein Modell auf; sie liest nach jeder Runde und mit **Aktualisieren** neu. Nutze sie, um zu sehen, warum ein Chat langsam oder voll ist, zum Beispiel wegen eines großen MCP-Tool-Ergebnisses oder vieler Tool-Definitionen. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Screenshot: Kontextaufschlüsselung"></a> |
71
72
  | **Geplante Schritte** | <a id="feature-plannedsteps"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Der Agent bekommt das Tool `plan_next_steps`: In derselben Nachricht wie ein Befehl kann er die nächsten Befehle mit den genauen Argumenten und einer Bedingung planen, etwa „führe `npm test` aus, wenn der Build gelingt“. Erfüllt das Ergebnis die Bedingung, führt Composer Plus den nächsten Schritt selbst aus, ohne neuen Modellaufruf, sodass ein langer Chat weniger Tokens verbraucht. Der Schritt erscheint im Chat als kurze Zeile „Composer Plus · Planned steps: ran `test` … without a model call“, danach folgen sein Tool-Aufruf und sein Ergebnis. Nur Schritte mit `bash`, `read`, `grep` und `glob`; Freigaben, Sandbox und Geschützte Dateien gelten für jeden Schritt wie gewohnt. Das Modell antwortet wieder, wenn eine Bedingung nicht erfüllt ist, wenn zwei Schritte gleichzeitig bereit sind, nach dem letzten Schritt und wenn du eine Nachricht sendest. Die Idee stammt aus HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Screenshot: Geplante Schritte"></a> |
73
+ | **Türkisches Skill-Paket** | <a id="feature-turkishskill"></a>Nur solange **App-Sprache** Türkçe ist (standardmäßig an; schalte es in **Einstellungen → Composer Plus** aus). Composer Plus lädt den Open-Source-Skill [turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) (MIT, von Yüce Zerey) von GitHub und fügt ihn den Skills von dsh hinzu. Bitte den Agenten, einen türkischen Text zu vermenschlichen, umzuschreiben oder zu schreiben: dsh lädt den Skill, und seine Regeln helfen dem Agenten, natürliches Türkisch ohne KI-Muster zu schreiben. Nur die Markdown-Dateien des Pakets bleiben; jede Datei muss zur Dateiliste von GitHub passen, und kein Skript des Pakets läuft. Einmal am Tag fragt das Plugin GitHub nach einer neuen Version und installiert sie. Die Zeile zeigt die installierte Version oder warum sie nicht installiert ist. In einer anderen Sprache wird der Skill nicht installiert; stelle die Sprache wieder auf Türkçe, dann kommt er zurück. | <a href="assets/features/turkishSkill.webp"><img src="assets/features/turkishSkill.webp" width="160" alt="Screenshot: Türkisches Skill-Paket"></a> |
74
+ | **Codebasis entwirren** | <a id="feature-untanglecodebase"></a>Standardmäßig an; schalte die Funktion unter **Einstellungen → Composer Plus** aus. Fügt den Skill `/untangle-codebase` aus [caldoai/skills](https://github.com/caldoai/skills) (MIT, © 2026 Maze) der Skill-Liste von dsh hinzu. Tippe in einem Chat `/untangle-codebase` (er erscheint im `/`-Menü), auf Wunsch gefolgt von einem Bereich als Schwerpunkt, zum Beispiel `/untangle-codebase src/api`, und sende die Nachricht. Der Agent fragt zuerst, ob er auch Kommentare entfernen soll, die nur den Code wiederholen, und Tests, die keinen echten Fehler finden können. Dann listet er jede Kopie, versteckte Kopplung, unnötige Kopplung, reine Durchreich-Hülle, jedes Stück toten Code und jeden einmaligen Sonderfall auf, plant die Korrekturen von Grund auf, setzt sie als Ziel um und prüft mit Subagenten erneut, bis nichts Lohnendes mehr zu korrigieren ist. Nur du kannst ihn starten: Das Modell sieht ihn nicht in seiner Skill-Liste, daher kostet er in anderen Chats keine Tokens. Ein Skill mit demselben Namen im Projekt oder in `~/.dsh/skills` hat Vorrang. Starte ihn in einem Chat von **Ein Branch pro Chat** und prüfe das Ergebnis im **Änderungsbereich**. In Tether: Tippe `/untangle-codebase` in das Nachrichtenfeld. | <a href="assets/features/untangleCodebase.webp"><img src="assets/features/untangleCodebase.webp" width="160" alt="Screenshot: Codebasis entwirren"></a> |
72
75
  | **Geschützte Dateien** | <a id="feature-protectedfiles"></a>Standardmäßig an. Die eigenen Datei-Tools des Agenten können Dateien, die zu deinen Mustern passen, weder lesen noch ändern: `read`, `read_image` und `grep` auf eine Datei werden bei Mustern mit **Lesen und Schreiben** abgelehnt, `write`, `edit` und `str_replace_editor` bei beiden Arten. Der Agent liest den Grund und wird angewiesen, dich zu fragen. Die Standardmuster sind `.env*`, `*.pem` und `*.key`. Einstellungen → Composer Plus → **Geschützte Dateien**: Füge ein Muster hinzu (zum Beispiel `published/**` oder `config/*.yml`), klicke auf seine Art, um zwischen **Lesen und Schreiben** und **nur Schreiben** zu wechseln, entferne es mit ✕ oder klicke auf **Standardwerte verwenden**. Ein Muster ohne `/` passt auf einen Dateinamen in jedem Ordner. Das ist eine Leitplanke, keine Sandbox: Ein Shell-Befehl (`cat .env`), ein Skript oder ein MCP-Tool kann die Datei trotzdem erreichen (siehe Grenzen). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Screenshot: Geschützte Dateien"></a> |
73
76
  | **Blockierte Befehle** | <a id="feature-blockedcommands"></a>Standardmäßig an, mit einer leeren Liste. Die Shell-Befehle des Agenten (`bash`, `pwsh`) können keinen Befehl ausführen, der zu deinen Regeln passt: Eine Regel mit **blockieren** lehnt den Aufruf ab (der Agent liest den Grund und wird angewiesen, dich zu fragen), eine Regel mit **zuerst fragen** zeigt die Genehmigungskarte von dsh, und der Befehl läuft nur, wenn du ihn zulässt. Einstellungen → Composer Plus → **Blockierte Befehle**: Gib eine Regel ein (zum Beispiel `npm publish`, `git push --force` oder `ssh *192.168.2.19`), klicke auf die Art, um zwischen **blockieren** und **zuerst fragen** zu wechseln, dann auf **Hinzufügen**; klicke auf die Art einer Regel, um sie zu ändern, und entferne sie mit ✕. Eine Regel ist ein Befehlsname und Wörter, die in dieser Reihenfolge nach ihm kommen müssen; `*` passt auf beliebigen Text. Die Funktion findet den Befehl auch nach `&&`, `;`, `\|`, innerhalb von `$(…)`, `bash -c "…"` oder `eval` sowie nach `sudo` oder `env`. Das ist eine Leitplanke, keine Sandbox: Eine Variable (`$CMD`), eine Skriptdatei oder ein anderes Programm kann den Befehl trotzdem ausführen (siehe Grenzen). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Screenshot: Blockierte Befehle"></a> |
74
77
  | **Aufgabentafel** | <a id="feature-taskboard"></a>Linke Seitenleiste → **Aufgabentafel**, oder drücke überall in dsh `Cmd+Shift+K` (`Strg+Shift+K` unter Windows und Linux). Eine Kanban-Tafel deiner dsh-Chats mit dem Live-Zustand, den die Seitenleiste zeigt: Ein Chat, der auf deine Genehmigung, deine Antwort oder die Prüfung eines Plans wartet, steht mit einem orangen Punkt in **In Prüfung**, ein laufender Chat steht in **In Arbeit**, ein beendeter Chat, den du noch nicht geöffnet hast, steht in **Fertig** (grün). Wenn du einen Chat öffnest, verlässt seine Karte **Fertig** von selbst; klicke unter den grünen Karten auf **Kürzlich beendet (N)**, um die beendeten Chats zu sehen, die du gelesen hast (die 10 neuesten, dann **N ältere anzeigen**; offen oder zu bleibt auf diesem Gerät). Ein Chat, der fertig wird, während er hinter der Tafel offen ist (eine **Neue Aufgabe**), bleibt grün, bis du ihn öffnest. Klicke oben auf der Tafel auf den Projektnamen, um die Projektliste zu öffnen, und wähle ein Projekt oder **Alle Projekte**; der Ordner eines Branches pro Chat zählt zu seinem Projekt. Die Liste schließt sich nach der Auswahl, mit `Esc` oder mit einem Klick außerhalb. Tippe oben in der Liste in **Projekte durchsuchen**, um ein Projekt nach seinem Namen zu finden (Groß- und Kleinschreibung und Akzente spielen keine Rolle; `Esc` leert das Feld), drücke `Enter`, um den ersten Treffer zu wählen, und klicke auf **In den letzten 2 Stunden aktiv**, um nur Projekte mit einem Chat zu zeigen, der wartet, läuft, ungesehen fertig wurde oder sich in den letzten 2 Stunden geändert hat (bleibt auf diesem Gerät gespeichert). **Neue Aufgabe** (oder `n`) öffnet den eigenen neuen Chat von dsh in dem Projekt, das die Tafel zeigt (bei **Alle Projekte** das Projekt, das Neue Sitzung von dsh wählt), damit du wie in jedem Chat Dateien hinzufügen, Befehle nutzen und das Modell wählen kannst. Wenn deine erste Nachricht abgeht, kommt die Tafel von selbst zurück. Bis dahin wartet der Chat oben in **In Arbeit** als **Neue Aufgabe**: Klicke darauf, um die erste Nachricht zu schreiben. Ein Projekt mit einem Chat, der auf dich wartet, hat in der Projektliste einen orangen Punkt (der Projektname oben hat ihn auch, solange ein Chat wartet). dsh benennt den Chat, und das Modell des Chats schreibt aus dieser Nachricht bis zu 3 Schlagwörter. Klicke auf eine Karte, um ihren Chat zu öffnen. Klicke auf eine orange Karte (oder auf ihr **Antworten**), um direkt auf der Tafel zu antworten; das Feld hat **Chat öffnen** für den ganzen Chat: **Ablehnen** oder **Einmal zulassen**, **Genehmigen** oder **Änderungen anfordern** bei einem Plan, oder die Optionen und dein eigener Text bei einer Frage. Klicke auf einer beendeten Karte auf **×**, um sie von der Tafel zu nehmen, oder öffne **Kürzlich beendet** und klicke oben in **Fertig** auf **Alle entfernen**, um diese Karten von der Tafel zu nehmen: Zuerst zeigt ein Dialog, wie viele Karten welches Projekts gehen, und ungelesene (grüne) Karten bleiben. In den 8 Sekunden danach legt **Rückgängig** die Karten zurück; **Entfernt (N)** unter **Fertig** listet die Karten, die von der Tafel genommen sind, und **Zurücklegen** zeigt eine davon wieder in **Fertig**. Kein Chat wird gelöscht: Die Chats bleiben in der Seitenleiste von dsh, die Tafel merkt sich das auch nach einem Neustart (Tether zeigt dieselbe Tafel), und ein Chat, der wieder läuft, kommt zurück. Zeige auf eine Karte in **In Arbeit** (oder setze den Tastaturfokus darauf), um ihren Fortschritt zu sehen: wie lange der Chat läuft, den Schritt seiner To-do-Liste, das Tool, das gerade läuft, und die letzte Zeile des Agenten. Unter Einstellungen → Composer Plus → Aufgabentafel wählt **Fortschritt beim Darüberfahren** zwischen **Schnell (ohne KI)** (Standard: liest nur den Chat) und **KI-Zusammenfassung** (ein kurzer Aufruf an das Modell des Chats schreibt zusätzlich ein oder zwei Sätze). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Screenshot: Aufgabentafel"></a> |
78
+ | **Assistent** | <a id="feature-assistant"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Klicke dann in der linken Seitenleiste auf **Assistent** (direkt unter **Aufgabentafel**): Es öffnet sich ein dauerhafter Chat, den du wie einen ChatGPT- oder Grok-Chat als persönlichen Assistenten nutzt. Der erste Klick legt den Ordner `~/Assistant` an, fügt ihn als Projekt "Assistant" hinzu und startet den Chat mit dem Berechtigungsmodus workspace-write und dem Standardmodell von dsh; jeder spätere Klick öffnet denselben Chat (ein archivierter kommt zurück, ein gelöschter wird neu angelegt). Bitte ihn um eine Erinnerung („erinnere mich in 2 Minuten daran, Wasser zu trinken“): Er nutzt die geplanten Aufgaben von dsh, daher führt die Erinnerung den Chat zu dieser Zeit aus, und Tether sendet seine Benachrichtigung "Turn finished", wenn Mobile Verbindung an ist. Bitte ihn, im Web zu suchen, oder frag ihn nach deinen anderen Chats: Er kann die Chats aller Projekte auflisten (läuft, wartet auf dich oder inaktiv) und die neuesten Nachrichten eines Chats lesen. Er kann auch einem Chat eine Nachricht senden, in einem Projekt einen neuen Chat starten, einen laufenden Chat stoppen oder einen Chat archivieren: Jede dieser vier Aktionen zeigt zuerst die Genehmigungskarte von dsh (auch in Tether), und nichts passiert, bevor du auf **Einmal zulassen** klickst. Er hat kein Tool zum Löschen. Nur dieser Chat hat diese Tools und seine kurzen Anweisungen; Text, den er auf einer Webseite oder in einem anderen Chat liest, gilt als Daten, nicht als Anweisung. Speichere dein Profil im Gedächtnis dieses Projekts (**Projektgedächtnis**, Thema "profil"), statt es ihm jedes Mal zu erzählen. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Screenshot: Assistent"></a> |
75
79
  | **Projektgedächtnis** | <a id="feature-projectmemory"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Jeder Projektordner bekommt ein eigenes Gedächtnis, das spätere Chats dieses Projekts lesen, so wie DS Bot eines pro Bot führt. Nach jeder abgeschlossenen Runde liest ein Aufruf an das Modell des Chats die neuen Nachrichten (keine zurückgenommenen), speichert deine dauerhaften Vorlieben, Entscheidungen und Fakten als kurze Notizen und ändert oder entfernt alte. Der Agent kann Notizen auch selbst speichern, entfernen und suchen (`memory_remember`, `memory_forget`, `memory_recall`). Eine Notiz kann auch global sein: Jedes Projekt liest sie. Ein neuer Chat bekommt die Notizen in seinem Systemprompt; eine später gespeicherte Notiz erscheint ab dem nächsten Chat. Die Dateien sind Markdown im dsh-Basisordner (`storages/dsh-composer-plus/memory/`), nie im Projektordner. **Gedächtnis öffnen** in derselben Zeile zeigt alle gespeicherten Notizen nach Projekt gruppiert (und das globale Gedächtnis), mit einem Filter. Schreibe in eigenen Worten, was sich ändern soll (zum Beispiel „ich nutze jetzt pnpm statt yarn“), dann **Änderungen ansehen**: Das Standardmodell von dsh schlägt die Änderungen vor, und erst **Anwenden** speichert sie. In Tether: Menü des Chat-Titels → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Screenshot: Projektgedächtnis"></a> |
76
80
  | **Versionsverlauf des Gedächtnisses** | <a id="feature-memoryhistory"></a>Standardmäßig an, solange **Projektgedächtnis** an ist. Vor jedem Speichern des Gedächtnisses (der Agent, die Prüfung nach einem Durchgang, **Gedächtnis öffnen**) wird eine Kopie der Notizen im vorherigen Zustand behalten. Wähle in **Gedächtnis öffnen** ein Projekt oder **Globales Gedächtnis** und dann **Verlauf**: die Versionen nach Datum und wer das Gedächtnis danach geändert hat. Wähle eine Version, um als Diff zu sehen, was eine Wiederherstellung ändert, dann **Wiederherstellen**. Die Notizen vor einer Wiederherstellung werden auch behalten, sodass du sie rückgängig machen kannst. Die neuesten 50 Versionen jedes Gedächtnisses bleiben. In Tether: Menü des Chat-Titels → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Screenshot: Versionsverlauf des Gedächtnisses"></a> |
77
81
  | **Gedächtnis nach AGENTS.md exportieren** | <a id="feature-memoryexport"></a>Wähle in **Gedächtnis öffnen** ein Projekt und dann **Nach AGENTS.md exportieren**: Die Notizen dieses Projekts kommen in einen markierten Abschnitt von `AGENTS.md` in seinem Ordner, damit du sie committen und mit deinem Team und anderen Agent-Tools teilen kannst. Du siehst die Änderung zuerst als Diff; nur **AGENTS.md schreiben** speichert sie. Der nächste Export ersetzt nur diesen Abschnitt. Globales Gedächtnis, Quellen und Daten bleiben draußen. In Tether: Menü des Chat-Titels → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Screenshot: Gedächtnis nach AGENTS.md exportieren"></a> |
@@ -84,6 +88,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
84
88
  | **Mit Notiz ablehnen** | <a id="feature-rejectnote"></a>Die Genehmigungskarte zeigt **Mit Notiz ablehnen…** neben **Ablehnen**. Klicke darauf, schreibe den Grund oder was stattdessen zu tun ist, und klicke auf **Ablehnen** (oder drücke `Enter`; `Shift+Enter` fügt eine Zeile ein, `Esc` schließt das Feld). Die Notiz geht zuerst an den Agenten, als Nachricht in den wartenden Durchgang, dann wird die Anfrage abgelehnt: Das Modell liest die Ablehnung und deine Notiz im selben Durchgang, ohne eine weitere Nachricht von dir. Kann die Notiz nicht gesendet werden, wird nichts abgelehnt und das Feld bleibt offen. In Tether: Genehmigungsblatt → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="Screenshot: Mit Notiz ablehnen"></a> |
85
89
  | **Geheime Eingabe** | <a id="feature-secretinput"></a>Der Agent bekommt das Tool `request_secret`. Braucht er ein Passwort, einen Token oder einen API-Schlüssel, fragt er damit statt im Chat: In der Zeile des Tools erscheint eine Karte mit dem Namen, dem Grund, einem Passwortfeld, **Speichern** und **Ablehnen**. **Speichern** schreibt den Wert in eine Datei auf diesem Mac, die nur du lesen kannst, und der Agent bekommt nur den Pfad der Datei, den er als Eingabe eines Befehls nutzt (zum Beispiel `"$(cat <path>)"`). Zeigt ein späteres Tool-Ergebnis den Wert, ersetzt `[secret]` ihn, bevor das Modell ihn sieht. Die Datei wird am Ende des Durchgangs gelöscht. **Ablehnen** sagt dem Agenten, dass du ihn nicht gegeben hast. Schalte die Funktion unter **Einstellungen → Composer Plus** aus, um das Tool zu entfernen. In Tether: die Leiste „Secret: …“ über dem Eingabefeld → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="Screenshot: Geheime Eingabe"></a> |
86
90
  | **In Antwort zitieren** | <a id="feature-quotereply"></a>Markiere einen Teil einer Antwort: Über der Markierung erscheint die Schaltfläche **Zitieren**. Klicke darauf: Der Teil kommt als Markdown-Zitat (`> …`) an die Cursorposition im Eingabefeld, gefolgt von einer leeren Zeile, und das Eingabefeld bekommt den Fokus, sodass du deine Antwort darunter schreibst. Nur der Antworttext zählt, nicht das Nachdenken, Tool-Zeilen oder deine eigenen Nachrichten. Ein Zitat hat höchstens 2.000 Zeichen. `Cmd+Z` (`Strg+Z`) entfernt es. In Tether: eine Antwort gedrückt halten → Quote (die ganze Antwort). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="Screenshot: In Antwort zitieren"></a> |
91
+ | **Aus Dateivorschau zitieren** | <a id="feature-previewquote"></a>Öffne eine Datei in der rechten Seitenleiste (**Dateien im Arbeitsbereich** oder eine Datei, die der Chat geöffnet hat) und markiere Zeilen darin: Über der Markierung erscheint die Schaltfläche **Zitieren**. Klicke darauf: Dateipfad, Zeilennummern und Zeilen kommen an die Cursorposition im Eingabefeld, damit der Agent weiß, welchen Teil du meinst, und das Eingabefeld bekommt den Fokus. Code- und Textdateien liefern `src/login.js:2-3` und die Zeilen als Codeblock; Markdown- und PDF-Dateien liefern den Pfad (bei einer PDF auch die Seite, `docs/spec.pdf#page=3`) und ein `> …`-Zitat. Ein Pfad im Ordner des Chats ist relativ. Höchstens 2.000 Zeichen. `Cmd+Z` (`Strg+Z`) macht das Einfügen rückgängig. Nicht in Tether. | <a href="assets/features/previewQuote.webp"><img src="assets/features/previewQuote.webp" width="160" alt="Screenshot: Aus Dateivorschau zitieren"></a> |
87
92
  | **Nebenchat** | <a id="feature-sidechat"></a>Schreibe eine Nebenfrage ins Eingabefeld und klicke auf den Sprechblasen-Knopf (**Im Nebenchat fragen**): Eine Kopie des Chats öffnet sich und beantwortet sie im Nur-lesen-Modus von dsh, während der Chat weiterarbeitet. Die Kopie kennt den Chat bis jetzt, außer Nachrichten, die noch in der Warteschlange warten, und nutzt sein Modell. Eine Leiste über ihrem Eingabefeld hat **Zurückholen**: Der Chat öffnet sich, und sein Eingabefeld bekommt deine Fragen (als `> `-Zitate) und die Antworten. **Zurück zum Chat** öffnet nur den Chat. Der Nebenchat bleibt als „↳ <Frage>“ in der Seitenleiste; archiviere ihn dort. In Tether: Menü des Chat-Titels → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="Screenshot: Nebenchat"></a> |
88
93
  | **Diff-Notizen** | <a id="feature-diffcomments"></a>Öffne im **Änderungsbereich** das Diff einer Datei und klicke bei einer Zeile auf **+** (Umschalt-Klick auf eine zweite Zeile desselben Blocks für einen Bereich), schreibe eine Notiz und klicke auf **Notiz speichern**. Die Notizen des Chats warten in einer Leiste oben im Bereich; **In Eingabefeld senden** legt sie an der Cursorposition als Markdown ab: `path:12-14`, die Zeilen als `diff`-Block und deine Notiz. **Löschen** verwirft sie. Die Notizen bleiben in diesem Browser, bis du sie sendest oder löschst. Braucht den **Änderungsbereich**. In Tether: das Diff einer Datei → eine Zeile gedrückt halten → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="Screenshot: Diff-Notizen"></a> |
89
94
  | **Projektstatus** | <a id="feature-projectstatus"></a>Eine Projektzeile in der Seitenleiste zeigt dieselbe Markierung (Spinner / wartet / fertig) wie ihre Chats. So zeigt auch ein eingeklapptes Projekt, dass ein Chat darin arbeitet oder dich braucht. Ein Chat, der auf dich wartet, kommt zuerst, dann ein fertiger Chat, den du noch nicht geöffnet hast (der grüne Punkt, auch während ein anderer Chat noch läuft), dann der Spinner. Fahre mit der Maus darüber, um Details zu sehen. In der Ansicht **Arbeitsbereichsbaum** zeigt die Zeile eines übergeordneten Ordners auch die Chats jedes Projekts darin (zum Beispiel jedes Branch-Ordners in `.worktrees/`), auch wenn der Ordner eingeklappt ist. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Projektstatus"></a> |
@@ -95,12 +100,14 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
95
100
  | **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> |
96
101
  | **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> |
97
102
  | **Wartenden Chat bei Inaktivität öffnen** | <a id="feature-idleswitch"></a>Wenn ein Chat eine Frage stellt, auf eine Genehmigung oder eine Planprüfung wartet (der orangefarbene Punkt) oder eine Runde beendet, die du noch nicht gelesen hast (der grüne Punkt), und du dsh 30 Sekunden lang nicht benutzt, öffnet dsh diesen Chat. Orangefarbene Chats öffnen sich vor grünen. In jeder Gruppe öffnet sich zuerst der, der am längsten wartet; der nächste öffnet sich nach weiteren 30 Sekunden ohne Benutzung. Eine Taste, ein Klick, eine Mausbewegung, das Mausrad oder eine Berührung starten die 30 Sekunden neu. Text im Feld mit dem Fokus, markierter Text oder ein offenes Menü oder ein offener Dialog verhindern den Wechsel ebenfalls. Solange ein wartender Chat auf dem Bildschirm ist, ändert sich nichts. Verlässt du einen wartenden Chat ohne Antwort, kann er sich nach den nächsten 30 Sekunden ohne Benutzung wieder öffnen. Öffnet sich ein grüner Chat, verschwindet sein Punkt; der nächste grüne Chat öffnet sich erst, nachdem du dsh wieder benutzt hast und es dann 30 Sekunden lang nicht benutzt. Das funktioniert auch, wenn dsh im Hintergrund ist, aber dsh kommt nicht in den Vordergrund. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Screenshot: Wartenden Chat bei Inaktivität öffnen"></a> |
98
- | **Nächster wartender Chat** | <a id="feature-nextwaiting"></a>Eine Schaltfläche in der Kopfzeile der Seitenleiste zeigt, wie viele andere Chats auf Sie warten, mit einem Punkt in der Farbe des nächsten: orange, wenn er eine Frage stellt oder auf eine Genehmigung oder eine Planprüfung wartet, grün, wenn er eine Runde beendet hat, die Sie noch nicht gelesen haben. Klicken Sie darauf oder drücken Sie Cmd+Shift+E (Strg+Shift+E unter Windows und Linux), um diesen Chat zu öffnen. Orangefarbene Chats kommen vor grünen; in jeder Gruppe kommt zuerst der Chat, der am längsten wartet. Der Chat auf dem Bildschirm zählt nicht. Wenn kein anderer Chat wartet, ist die Schaltfläche nicht sichtbar und die Taste tut nichts. Die Taste können Sie auf der Seite Tastenkürzel von dsh ändern (Nächster wartender Chat). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Screenshot: Nächster wartender Chat"></a> |
103
+ | **Nächster wartender Chat** | <a id="feature-nextwaiting"></a>Eine Schaltfläche in der Kopfzeile der Seitenleiste zeigt, wie viele andere Chats auf Sie warten, mit einem Punkt in der Farbe des nächsten: orange, wenn er eine Frage stellt oder auf eine Genehmigung oder eine Planprüfung wartet, grün, wenn er eine Runde beendet hat, die Sie noch nicht gelesen haben. Klicken Sie darauf oder drücken Sie Cmd+Shift+E (Strg+Shift+E unter Windows und Linux), um diesen Chat zu öffnen. Ein Klick auf die Schaltfläche findet den Chat auch in der Seitenleiste: Ein eingeklapptes Projekt öffnet sich, die Liste scrollt zum Chat, und der Chat blinkt 5 Sekunden lang. Orangefarbene Chats kommen vor grünen; in jeder Gruppe kommt zuerst der Chat, der am längsten wartet. Der Chat auf dem Bildschirm zählt nicht. Wenn kein anderer Chat wartet, ist die Schaltfläche nicht sichtbar und die Taste tut nichts. Die Taste können Sie auf der Seite Tastenkürzel von dsh ändern (Nächster wartender Chat). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Screenshot: Nächster wartender Chat"></a> |
99
104
  | **Options-Schaltflächen** | <a id="feature-optionpicks"></a>Wenn eine Antwort mit einer Liste von Optionen endet (eine nummerierte Liste mit 1 bis 9 Einträgen unter einer Überschrift „Optionen“ oder einer fetten Zeile „Optionen“, auch „Nächste Schritte“ und dieselben Wörter in den Sprachen der App), erscheint unter der Antwort für jede Option eine Schaltfläche. Ein Klick sendet „Option N: …“ mit der ganzen Option als Ihre Nachricht, als hätten Sie sie getippt. Die mit „(empfohlen)“ markierte Option ist hervorgehoben. Die Schaltflächen erscheinen nur unter der neuesten Antwort, solange der Chat untätig und das Eingabefeld leer ist; eine bereits gewählte Antwort und eine durch ein Zurücksetzen zurückgezogene Antwort zeigen keine. Solange sie sichtbar sind, macht die Vorhersage der nächsten Nachricht keinen Vorschlag. Auf einer Fragekarte des Agenten wählen die Tasten 1–9 diese Option wie ein Klick (nicht im Antwortfeld und nicht in den ersten 0,8 Sekunden nach dem Erscheinen der Frage). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Screenshot: Options-Schaltflächen"></a> |
100
105
  | **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> |
101
106
  | **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> |
102
- | **Remote-Computer** | <a id="feature-remotecomputers"></a>Öffne dsh auf deinen anderen Macs über [Tailscale](https://tailscale.com) und setze ihre Chats hier fort. Schalte die Funktion auf jedem Mac unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie Netzwerkports öffnet). Schalte auf dem Mac, den du öffnen willst, **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link. Wähle auf diesem Mac in der Computerauswahl links vom Chattitel **Computer hinzufügen…**, füge den Link ein und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach listet die Auswahl **Dieser Mac** und deine Computer auf: Wähle einen, und sein dsh öffnet sich im Browser-Tab der rechten Seitenleiste (oder in einem Browserfenster), mit seinen eigenen Chats, Tools und Dateien. Im Einstellungsbereich kannst du Computer umbenennen und entfernen. Dort siehst du auch die Computer, die diesen Mac öffnen können (**Entfernen** trennt einen sofort). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Screenshot: Remote-Computer"></a> |
103
- | **Automatische Updates** | <a id="feature-autoupdate"></a>Wenn dsh startet, prüft das Plugin das [neueste GitHub-Release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Ist es neuer und schon auf npm, installiert das Plugin genau diese Version über die eigene Plugin-Verwaltung von dsh (derselbe Weg wie Einstellungen → Plugins) und benachrichtigt dich. Starte dsh neu, um die Version zu laden. **Einstellungen → Composer Plus → Composer-Plus-Updates** zeigt die Version und hat **Nach Updates suchen** / **Jetzt aktualisieren**. Beim ersten Start von dsh mit der neuen Version zeigt ein Fenster **Neu in Composer Plus N** einmal die Release Notes dieser Version in der Sprache von **App-Sprache** (sie kommen mit der neuen Version, ohne weiteren Netzwerkaufruf; eine Sprache ohne Notes zeigt die englischen); **Schließen** oder `Esc` schließt es. Das Fenster erscheint auch nach einem Update über Einstellungen → Plugins oder einen kopierten Ordner, einmal je neuer Version; nicht bei der ersten Installation. **Neu in dieser Version** in der Update-Zeile öffnet es erneut. Liegt auf der Festplatte eine neuere Version als die laufende, bittet die Zeile um einen Neustart von dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatische Updates"></a> |
107
+ | **Remote-Computer** | <a id="feature-remotecomputers"></a>Öffne dsh auf deinen anderen Macs über [Tailscale](https://tailscale.com) und nutze sie in diesem dsh-Fenster. Schalte die Funktion auf jedem Mac unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie Netzwerkports öffnet). Schalte auf dem Mac, den du öffnen willst, **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link. Wähle auf diesem Mac in der Computerauswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein (nicht den Namen dieses Macs oder eines anderen Computers) und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach listet die Auswahl **Dieser Mac** und deine Computer auf: Wähle einen, und sein dsh füllt dieses Fenster, mit seinen eigenen Chats, seiner Seitenleiste, seinen Tools und Dateien, während dieser Mac dahinter weiterläuft. Die Auswahl bleibt an derselben Stelle und zeigt **Zurück zu diesem Mac**: Klicke darauf, um zurückzukommen. Mit mehr als einem Computer öffnet der Klick das Menü, in dem du **Dieser Mac** oder einen anderen Computer wählst. Im Einstellungsbereich kannst du Computer umbenennen und entfernen. Dort siehst du auch die Computer, die diesen Mac öffnen können (**Entfernen** trennt einen sofort). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Screenshot: Remote-Computer"></a> |
108
+ | **Automatische Updates** | <a id="feature-autoupdate"></a>Wenn dsh startet, prüft das Plugin das [neueste GitHub-Release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Ist es neuer und schon auf npm, installiert das Plugin genau diese Version über die eigene Plugin-Verwaltung von dsh (derselbe Weg wie Einstellungen → Plugins) und benachrichtigt dich. Starte dsh neu, um die Version zu laden. **Einstellungen → Composer Plus → Composer-Plus-Updates** zeigt die Version und hat **Nach Updates suchen** / **Jetzt aktualisieren**. Beim ersten Start von dsh mit der neuen Version zeigt ein Fenster **Neu in Composer Plus N** einmal die Release Notes dieser Version in der Sprache von **App-Sprache** (sie kommen mit der neuen Version, ohne weiteren Netzwerkaufruf; eine Sprache ohne Notes zeigt die englischen); **Schließen** oder `Esc` schließt es. Unter den Notes bittet eine Zeile um einen Stern auf GitHub, höchstens einmal in 30 Tagen (ohne Netzwerkaufruf); nach **Auf GitHub einen Stern geben** oder **Nicht mehr fragen** erscheint sie nicht mehr. Das Fenster erscheint auch nach einem Update über Einstellungen → Plugins oder einen kopierten Ordner, einmal je neuer Version; nicht bei der ersten Installation. **Neu in dieser Version** in der Update-Zeile öffnet es erneut. Liegt auf der Festplatte eine neuere Version als die laufende, bittet die Zeile um einen Neustart von dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatische Updates"></a> |
109
+ | **An/Aus-Filter** | <a id="feature-featurefilter"></a>Neben **Funktionen suchen** unter **Einstellungen → Composer Plus**: **Alle** zeigt alle Funktionen, **An** nur die Funktionen mit eingeschaltetem Schalter und **Aus** nur die mit ausgeschaltetem Schalter. Es entscheidet der Schalter jeder Zeile, auch ein Schalter, den der Host von dsh speichert (zum Beispiel **Mobile Verbindung**). Der Filter wirkt zusammen mit der Suche: Gib ein Wort ein und wähle **Aus**, um eine Funktion zu finden, die du ausgeschaltet hast. Eine Zeile, die du umschaltest, während **An** oder **Aus** gewählt ist, bleibt, bis du wieder einen Filter wählst; so bleibt der Fokus auf ihrem Schalter. **An** und **Aus** blenden die Zeilen **App-Sprache** und **Composer-Plus-Updates** aus (sie haben keinen Schalter). Die Einstellungen öffnen sich jedes Mal mit **Alle**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Screenshot: An/Aus-Filter"></a> |
110
+ | **Issue melden** | <a id="feature-issuereport"></a>Einstellungen → Composer Plus → **Issue melden…** (unter der Einleitung), oder Rechtsklick auf einen Chat in der Seitenleiste (oder sein Menü **…** öffnen) → **Issue zu Composer Plus melden…**. Wähle einen Typ: **Fehler**, **Funktionswunsch**, **Verbesserung**, **Übersetzung** oder **Frage**. Beschreibe es in deinen eigenen Worten und in deiner Sprache und klicke dann auf **Entwurf schreiben** (oder `Cmd/Ctrl+Enter`). Ein Aufruf an das Standardmodell von dsh schreibt ein englisches Issue: einen Titel mit dem Präfix des Typs (zum Beispiel `[Bug]`) und die Abschnitte dieses Typs (bei einem Fehler: What happened, Steps to reproduce, Expected, Actual), dazu eine Zeile mit den Versionen von Composer Plus, dsh und dem System. Lies und bearbeite den Titel und die Beschreibung; **Neu schreiben** schreibt einen neuen Entwurf. **Issue öffnen** öffnet es im GitHub-Repository von Composer Plus mit deiner Anmeldung bei GitHub CLI (`gh`) und zeigt seinen Link. Das Issue ist öffentlich: Text, der wie ein Schlüssel oder ein Passwort aussieht, wird abgelehnt. Wenn `gh` es nicht öffnen kann, öffnet **Stattdessen auf GitHub öffnen** die eigene Seite von GitHub mit dem ausgefüllten Entwurf. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Screenshot: Issue melden"></a> |
104
111
  | **Sicherung** | <a id="feature-backup"></a>Einstellungen → Composer Plus → **Sicherung** → **Jetzt sichern** schreibt dein ganzes dsh-Home (Chats, Einstellungen, Plugins, MCP, Skills) mit Prüfsumme in ein einziges Archiv in `~/Desktop/dsh-backups`. Geheimnisse werden im Archiv maskiert: Dateien mit Anmeldedaten, Schlüsseldateien (`.pem`, `.key`) und die Werte token, secret und password der yml-Einstellungen bleiben nur auf diesem Computer, im `vault` des Ordners. `cache/`, `dsh-runtimes/` und `node_modules` kommen nicht ins Archiv (dsh erstellt sie neu). Jede Sicherung in der Liste hat **Prüfen** (liest sie vollständig), **Für einen anderen Computer** (ein Ordner zum Kopieren auf den neuen Computer, mit der Rettungskonsole) und **Löschen**. Archive von dsh-backup im selben Ordner erscheinen und funktionieren auch. Zum Wiederherstellen beende dsh und nutze die Rettungskonsole. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Screenshot: Sicherung"></a> |
105
112
  | **Automatische Sicherung** | <a id="feature-autobackup"></a>Schalte **Automatische Sicherung** ein (standardmäßig aus: Jede Kopie ist etwa so groß wie dein dsh-Home ohne seinen Cache). Wähle, wie oft gesichert wird (**Alle**: 6 Stunden bis 7 Tage, standardmäßig 24 Stunden) und wie viele Sicherungen bleiben (**Behalten**: 3 bis 14, standardmäßig 7). Der nächste Zeitpunkt steht unter dem Schalter; eine fehlgeschlagene Sicherung erscheint dort auch und wird 30 Minuten später erneut versucht. Wenn dsh oder Composer Plus mit einer neuen Version startet, entsteht kurz nach dem Start ein Snapshot, bevor die neue Version deine Daten lange benutzt hat (die zwei neuesten bleiben, markiert mit **Vor einem Upgrade**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Screenshot: Automatische Sicherung"></a> |
106
113
  | **Sitzungsprotokoll-Prüfung** | <a id="feature-sessiondoctor"></a>**Sitzungsprotokolle prüfen** liest das Protokoll jedes Chats und listet die auf, die dsh nicht öffnen kann (ein defekter Frame, ein abgeschnittener Datensatz, eine falsche Sequenznummer). Ein abgerissenes Ende wird nicht aufgelistet: dsh repariert es selbst. **Aus Sicherungen reparieren** legt die Kopie aus der neuesten Sicherung zurück, die eine intakte Kopie enthält, und behält die beschädigte Datei daneben (`.corrupt-<Zeit>`). Nachrichten, die nach dieser Sicherung geschrieben wurden, sind nicht in der Kopie. Ein Chat, der in diesem dsh offen ist, wird hier nicht repariert: Beende dsh und repariere ihn in der Rettungskonsole. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Screenshot: Sitzungsprotokoll-Prüfung"></a> |
@@ -112,7 +119,7 @@ Schaltflächen, Tooltips, Hinweise und Benachrichtigungen folgen der gewählten
112
119
 
113
120
  ## Einstellungen
114
121
 
115
- 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.**
122
+ 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. Daneben zeigen **Alle**, **An** und **Aus** alle Funktionen, nur die eingeschalteten oder nur die ausgeschalteten (schalte **An/Aus-Filter** aus, um sie auszublenden). 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.**
116
123
 
117
124
  <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>
118
125
 
@@ -172,6 +179,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
172
179
  - **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`.
173
180
  - **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).
174
181
  - **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.
182
+ - **Issue melden** (Einstellungen → Composer Plus → **Issue melden…** oder das Menü **…** eines Chats → **Issue zu Composer Plus melden…**): Nichts läuft, bis du klickst. **Entwurf schreiben** sendet nur den Typ und den Text, den du getippt hast (nicht den Chat, nicht das Projekt), in einem einzigen Aufruf an das Standardmodell von dsh. Der Host fügt eine Zeile mit den Versionen von Composer Plus, dsh und dem Betriebssystem hinzu und ersetzt den Pfad deines Home-Ordners durch `~`. **Issue öffnen** führt dein eigenes GitHub CLI (`gh issue create --repo furkancak1r/dsh-composer-plus`) mit deiner Anmeldung bei `gh` aus. Daher ist das Issue öffentlich und zeigt dein GitHub-Konto. Text, der wie ein Schlüssel, ein Token oder ein Passwort aussieht, wird abgelehnt und verlässt deinen Mac nicht.
175
183
  - **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.
176
184
  - **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`.
177
185
  - **Im Chat suchen** läuft nur auf der Seite: Die Funktion liest den Text, den die Seite zeigt, und sendet nichts.
@@ -180,9 +188,10 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
180
188
  - **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.
181
189
  - Die automatische Prüfung läuft weiterhin bei jedem Aufruf. Fehlgeschlagene Prüfungen werden nie automatisch erlaubt.
182
190
  - **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).
183
- - **Remote-Computer:** aus, bis du die Funktion auf jedem Mac einschaltest. **Anderen Computern erlauben, diesen Mac zu öffnen** öffnet einen zweiten HTTPS-Port (19392), nur auf der Tailscale-Adresse dieses Macs (nicht im WLAN, keine Ankündigung über Bonjour). Ein anderer Mac braucht einen einmaligen Kopplungslink (5 Minuten gültig), das passende Zertifikat (gepinnt) und deine Bestätigung mit **Genehmigen**. Dieser Mac speichert von seinem Token nur einen Hash. Ein gekoppelter Computer bekommt die volle Kontrolle über dsh auf diesem Mac, als ob du dsh hier benutzen würdest: Chats, Modelle, Tools, Dateien und Terminal. Entferne ihn im Einstellungsbereich, dann schließen sich seine Verbindungen sofort. Der Mac, der einen anderen öffnet, speichert das Token dieses Computers in `$DSH_HOME/storages/dsh-composer-plus/computers.json` (nur für den Besitzer). Er öffnet für jeden Computer, den du wählst, ein Relay auf `127.0.0.1`. Die Seite bekommt einen einmaligen Link (60 Sekunden gültig), und das Relay nimmt nur seine eigene Seite an (seine Adresse, keine andere Website). Eine Seite, die ein anderer Mac geöffnet hat, zeigt keine Computerauswahl und kann die Computer dieses Macs nicht ändern.
191
+ - **Remote-Computer:** aus, bis du die Funktion auf jedem Mac einschaltest. **Anderen Computern erlauben, diesen Mac zu öffnen** öffnet einen zweiten HTTPS-Port (19392), nur auf der Tailscale-Adresse dieses Macs (nicht im WLAN, keine Ankündigung über Bonjour). Ein anderer Mac braucht einen einmaligen Kopplungslink (5 Minuten gültig), das passende Zertifikat (gepinnt) und deine Bestätigung mit **Genehmigen**. Dieser Mac speichert von seinem Token nur einen Hash. Ein gekoppelter Computer bekommt die volle Kontrolle über dsh auf diesem Mac, als ob du dsh hier benutzen würdest: Chats, Modelle, Tools, Dateien und Terminal. Entferne ihn im Einstellungsbereich, dann schließen sich seine Verbindungen sofort. Der Mac, der einen anderen öffnet, speichert das Token dieses Computers in `$DSH_HOME/storages/dsh-composer-plus/computers.json` (nur für den Besitzer). Er öffnet für jeden Computer, den du wählst, ein Relay auf `127.0.0.1`. Die Seite bekommt einen einmaligen Link (60 Sekunden gültig), und das Relay nimmt nur seine eigene Seite an (seine Adresse, keine andere Website). Die Seite des anderen Macs in diesem Fenster kann die Namen und den Status der Computer dieses Macs lesen (keine Adresse, kein Token) und dieses Fenster zwischen ihnen wechseln. Sie kann keinen Computer hinzufügen, umbenennen oder entfernen und keine Einstellungen dieses Macs ändern.
184
192
  - **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.
185
- - **Nutzungszählung:** Einmal am Tag fragt die Host-Hälfte GitHub nach der kleinen Datei `active.txt` im Release der installierten Version (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/active.txt`). GitHub zählt diese Anfragen pro Datei; der Autor sieht also nur, wie viele Kopien jeder Version an diesem Tag gefragt haben. Die Anfrage enthält keine ID, kein Cookie und keine Daten über dich oder deine Chats; GitHub sieht deine IP-Adresse, wie bei jeder Update-Prüfung. Der Tag der letzten Anfrage steht in `$DSH_HOME/storages/dsh-composer-plus/active.json`. Ein Git-Checkout dieses Repositorys und eine umbenannte Kopie senden nichts. Es gibt keinen Schalter dafür.
193
+ - **Türkisches Skill-Paket:** standardmäßig an, und es arbeitet nur, solange die App-Sprache Türkçe ist: Der Browser teilt der Host-Hälfte die UI-Sprache von dsh mit. Dann fragt die Host-Hälfte höchstens einmal am Tag `api.github.com` nach dem neuesten Commit von `yucezerey/turkish-anti-ai-skill` und seiner Dateiliste und lädt die geänderten Markdown-Dateien von `raw.githubusercontent.com`. GitHub sieht deine IP-Adresse, wie bei jeder Update-Prüfung; nichts über dich oder deine Chats wird gesendet. Nur normale `.md`-Dateien des Ordners `skills/turkish-anti-ai-skill/` bleiben (höchstens 20 Dateien und 1 MB), und jede Datei muss zu ihrer ID in der Dateiliste von GitHub passen. Die Kopie liegt in `$DSH_HOME/cache/composer-plus/turkish-skill/<commit>` (nur für den Besitzer) und kommt in die Skill-Liste von dsh; kein Skript des Pakets läuft. Der Schalter und die zuletzt gemeldete Sprache stehen in `$DSH_HOME/storages/dsh-composer-plus/turkish-skill.json`. Ausschalten entfernt den Skill und löscht die Kopie.
194
+ - **Nutzungszählung:** Die Host-Hälfte fragt GitHub nach zwei kleinen Dateien im Release der installierten Version (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/<file>`): nach `active.txt` einmal am Tag und nach `installed.txt` nur einmal pro dsh-Home. GitHub zählt diese Anfragen pro Datei; der Autor sieht also nur, wie viele Kopien jeder Version an diesem Tag nach `active.txt` gefragt haben und wie viele Kopien insgesamt nach `installed.txt` gefragt haben (die Zahl der Kopien). Die Anfrage enthält keine ID, kein Cookie und keine Daten über dich oder deine Chats; GitHub sieht deine IP-Adresse, wie bei jeder Update-Prüfung. Der Tag der letzten `active.txt`-Anfrage steht in `$DSH_HOME/storages/dsh-composer-plus/active.json`, die Markierung, dass `installed.txt` gezählt wurde, in `$DSH_HOME/storages/dsh-composer-plus/installed.json`. Ein Git-Checkout dieses Repositorys und eine umbenannte Kopie senden nichts. Es gibt keinen Schalter dafür.
186
195
  - **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).
187
196
  - **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).
188
197
  - **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).
@@ -190,6 +199,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
190
199
  - **In einem neuen Chat fortsetzen:** Nichts läuft, bis du darauf klickst. Dann sendet die Host-Hälfte den Chat (so, wie die Zielprüfung ihn liest: kein Reasoning, keine zurückgenommenen Schritte) an das eigene Modell des Chats und zeigt die Übergabenotiz. Nur **Neuen Chat starten** erstellt einen neuen Chat. Ins Projekt wird nichts geschrieben.
191
200
  - **Kontextaufschlüsselung:** Die Host-Hälfte liest nur das Chatprotokoll. Kein Modellaufruf, keine Projektdatei.
192
201
  - **Aufgabentafel:** Die Tafel zeigt die Chats von dsh aus den eigenen Listen von dsh in diesem Fenster; sie fügt keine eigenen Chatdaten hinzu. **Neue Aufgabe** öffnet den eigenen neuen Chat von dsh, und du schreibst die erste Nachricht im Eingabefeld von dsh; Freigaben, die Sandbox und das Modell des Chats gelten also wie sonst. Die Host-Hälfte behält die erste Nachricht dieses Chats als Prompt der Karte und sendet sie (ihre ersten 4.000 Zeichen, sonst nichts) in einer weiteren Anfrage ohne Tools an das Modell dieses Chats, um bis zu 3 Schlagwörter zu bekommen. Prompt, Schlagwörter und Startzeit jeder Aufgabe liegen in `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (Datei nur für den Besitzer, die neuesten 2.000), dazu die IDs der Chats, die du mit **×** oder **Alle entfernen** von der Tafel genommen hast (die neuesten 5.000); der Schalter liegt daneben in `board-switch.json`. Nichts wird in einen Projektordner geschrieben. **Antworten** sendet deine Antwort an die offene Anfrage von dsh, so wie es die Karte im Chat selbst tut. Die alte Aufgabenliste früherer Versionen (`board.json`) bleibt unverändert auf der Festplatte und wird nicht gelesen. **Fortschritt beim Darüberfahren** liest das Protokoll des Chats auf diesem Mac. Mit **Schnell (ohne KI)** (Standard) wird nichts gesendet. Mit **KI-Zusammenfassung** sendet die Host-Hälfte, solange das Fortschrittsfeld einer laufenden Karte zu sehen ist (oder solange die Tafel in Tether offen ist, für bis zu 8 laufende Karten), den neuesten Teil dieses Chats (höchstens etwa 6.000 Zeichen: deine Nachrichten, die Textantworten des Agenten, seine Werkzeugaufrufe und das Ende ihrer Ergebnisse; kein Reasoning, keine zurückgenommenen Nachrichten) als eine Anfrage ohne Werkzeuge an das Modell des Chats. Erneut sendet sie erst, wenn der Chat weitergekommen ist, höchstens alle 20 Sekunden pro Chat. Die Notiz bleibt nur im Speicher; die Einstellung liegt in `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (Datei nur für den Besitzer).
202
+ - **Assistent:** Der Assistenten-Chat ist ein gewöhnlicher dsh-Chat in `~/Assistant`; seine Modellaufrufe gehen wie in jedem Chat an das Standardmodell von dsh. Seine Tools lesen die Protokolle deiner anderen Chats auf diesem Mac (Titel, Projekte, Status und mit chat_read ihre neuesten Nachrichten) und geben sie diesem Modell nur, wenn es ein Tool aufruft. Senden, Starten, Stoppen und Archivieren eines Chats warten jeweils auf deine Genehmigung. Die Chat-ID liegt in `$DSH_HOME/storages/dsh-composer-plus/assistant.json` und der Schalter in `assistant-switch.json` (Dateien nur für den Besitzer). Erinnerungen und Automatisierungen sind die eigenen geplanten Aufgaben von dsh. Nichts verlässt diesen Mac außer den Modellanfragen und den Websuchen, die der Chat macht.
193
203
  - **Geschützte Dateien:** Die Liste und der Schalter liegen in `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (Datei nur für den Besitzer). Die Prüfung liest nur den Pfad jedes Aufrufs eines Datei-Tools (und seinen echten Pfad), nie die Datei.
194
204
  - **Blockierte Befehle:** Die Regeln und der Schalter liegen in `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (Datei nur für den Besitzer). Die Prüfung liest nur den Befehlstext jedes Aufrufs von `bash` und `pwsh`; sie führt nichts aus und sendet nichts.
195
205
  - **Geheime Eingabe:** Der Wert geht von der Karte (oder von Tether über das Gateway, das keine Anfrageinhalte protokolliert) nur in der Antwortanfrage an den Host. Der Host schreibt ihn nach `$DSH_HOME/storages/dsh-composer-plus/secrets/<zufälliger Name>` (Ordner 0700, Datei 0600); nichts geht ins Projekt, ins Chatprotokoll oder ins Tool-Ergebnis. Der Host hält den Wert im Speicher, um ihn in späteren Tool-Ergebnissen dieses Chats durch `[secret]` zu ersetzen. Die Datei und diese Kopie werden am Ende des Durchgangs des Chats und beim Start von dsh gelöscht. Der Schalter liegt daneben in `secrets.json`. Ein Befehl, den der Agent mit der Datei ausführt, kann den Wert dorthin senden, wohin dieser Befehl sendet: Das ist der Zweck.
@@ -212,10 +222,11 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
212
222
  - **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).
213
223
  - **Die Warteschlange ist nach einem Neustart leer:** dsh selbst leert die Warteschlange beim Beenden. Nach Neustart fortsetzen stellt sie nur in einem Chat wieder her, den es fortsetzt; in anderen Chats sende die Nachrichten erneut. Eine Nachricht, die du kurz vor dem Beenden entfernt hast, kann zurückkommen: Entferne sie erneut.
214
224
  - **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.
225
+ - **Issue melden zeigt „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. Oder klicke auf **Stattdessen auf GitHub öffnen**: Die eigene Seite von GitHub für ein neues Issue öffnet sich mit dem ausgefüllten Entwurf, und du sendest es dort ab.
215
226
  - **Kein Branch-Etikett an einer Chatzeile:** Die Seitenleiste ist nicht in „In einer Liste“ (in „Arbeitsbereich“ und „Arbeitsbereichsbaum“ zeigt keine Chatzeile ein Etikett), der Chat hatte seit der Installation dieser Version keine Runde, sein Ordner ist kein git-Repository, oder **Git-Branch in Chatzeilen** ist aus. Starte dsh nach einem Update neu (die Host-Hälfte zeichnet den Branch auf).
216
227
  - **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.
217
228
  - **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).
218
- - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.22.0`), siehe den Hinweis zur Installation oben.
229
+ - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.24.0`), siehe den Hinweis zur Installation oben.
219
230
  - **Jetzt sichern meldet „Eine andere Sicherungsaktion läuft“:** Eine Aktion läuft in einem anderen dsh-Fenster oder in der Rettungskonsole (sie teilen sich eine Sperrdatei, `.composer-plus.lock`, im Sicherungsordner). Warte, bis sie fertig ist. Läuft keine Aktion, wird die Sperre eines beendeten Prozesses beim nächsten Klick übernommen.
220
231
  - **Die Rettungskonsole meldet „dsh is running“:** Beende zuerst dsh. Ist dsh wirklich geschlossen, ist die in der Meldung genannte Datei von einem Absturz übrig: Entferne sie und versuche es erneut.
221
232
  - **Nach einer Wiederherstellung startet dsh nicht oder ein Plugin fehlt:** Die Plugin-Pakete eines Profils müssen neu installiert werden. Die Rettungskonsole bietet das nach einer Wiederherstellung an; oder führe `pnpm install` in jedem Ordner unter `$DSH_HOME/profiles/` aus, den sie auflistet. Geheimnisse, die nicht im vault waren (anderer Computer), müssen neu eingegeben werden: Die Konsole listet sie auf.
@@ -237,9 +248,11 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
237
248
  - 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.
238
249
  - **Neu in Composer Plus N** zeigt die Notes in der Sprache von **App-Sprache**. Eine UI-Sprache mit einer anderen Region bekommt die Notes ihrer Grundsprache (`en-GB` die englischen, `zh-TW` die chinesischen von `zh`). Eine Sprache ohne Notes (eine, die ein anderes Sprachpaket hinzufügt, oder `pt-PT`, das nicht `pt-BR` ist) zeigt die englischen Notes. Die Notes kommen mit der neuen Version. Hat die laufende Kopie keine lesbare Notes-Datei (`release-notes.json`), zeigt das Fenster die englischen Notes von GitHub.
239
250
  - Eine Version, die installiert wird, während dsh läuft (ein Update über Einstellungen → Plugins oder einen kopierten Ordner), lädt erst nach einem Neustart von dsh. Bis dahin zeigt **Composer-Plus-Updates** die laufende Version und bittet um einen Neustart. Ihr Fenster **Neu in Composer Plus N** erscheint einmal beim ersten Start dieser Version. Der erste Start nach der Installation dieses Plugins zeigt kein Fenster; **Neu in dieser Version** öffnet die Notes der laufenden Version.
251
+ - Die GitHub-Stern-Zeile unter den Notes kann nicht wissen, ob du dem Repository schon einen Stern gegeben hast: Das Plugin macht dafür keinen Netzwerkaufruf. Jeder Browser (und die Desktop-App) speichert seinen eigenen Stand, daher kann die Zeile in einem anderen noch einmal erscheinen.
240
252
  - **Mit Notiz ablehnen** sendet die Notiz als Nachricht in die wartende Runde und lehnt dann die Anfrage ab. dsh zeigt die Notiz im Chat als deine Nachricht. Solange das Notizfeld offen ist, zeigt die Karte nur **Abbrechen** und **Ablehnen**, sodass ein Klick die Anfrage nicht aus Versehen zulassen kann. `Esc` oder **Abbrechen** bringt die Schaltflächen von dsh zurück. Eine leere Notiz sendet nichts (nutze die eigene Schaltfläche **Ablehnen** von dsh). Schlägt die Ablehnung fehl, nachdem die Notiz gesendet wurde (zum Beispiel, weil die Anfrage inzwischen an anderer Stelle beantwortet wurde), bleibt die Notiz im Chat, und das Modell liest sie bei seinem nächsten Schritt. Die Schaltfläche kommt in das Markup der Genehmigungskarte von dsh (`data-approval-key`), weil dsh keinen Platz für Aktionen der Karte hat. Ändert ein dsh-Update dieses Markup, erscheint die Schaltfläche nicht, und die eigene Schaltfläche **Ablehnen** von dsh funktioniert wie zuvor. Eine Notiz kann höchstens 4.000 Zeichen haben.
241
253
  - **Geheime Eingabe** verbirgt nur den genauen Text eines Werts: `[secret]` ersetzt ihn in den späteren Tool-Ergebnissen desselben Chats. Der Agent kann die Datei trotzdem mit einem Shell-Befehl lesen und den Wert in anderer Form ausgeben (base64, ein Teil davon, mit Leerzeichen), und diese Form erreicht das Modell. Die eigenen Datei-Tools des Agenten (read, grep, write, edit) können den Geheimnis-Ordner nicht öffnen. Ist der Wert auch ein häufiges Wort, zeigen andere Ergebnisse dieses Chats ebenfalls `[secret]`. Die Datei bleibt bis zum Ende des Durchgangs; beendet sich dsh währenddessen, löscht der nächste Start sie. Ein Chat kann jeweils nur eine offene Anfrage haben. Das Tool fügt jeder Modellanfrage etwa 870 Zeichen hinzu (geschätzt etwa 220 Tokens): Schalte es aus, wenn du es nicht nutzt.
242
254
  - **In Antwort zitieren** zitiert den Text so, wie die Seite ihn zeigt: Ein Codeblock, eine Tabelle oder eine Liste kommt als einfache Zeilen, ohne Markdown-Zeichen. Eine Markierung, die in einer Antwort beginnt und in einer anderen endet oder das Nachdenken, eine Tool-Zeile oder deine eigene Nachricht berührt, zeigt keine Schaltfläche: Markiere innerhalb einer Antwort. Die Schaltfläche findet die Antwort über die Chatstruktur von dsh, weil dsh keinen Slot für eine Textmarkierung hat; ändert ein dsh-Update diese Struktur, erscheint die Schaltfläche nicht. Steht das Zitat am Ende des Felds, folgt eine weitere leere Zeile, damit die nächste getippte Zeile darunter beginnt; dsh entfernt leere Zeilen am Ende beim Senden.
255
+ - **Aus Dateivorschau zitieren** liest die eigene Dateivorschau von dsh: Die Zeilennummern kommen aus ihren Zeilen, darum stimmen sie bei Code- und Textdateien. Eine Markdown-Datei erscheint als formatierte Seite, darum hat ihr Zitat den Text ohne Markdown-Zeichen und ohne Zeilennummern; ein PDF-Zitat hat die Seite, keine Zeile. Eine Markierung in der Kopfzeile mit dem Pfad, in einer anderen Ansicht (Tabelle, Office-Datei, Bild) oder über zwei geöffnete Dateien zeigt keine Schaltfläche, ebenso eine rechte Seitenleiste im Vollbild (das Eingabefeld ist dann nicht auf dem Bildschirm). Die Schaltfläche findet die Vorschau über das Markup von dsh, weil dsh dort keinen Slot für eine Markierung hat; ändert ein dsh-Update dieses Markup, erscheint die Schaltfläche nicht. Nur der markierte Text kommt ins Eingabefeld: Ändert sich die Datei später, ändert sich das Zitat nicht.
243
256
  - **Nebenchat** ist durch den eigenen Nur-lesen-Modus von dsh schreibgeschützt: Datei-Tools können nicht schreiben, und Shell-Befehle laufen in der Sandbox von dsh ohne Schreibrechte (oder gar nicht, wenn die Sandbox nicht starten kann). Der Agent kann trotzdem mit der Freigabekarte von dsh mehr Zugriff anfragen, und ein Netzwerkaufruf (zum Beispiel eine API-Anfrage) kann trotzdem etwas außerhalb des Computers ändern. Die Kopie entsteht zum neuesten Zeitpunkt, an dem keine Nachricht in der Warteschlange wartete: Eine Frage, die du stellst, während Nachrichten warten, sieht nicht, was danach geschah. Ein laufender Schritt des Chats wird in der Kopie geschlossen: Der Nebenchat kennt den Anfang dieses Schritts, aber nicht sein Ergebnis. Der Nebenchat ist ein normaler Chat: Er bleibt in der Seitenleiste und zählt zu deiner Modellnutzung; archiviere ihn dort. Zurückholen nimmt nur die eigenen Nachrichten des Nebenchats (höchstens 12.000 Zeichen) und nur die letzte Antwort jeder Frage; Notizen des Agenten zwischen seinen Tool-Aufrufen bleiben draußen. dsh bietet Plugins keinen Platz für einen Chat in der rechten Seitenleiste, darum öffnet sich der Nebenchat in der Hauptansicht.
244
257
  - **Diff-Notizen** funktioniert nur im Änderungsbereich, nicht in der Ansicht Letzter Durchlauf von dsh. Ein Bereich muss in einem Block des Diffs bleiben (ein `@@`-Teil). Die Notizen liegen im Speicher dieses Browsers: Ein anderer Browser oder dsh auf einem anderen Computer sieht sie nicht; Tether hält seine eigenen Notizen im Arbeitsspeicher. Eine Notiz behält die Zeilen so, wie sie beim Klick waren: Ändert der Agent die Datei später, zeigt die Notiz weiter die alten Zeilen und Nummern. Höchstens 50 Notizen pro Chat, 2.000 Zeichen pro Notiz und 40 Zeilen pro Notiz (danach eine `…`-Zeile).
245
258
  - **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.
@@ -247,7 +260,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
247
260
  - **Fragekarte an das Fenster anpassen** ändert nur die Fragekarte von dsh, nicht die Karte zur Planprüfung. Sie findet die Karte über das Markup von dsh (`data-question-key`, `data-question-scroll`); ändert ein dsh-Update dieses Markup, erscheint die Karte so, wie dsh sie zeichnet. Die Höhe der Karte folgt dem Fenster, nicht dem Chat: In einem Chat in einem schmalen Seitenbereich kann eine hohe Karte noch über den Chat hinausragen.
248
261
  - **Chat-Kopfzeile an Fenster anpassen** findet die Chat-Kopfzeile von dsh über ihre generierten Klassennamen (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), weil dsh dafür keinen Layout-Haken bietet. Benennt ein dsh-Update sie um, erscheint die Kopfzeile so, wie dsh sie zeichnet. In einer sehr schmalen Chat-Spalte kann die Kopfzeile zwei oder drei Zeilen belegen, sodass über den Nachrichten weniger Platz bleibt.
249
262
  - **Mobile Verbindung** funktioniert nur unter macOS (sie nutzt `en0`, `openssl`, `swift` und `dns-sd`). Sie nutzt die festen Ports 19390 und 19391. Daher kann auf jedem Mac nur ein dsh sie gleichzeitig ausführen (jeder Mac ist ein Eintrag in der Mac-Liste des Telefons). Mit einem APNs-Schlüssel in `apns.json` (siehe `tether/README.md`) sendet der Mac die Benachrichtigungen über Apples Push-Dienst, sodass sie auch bei geschlossenem Tether ankommen; der Mac muss wach sein und dsh offen. Ohne den Schlüssel bekommt das Telefon sie nur, solange Tether offen ist oder gerade in den Hintergrund gewechselt ist. Tether sendet sie erst, wenn du in Tether „Settings → Notifications → Send notifications“ einschaltest. Tether speichert den Schalter und seine Uhrzeiten für jeden gekoppelten Mac getrennt. Der Schalter ist auf jedem Mac standardmäßig aus, und iOS fragt beim Einschalten nach der Erlaubnis. Die iOS-App ist noch nicht im App Store: Baue sie mit Xcode aus `tether/ios`. „Tailscale only“ braucht trotzdem eine WLAN- oder Ethernet-Adresse auf dem Mac (das Gateway startet nur mit einer solchen Adresse). Das Zugriffsprotokoll gilt pro Mac und speichert nur die neuesten 200 Versuche. Ein wiederholter Versuch innerhalb einer Minute zählt dieselbe Zeile um eins hoch. Jede Mitteilung zeigt den Mac und das Projekt des Chats (`Studio Mac · recipe-box`), den Titel des Chats und den Text: Turn finished zeigt die letzte Antwort des Agenten. Mit dem APNs-Schlüssel geht dieser Text über Apples Push-Dienst. Die App-Sperre von Tether blendet Mitteilungsvorschauen auf dem Sperrbildschirm des iPhone nicht aus: Schalte sie in den iOS-Einstellungen aus. Die grünen Punkte in Tether folgen dem Mac: Ein Chat, den du in dsh öffnest, verliert seinen Punkt auch auf dem Telefon. Ein Chat, den du in Tether öffnest, verliert seinen Punkt nur auf den Telefonen. Der eigene Punkt von dsh auf dem Mac bleibt, bis du den Chat dort öffnest.
250
- - **Remote-Computer** braucht Tailscale auf beiden Macs und Composer Plus mit eingeschalteter Funktion auf dem Mac, den du öffnest. Dieser Mac muss wach sein, und dsh muss dort laufen. Der andere Computer öffnet sich im Browser-Tab der rechten Seitenleiste des Chats, der gerade zu sehen ist. Der Tab gehört zu diesem Chat, deshalb zeigt ein anderer Chat seine eigene Seitenleiste. Ohne Chat (oder in dsh web ohne Browser-Tab) öffnet sich der Computer in einem Browserfenster. Die Auswahl erscheint nur, wenn ein Chat oder der Bildschirm für einen neuen Chat im Hauptbereich ist, nicht auf der Aufgabentafel. Die Funktion nutzt Port 19392 (nur ein dsh pro Mac kann andere Computer hereinlassen). Ein Computer, den du in der Seite eines anderen Computers geöffnet hast, hat keine Auswahl. Von dort kannst du also keinen dritten Mac öffnen.
263
+ - **Remote-Computer** braucht Tailscale auf beiden Macs und Composer Plus mit eingeschalteter Funktion auf dem Mac, den du öffnest. Dieser Mac muss wach sein, und dsh muss dort laufen. Die Auswahl erscheint nur, wenn die linke Seitenleiste offen ist (nicht, wenn sie nur Symbole zeigt). Hat die Seite des anderen Macs keine eigene Auswahl (dort Composer Plus älter als 1.23.0), zeigt sich die Auswahl dieses Macs an derselben Stelle über dieser Seite. Mit 1.23.0 dort zeigt die Auswahl den Namen des anderen Macs: Wähle in ihrem Menü **Dieser Mac**, um zurückzukommen. Jeder Computer, den du geöffnet hast, behält seine Seite im Speicher, bis du die Funktion ausschaltest oder dsh neu startest. In der Desktop-App ist die Seite des anderen Macs eine eingebettete Seite: Die eigenen Tastenkürzel von dsh (zum Beispiel für einen neuen Chat) funktionieren darin nicht, und auch Dateidownloads, Mikrofon und Benachrichtigungen funktionieren dort nicht. Die Funktion nutzt Port 19392 (nur ein dsh pro Mac kann andere Computer hereinlassen). Auf der Seite eines anderen Macs wechselt die Auswahl nur zwischen den Computern dieses Macs: Du kannst über den anderen Mac keinen dritten Mac öffnen.
251
264
  - 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.
252
265
  - **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.
253
266
  - **Eingereihte Nachricht direkt bearbeiten** ändert keine Nachricht, deren Senden inzwischen begonnen hat, und überschreibt keine Nachricht, die sich inzwischen geändert hat (zum Beispiel in Tether auf dem iPhone): Ein Hinweis meldet das. Ein neues Bild braucht ein Modell, das Bilder annimmt (die eigenen Bildgrenzen von dsh gelten), und eine neue Datei muss fertig hochgeladen sein, bevor du speichern kannst. Nur deine eigenen eingereihten Nachrichten lassen sich bearbeiten: Eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange nicht. Nach einem Update des Plugins funktionieren nur Textänderungen sofort: Starte dsh neu, bevor du eine Nachricht mit Bildern oder Dateien speicherst (die Host-Hälfte lädt beim Start).
@@ -255,6 +268,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
255
268
  - Die Branch-Karte der Ansicht **Baum** errät, wohin jeder Pfeil führt, weil git nicht speichert, in welchen Branch ein Branch gemergt wird. Ein gemergter Branch zeigt auf den Branch, dessen Merge-Commit ihn zuerst aufgenommen hat. Ein wartender Branch zeigt auf den nächsten Branch, von dem er ausging (bevorzugt den Haupt-Branch); wenn zwei Branches vom selben Commit ausgingen, kann die Karte den falschen wählen. Ein Branch, der per Fast-Forward vorgerückt ist, hat keinen Merge-Commit, daher öffnet sein Label **Gemergt** nichts. Der Haupt-Branch ist der Standard-Branch von `origin`, sonst `main` oder `master`, sonst der offene Branch. Die Karte liest die neuesten 20.000 Commits und zeigt höchstens 60 Branches; bei einem längeren Verlauf weist sie darauf hin, dass einige Pfeile falsch sein können. Ein Branch, der mit Squash oder Rebase gemergt wurde (zum Beispiel auf GitHub), erscheint als **Wartet**: Git behält keine Verbindung zu seinen Commits.
256
269
  - **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.
257
270
  - **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`).
271
+ - **Issue melden** öffnet Issues nur im Repository von Composer Plus (`furkancak1r/dsh-composer-plus`), nicht in deinem Projekt (nutze dafür **GitHub-Issue öffnen** in der Liste **Später** von Funktionsideen). Für den Entwurf braucht es ein Standardmodell in dsh und zum Öffnen des Issues das GitHub CLI (`gh`) mit einer Anmeldung. Der Entwurf ist immer auf Englisch. Das Modell kann ein Detail falsch angeben: Lies den Entwurf, bevor du auf **Issue öffnen** klickst. Das Öffnen läuft höchstens 60 s; sendest du denselben Titel und Text innerhalb einer Stunde erneut, zeigt es das frühere Issue statt einer Kopie. **Stattdessen auf GitHub öffnen** kürzt eine sehr lange Beschreibung, damit der Link kurz bleibt.
258
272
  - **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.
259
273
  - **Git-Branch in Chatzeilen** zeigt den Branch des Chat-Ordners zu Beginn oder am Ende der letzten Runde, nicht den aktuellen Branch: Ein Branch-Wechsel außerhalb einer Runde erscheint erst nach der nächsten Runde. Chats von vor dieser Version zeigen bis zu ihrer nächsten Runde kein Etikett. Das Etikett sitzt im Markup der Chatzeilen von dsh (dsh hat dort keinen Platz dafür). Wenn ein dsh-Update dieses Markup ändert, erscheint kein Etikett. Das Etikett erscheint nur in „In einer Liste“.
260
274
  - **Ein Branch pro Chat** im Planmodus: dsh sendet `/plan <Nachricht>` als Befehl, nicht als Nachricht. Deshalb fängt Composer Plus das Absenden des Befehls im Eingabefeld von dsh ab (keine öffentliche API). Ändert ein dsh-Update das, läuft `/plan <Nachricht>` mit gewähltem **Neuer Branch** im offenen Bildschirm „Neuer Chat“ als eigener Befehl von dsh. Kann der Host im neuen Chat den Planmodus nicht einschalten, bleibt der Branch-Ordner, und die Nachricht wird nicht gesendet. So ändert der neue Chat keine Dateien im Standardmodus.
@@ -279,7 +293,10 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
279
293
  - **In einem neuen Chat fortsetzen** sendet den Chat (Nachrichten, Werkzeugaufrufe und das Ende jedes Werkzeugergebnisses, höchstens etwa 60.000 Zeichen, den neuesten Teil) an das eigene Modell des Chats. Die Übergabenotiz kann eine Entscheidung oder eine Datei auslassen: Lies sie vor dem Start. Der neue Chat kennt nur die Notiz und den verlinkten Chat (dsh hängt den alten Chat als schreibgeschützten Kontext an). Sein Modellkontext beginnt klein, der alte Chat bleibt, wie er ist. Pro Chat läuft immer nur eine Notiz oder ein Start.
280
294
  - **Kontextaufschlüsselung** zeigt Schätzungen nach der eigenen Regel von dsh (etwa 4 Zeichen pro Token), derselben Regel wie beim Kontextring von dsh. Die eigene Zählung des Modells kann abweichen. Die Tool-Definitionen sind die der neuesten Anfrage. Die Funktion zeigt den Kontext so, wie das Chatprotokoll ihn enthält. Eine Runde, die gerade läuft, erscheint nach ihrem nächsten Schritt.
281
295
  - **Geplante Schritte** spart nur dann Tokens, wenn das Modell plant: Solange die Funktion an ist, trägt jede Anfrage das Tool `plan_next_steps` und eine kurze Anweisung (etwa 500 Tokens), auch in Chats, in denen das Modell nie plant. Eine Bedingung beweist nur, was sie sagt (zum Beispiel: der Exit-Code des Builds war 0), nicht, dass die Arbeit stimmt. `ok` liest die eigenen Ergebnismarken von dsh (`[exit code: N]`, Zeitüberschreitungen, Sandbox-Ablehnungen); ein Befehl, der ohne Exit-Code ungleich null fehlschlägt, gilt als bestanden. Schritte laufen einzeln; zwei gleichzeitig bereite Schritte gehen an das Modell zurück. Die Nachricht des Schritts wird als Assistentennachricht des Chat-Modells gespeichert (dsh hat keine Markierung für eine Nachricht, die ein Plugin schreibt), daher sagt ihr Text, dass Composer Plus ihn ausgeführt hat. Nicht in Tether.
296
+ - **Türkisches Skill-Paket** installiert einen Skill von Dritten: Seine Regeln kommen aus dem GitHub-Repository des Autors, nicht von Composer Plus, und eine neue Version gilt ab der nächsten täglichen Prüfung, ohne dass wir sie prüfen. Die Prüfung beweist, dass die Dateien die sind, die GitHub für diesen Commit auflistet, nicht dass die Regeln gut sind. Das Modell entscheidet, wann es den Skill lädt (du kannst ihn auch mit Namen aufrufen); die Regeln gelten nur für türkische Texte. Die Host-Hälfte nutzt die Sprache, die ein Browser zuletzt gemeldet hat: Nutzen zwei Browser verschiedene Sprachen, gilt die neueste Meldung. GitHub erlaubt ohne Anmeldung 60 API-Aufrufe pro Stunde; eine abgelehnte Prüfung behält die installierte Kopie und zeigt den Grund in den Einstellungen.
297
+ - **Codebasis entwirren** enthält eine feste Kopie des Skills (caldoai/skills, Commit f3cf477): Eine Änderung im Original kommt erst mit einer neuen Composer-Plus-Version. Der Skill führt ein langes Ziel aus, das viele Dateien ändern kann, und seine Subagenten und Prüfungen verbrauchen viele Tokens. Wo das Projekt keine Tests hat, kann er das Verhalten unbemerkt ändern: Starte ihn in einem Branch und lies den Diff vor dem Merge. Ein Skill mit demselben Namen im Projekt, in einem eigenen Skill-Ordner oder in `~/.dsh/skills` ersetzt ihn. Solange der Schalter aus ist, geht `/untangle-codebase` als normaler Text an das Modell.
282
298
  - **Aufgabentafel** zeigt die Chats, die dsh in diesem Fenster auflistet: Ein Chat außerhalb eines Projekts erscheint nur unter **Alle Projekte**, und der Ordner eines Branches pro Chat (`<project>/.worktrees/<name>`) zählt zu seinem Projekt. Die Spalte einer Karte ist der Live-Zustand des Chats, daher lassen sich Karten nicht ziehen: Ein Chat kommt nach **Fertig**, wenn seine Runde endet, auch nach einem Fehler oder einem Stopp, und zurück nach **In Arbeit**, wenn er wieder läuft. Der grüne Punkt ist der Fertig-Punkt von dsh, den dsh nur in diesem Fenster behält: Nach einem Neuladen erscheinen beendete Chats ohne ihn. **Fertig** zeigt die neuesten 50 Chats (**N ältere anzeigen** zeigt den Rest). **Projekte durchsuchen** findet ein Projekt nur über seinen Namen, nicht über seinen Ordnerpfad. **In den letzten 2 Stunden aktiv** blendet ein Projekt aus, wenn jeder seiner Chats älter als 2 Stunden, inaktiv und gelesen ist; die Tafel zeigt das Projekt, das du gewählt hast, weiterhin. **Neue Aufgabe** merkt sich nur den neuesten neuen Chat dieses Fensters: Wenn du vor der ersten Nachricht einen anderen Chat öffnest, bleibt dieser Chat als **Neue Aufgabe** oben in **In Arbeit**, bis du darin schreibst, aber die Tafel kommt nur für den neuesten von selbst zurück. Nach einem Neuladen steht ein neuer Chat ohne Nachricht nicht auf der Tafel (dsh behält ihn als seine leere Neue Sitzung). Die Schlagwörter kommen aus einem Modellaufruf pro Aufgabe, aus ihrer ersten Nachricht: Sie können falsch sein, und ein Chat, den du nicht auf der Tafel gestartet hast, hat keine. Der Titel ist der Chattitel von dsh (der Titeldienst von dsh, mit dem Modell des Chats); bis er da ist, zeigt die Karte die erste Zeile der ersten Nachricht. **×** und **Alle entfernen** nehmen Karten nur von der Tafel: Kein Chat wird gelöscht. **Rückgängig** erscheint nur 8 Sekunden lang, in diesem Fenster; später holt **Entfernt (N)** → **Zurücklegen** eine Karte zurück, und ein Chat, der wieder läuft, kommt von selbst zurück. **Alle entfernen** fragt zuerst und nimmt die gelesenen fertigen Karten des gezeigten Projekts von der Tafel (bei **Alle Projekte** die aller Projekte), auch die hinter **N ältere anzeigen**; eine ungelesene (grüne) Karte bleibt. dsh behält seinen grünen Punkt nur in diesem Fenster, daher kann Alle entfernen nach einem Neuladen eine Karte nehmen, deren Antwort du nicht gelesen hast. Die Liste liegt auf diesem Mac, für jedes Fenster und für Tether; wenn sie 5.000 Chats hat, kommen die ältesten zurück. **Antworten** beantwortet nur die neueste Anfrage des Chats: Wenn sie an anderer Stelle beantwortet wurde (ein anderes Fenster, Tether, die automatische Prüfung) oder der Chat etwas Neues fragt, sagt das Panel das und sendet nichts. Frühere Versionen hatten eine Aufgabenliste mit Kommentaren und Agenten-Tools; diese gibt es nicht mehr, und die alte `board.json` wird nicht angezeigt. Die Idee und das Aussehen stammen von [Kanzo](https://github.com/emanuele-em/kanzo) von emanuele-em (AGPL-3.0); Composer Plus nutzt keinen Code daraus. `Cmd+Shift+K` ist ein dsh-Tastenkürzel: Im Browser unter Linux hat es keine Standardtaste (lege eine auf der Seite Tastenkürzel von dsh fest), und eine Browser-Erweiterung oder eine andere App kann die Taste vorher belegen. Eine Karte verlässt **Fertig**, wenn der grüne Punkt von dsh verschwindet (du hast den Chat geöffnet), oder, bei einem Chat, der hinter der Tafel als offener Chat fertig wurde, wenn dieser Chat ohne Panel darüber zu sehen ist. Dieser Gelesen-Zustand lebt nur in diesem dsh-Fenster, wie die Punkte von dsh: Nach einem Neuladen oder in einem anderen Fenster zählt jeder beendete Chat als gelesen und steht in **Kürzlich beendet**.
299
+ - **Assistent** hat einen Chat für alle Fenster dieses Macs. Er läuft mit dem Berechtigungsmodus workspace-write: Er schreibt Dateien nur in `~/Assistant`, und ein Befehl außerhalb dieses Ordners fragt zuerst. Wenn du den Chat auf einen Modus ohne Genehmigungen (Vollzugriff) umstellst, lehnt dsh jede Genehmigung ab. Dann kann der Assistent keinem Chat eine Nachricht senden und keinen Chat starten, stoppen oder archivieren. Die Genehmigungskarte schützt nur die sechs Tools: Ein Shell-Befehl des Assistenten kann weiterhin das Netzwerk erreichen, wie in jedem Chat mit diesem Modus. Unter dsh 0.2.0 und 0.2.1 sehen die Planungs-Tools von dsh nur die Erinnerungen des Assistenten-Chats selbst, nicht die Automatisierungen anderer Chats; ab dsh 0.2.2 listen und ändern sie jede geplante Aufgabe. chats_list lässt archivierte, leere und Subagent-Chats sowie den Assistenten-Chat selbst weg; „wartet auf dich“ bedeutet eine offene Genehmigung, Frage oder Planprüfung in einem laufenden Chat. chat_read liefert die Nachrichten des Benutzers und die Antworten des Agenten (keine Tool-Ausgabe), höchstens 50 Nachrichten und etwa 24.000 Zeichen. chat_archive lehnt einen Chat ab, der noch läuft oder aktive Erinnerungen hat. Ein Text, den das Modell liest, kann es trotzdem täuschen: Die Genehmigungskarte ist die letzte Prüfung, also lies sie, bevor du auf **Einmal zulassen** klickst.
283
300
  - **Neue Nachricht nach Stoppen zuerst** wirkt nur, nachdem du den Chat gestoppt hast (oder nach einer fehlgeschlagenen Runde, oder wenn du einen Chat öffnest, der noch eine Warteschlange hat): Eine Nachricht, die du sendest, während eine Runde läuft, wartet weiterhin am Ende der Warteschlange. Sie überholt nur deine eigenen eingereihten Nachrichten: Wartet eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange, bleibt die Reihenfolge von dsh. Die Funktion liest einen Teil von dsh, der keine öffentliche API ist (ob die gestoppte Runde noch endet); benennt ein dsh-Update ihn um, rückt die Nachricht erst vor, wenn diese Runde beendet ist. Subagent-Chats behalten die Reihenfolge von dsh.
284
301
  - **Projektgedächtnis** gehört zum ersten Ordner des Chats (dem Projektordner von dsh): Ein Chat, der seinen Ordner mit `cd` wechselt, behält das Gedächtnis seines ersten Projekts, und derselbe Ordner, über einen anderen Pfad zu denselben Dateien geöffnet, teilt es. Ein Chat friert seinen Gedächtnisteil beim Start ein, daher erscheint eine später gespeicherte Notiz ab dem nächsten Chat (`memory_recall` findet sie sofort). Die Prüfung behält nur, was das Modell behalten will: Sie kann einen Fakt übersehen oder einen falschen behalten. Prüfe sie in **Gedächtnis öffnen** und ändere sie dort, oder bearbeite die Dateien von Hand, während dsh geschlossen ist. **Gedächtnis öffnen** schickt die Notizen des gewählten Projekts und die globalen Notizen (alle Projekte, wenn du Alle Notizen wählst; höchstens etwa 60.000 Zeichen, der Rest wird nur gezählt und kann in dieser Anfrage nicht geändert werden) und deinen Text an das Standardmodell von dsh, nicht an das Modell des Chats. Eine Vorschau bleibt 30 Minuten und bis zum Neustart von dsh auf dem Mac; ändern eine Prüfung oder der Agent die Notizen in der Zwischenzeit, lehnt **Anwenden** ab und du holst eine neue Vorschau. **Anwenden** speichert alle Änderungen einer Vorschau oder keine: Lässt sich eine Änderung nicht speichern (zum Beispiel, weil MEMORY.md voll ist), bleiben die Notizen, wie sie waren, und der Grund wird angezeigt. Jede abgeschlossene Runde mit einer Nachricht von dir kostet einen Modellaufruf; ein fehlgeschlagener Aufruf liest dieselben Nachrichten nach der nächsten Runde erneut. Chats von Subagenten werden nicht geprüft. Die Idee und das Dateiformat stammen von [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus nutzt keinen Code daraus und liest oder schreibt nie das eigene Gedächtnis von DS Bot.
285
302
  - **Versionsverlauf des Gedächtnisses** behält die neuesten 50 Versionen jedes Gedächtnisses (jedes Projekt und das globale Gedächtnis); ältere werden gelöscht. Eine Version enthält das ganze Gedächtnis dieses Projekts, nicht eine Notiz. **Wiederherstellen** setzt alle Dateien dieser Version zurück (Themen eingeschlossen) und lehnt ab, wenn sich das Gedächtnis nach dem Öffnen der Version geändert hat; das Gedächtnis vor der Wiederherstellung wird eine neue Version, sodass du sie rückgängig machen kannst. Solange der Schalter aus ist, wird keine neue Version behalten und **Wiederherstellen** lehnt ab; behaltene Versionen bleiben. Versionen von vor dieser Funktion gibt es nicht: Der Verlauf beginnt mit dem ersten Speichern nach der Installation.
@@ -293,6 +310,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
293
310
  - **Wiederherstellen** läuft nur in der Rettungskonsole, während dsh geschlossen ist, und ersetzt das ganze dsh-Home. Das alte bleibt daneben als `.dsh.pre-restore-<time>`, bis du es entfernst; die Festplatte braucht also Platz für beide. Chats behalten ihre Projektpfade: Auf einem anderen Computer erscheint ein Projekt unter einem anderen Pfad als fehlend, bis du es neu hinzufügst. Symlinks, die aus dem dsh-Home hinaus zeigen (zum Beispiel Skills, die aus einem anderen Ordner verlinkt sind), kommen als Links zurück; ihre Ziele müssen auf diesem Computer existieren.
294
311
  - **Sitzungsprotokoll-Prüfung** liest das neueste Protokoll jedes Chats mit den eigenen Regeln von dsh dafür, was aufgeht: Eine Zeile, die kein JSON ist oder nicht in der richtigen Reihenfolge steht, zählt nur dann als Schaden, wenn danach ein Rundenende kommt (sonst öffnet dsh den Chat ohne die Zeilen ab dort, daher wird er nicht aufgelistet). Sie prüft die Ereignisse eines Protokolls nicht gegen die eigenen Ereignisregeln von dsh. Daher kann ein Protokoll, das sie für intakt hält, nach einem dsh-Upgrade trotzdem nicht aufgehen. Eine Reparatur nimmt die Kopie aus einer Sicherung: Die Nachrichten nach dieser Sicherung gehen in diesem Chat verloren (die beschädigte Datei bleibt daneben). Ein Chat, der in diesem dsh offen ist, wird in den Einstellungen nicht repariert: dsh hält ihn.
295
312
  - **Automatische Sicherung** läuft nur, während dsh läuft: Eine Sicherung, die fällig war, während dsh geschlossen war, läuft etwa 45 s nach dem nächsten Start. Der Snapshot für eine neue Version entsteht nach diesem Start, nicht vor dem Update.
313
+ - **Fenstergröße merken** funktioniert nur in der Desktop-App. Bei jedem Start zeigt dsh sein Fenster zuerst in 1280 × 820; das Fenster wechselt zur gespeicherten Größe, sobald das Plugin lädt. Eine Seite hat kein Ereignis für eine Fensterverschiebung, darum liest das Plugin das Fenster einmal pro Sekunde: Eine Änderung in den letzten 2 Sekunden vor dem Beenden von dsh wird nicht gespeichert. Die Größe wird pro Computer im eigenen Speicher der App gehalten.
314
+ - **Nutzungszählung:** Gezählt werden Kopien, keine Personen: Jedes dsh-Home ist eine Kopie. Die Zählung der einzelnen Kopien (`installed.txt`) erfasst nur Kopien, die auf die erste Version mit dieser Datei oder eine neuere aktualisieren; eine Kopie, die auf einer älteren Version bleibt, wird nicht gezählt. Eine Kopie, deren Ordner `storages` gelöscht wird, wird noch einmal gezählt. GitHub kann Anfragen von derselben IP-Adresse (zum Beispiel von mehreren Computern hinter einem NAT-Router) innerhalb von etwa 10 Minuten als eine zählen.
296
315
  - 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).
297
316
 
298
317
  ## Häufige Fragen
@@ -331,6 +350,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
331
350
 
332
351
  **Kann ich alle meine Chats als Kanban-Tafel sehen und von dort neue starten?** Ja, mit **Aufgabentafel** (standardmäßig an): Öffne sie in der linken Seitenleiste. Jeder Chat ist eine Karte in **In Arbeit**, **In Prüfung** (er wartet auf dich) oder **Fertig**. **Neue Aufgabe** öffnet den neuen Chat von dsh im Projekt, und die Tafel kommt zurück, wenn deine erste Nachricht abgeht; klicke auf einer orangen Karte auf **Antworten**, um zu antworten, ohne den Chat zu öffnen. **Alle entfernen** in **Fertig** fragt zuerst und nimmt die fertigen Karten, die du gelesen hast, von der Tafel; **Rückgängig** und **Entfernt (N)** holen sie zurück, und die Chats bleiben in dsh.
333
352
 
353
+ **Kann ich einen persönlichen Assistenten-Chat haben, der mich erinnert und meine anderen Chats verwaltet?** Ja, mit **Assistent** (standardmäßig aus): Schalte ihn unter Einstellungen → Composer Plus ein und klicke dann in der linken Seitenleiste auf **Assistent**. Er legt Erinnerungen mit den geplanten Aufgaben von dsh an, sucht im Web, listet und liest deine Chats und sendet einem Chat eine Nachricht oder startet, stoppt oder archiviert einen Chat erst, nachdem du es genehmigt hast. Speichere dein Profil im Gedächtnis seines Projekts, Thema "profil".
354
+
334
355
  **Kann dsh meine Chats und Einstellungen sichern, so wie dsh-backup?** Ja: **Einstellungen → Composer Plus → Sicherung → Jetzt sichern**. Es schreibt dasselbe Archivformat in denselben Ordner (`~/Desktop/dsh-backups`). Daher erscheinen auch die Archive von dsh-backup und lassen sich wiederherstellen, und du kannst dsh-backup entfernen. Schalte **Automatische Sicherung** ein, um nach Zeitplan zu sichern.
335
356
 
336
357
  **dsh startet nicht mehr. Wie stelle ich eine Sicherung wieder her?** Öffne den Sicherungsordner (`~/Desktop/dsh-backups`) und doppelklicke auf `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Wähle `3) Restore a backup`, wähle eine Sicherung aus und tippe `RESTORE`. Das funktioniert ohne dsh.
@@ -363,6 +384,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
363
384
 
364
385
  **Wie antworte ich nur auf einen Teil einer langen Antwort?** Markiere diesen Teil und klicke auf **Zitieren** über der Markierung (**In Antwort zitieren**, standardmäßig an). Der Teil kommt als `> …`-Zitat ins Eingabefeld, und du schreibst deine Antwort darunter.
365
386
 
387
+ **Wie zeige ich dem Agenten genau die Zeilen einer Datei?** Öffne die Datei in der rechten Seitenleiste (**Dateien im Arbeitsbereich**), markiere die Zeilen und klicke auf **Zitieren** über der Markierung (**Aus Dateivorschau zitieren**, standardmäßig an). Das Eingabefeld bekommt den Pfad und die Zeilennummern (zum Beispiel `src/login.js:2-3`) und die Zeilen als Codeblock; schreibe deine Frage darunter.
388
+
366
389
  **Kann ich etwas fragen, während der Agent arbeitet, ohne ihn anzuhalten?** Schreibe die Frage und klicke im Eingabefeld auf **Im Nebenchat fragen** (**Nebenchat**, standardmäßig an). Eine schreibgeschützte Kopie des Chats beantwortet sie, während der Chat weiterarbeitet. Im Nebenchat legt **Zurückholen** die Antwort in das Eingabefeld des Chats.
367
390
 
368
391
  **Wie sage ich dem Agenten, was er in seinem Diff ändern soll?** Öffne im **Änderungsbereich** das Diff der Datei, klicke bei einer Zeile auf **+** und schreibe eine Notiz (**Diff-Notizen**, standardmäßig an). Klicke dann auf **In Eingabefeld senden**: Die Notizen kommen mit Datei, Zeilennummern und Zeilen ins Eingabefeld.
@@ -371,7 +394,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
371
394
 
372
395
  **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.
373
396
 
374
- **Wie setze ich einen Chat meines anderen Macs auf diesem Mac fort?** Schalte auf dem anderen Mac **Einstellungen → Composer Plus → Remote-Computer** und **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link (schicke ihn dir selbst, zum Beispiel mit AirDrop oder Notizen). Schalte auf diesem Mac ebenfalls **Remote-Computer** ein, wähle links vom Chattitel **Computer hinzufügen…**, füge den Link ein und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach wählst du diesen Computer im selben Menü.
397
+ **Wie setze ich einen Chat meines anderen Macs auf diesem Mac fort?** Schalte auf dem anderen Mac **Einstellungen → Composer Plus → Remote-Computer** und **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link (schicke ihn dir selbst, zum Beispiel mit AirDrop oder Notizen). Schalte auf diesem Mac ebenfalls **Remote-Computer** ein, wähle in der Auswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach wählst du diesen Computer im selben Menü: Er füllt dieses Fenster. Klicke an derselben Stelle auf **Zurück zu diesem Mac**, um zurückzukommen. Die Chats dieses Macs laufen in der Zwischenzeit weiter.
375
398
 
376
399
  **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).
377
400
 
@@ -403,6 +426,12 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
403
426
 
404
427
  **Kann dsh den nächsten Befehl ausführen, ohne das Modell erneut zu fragen?** Ja, mit **Geplante Schritte** (standardmäßig aus): Schalte die Funktion unter Einstellungen → Composer Plus ein. Das Modell kann dann seine nächsten Befehle mit einer Bedingung planen, etwa „führe die Tests aus, wenn der Build gelingt“, und Composer Plus führt einen Schritt ohne neuen Modellaufruf aus, wenn das Ergebnis die Bedingung erfüllt. Freigaben und Sandbox bleiben, wie sie sind.
405
428
 
429
+ **Woher kommt der türkische Skill, und kann ich ihn entfernen?** Aus [yucezerey/turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) auf GitHub (MIT). Composer Plus installiert ihn nur, solange **App-Sprache** Türkçe ist, behält nur seine Markdown-Dateien und führt keines seiner Skripte aus. Zum Entfernen schalte **Türkisches Skill-Paket** in Einstellungen → Composer Plus aus: Der Skill und die geladene Kopie sind sofort weg.
430
+
431
+ **Wie melde ich in Composer Plus einen Fehler oder wünsche mir eine Funktion?** Einstellungen → Composer Plus → **Issue melden…** (oder das Menü **…** eines Chats → **Issue zu Composer Plus melden…**). Wähle einen Typ, beschreibe es in deiner eigenen Sprache und klicke auf **Entwurf schreiben**. Prüfe den englischen Entwurf und klicke dann auf **Issue öffnen**.
432
+
433
+ **Wie kann der Agent eine unordentliche Codebasis aufräumen?** Tippe `/untangle-codebase` in einen Chat (**Codebasis entwirren**, standardmäßig an), auf Wunsch mit einem Bereich, zum Beispiel `/untangle-codebase src/api`. Der Agent listet zuerst Kopien, versteckte Kopplungen, unnötige Wrapper, toten Code und Sonderfälle auf, behebt sie dann als Ziel und prüft mit Subagenten erneut. Starte ihn in einem Chat von **Ein Branch pro Chat**, damit die Arbeit in einem eigenen Branch bleibt.
434
+
406
435
  **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).
407
436
 
408
437
  ## Entwicklung
@@ -422,6 +451,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/t
422
451
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
423
452
  # Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
424
453
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
454
+ # Quote from file preview (fake model): lines of a code, text, Markdown and PDF file in the right sidebar → Quote → the path, the line numbers and the lines in the sent message; no button for the path header; switch off + its thumbnail
455
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-preview-quote.mjs /path/to/dsh/lib/bin.js
425
456
  # every Settings feature row shows a loading screenshot and a ? link to its README row
426
457
  PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
427
458
  # What's new after an update: the release notes show once (also after an install through another path), Esc and Close close them; Settings → What’s new in this version opens them again
@@ -473,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
473
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
474
505
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
475
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
476
509
  ```
477
510
 
478
511
  ```sh
@@ -494,3 +527,5 @@ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/b
494
527
  ## License
495
528
 
496
529
  MIT
530
+
531
+ `assets/skills/untangle-codebase/SKILL.md` ist der Skill `untangle-codebase` aus [caldoai/skills](https://github.com/caldoai/skills), © 2026 Maze, unter der MIT-Lizenz ([seine Lizenz](assets/skills/untangle-codebase/LICENSE)).