dsh-composer-plus 1.16.1 → 1.17.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 +27 -14
- package/README.es.md +27 -14
- package/README.fr.md +27 -14
- package/README.hi.md +27 -14
- package/README.id.md +27 -14
- package/README.ja.md +27 -14
- package/README.ko.md +27 -14
- package/README.md +27 -14
- package/README.pt-BR.md +27 -14
- package/README.ru.md +27 -14
- package/README.tr.md +27 -14
- package/README.vi.md +27 -14
- package/README.zh.md +27 -14
- package/assets/features/contextBreakdown.webp +0 -0
- package/assets/features/handoffChat.webp +0 -0
- package/assets/features/headerFit.webp +0 -0
- package/assets/features/projectMemory.webp +0 -0
- package/assets/features/protectedFiles.webp +0 -0
- package/client.js +729 -48
- package/index.js +731 -41
- package/package.json +2 -2
- package/tether/gateway/server.mjs +1 -1
package/README.de.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; dieses Profil verwaltet die App.)
|
|
31
31
|
|
|
32
|
-
> Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.
|
|
32
|
+
> Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.17.0`.
|
|
33
33
|
|
|
34
34
|
## Funktionen
|
|
35
35
|
|
|
@@ -47,6 +47,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
|
|
|
47
47
|
| **Planmodus mit Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` fügt `/plan ` am Anfang des Entwurfs ein (erneutes Drücken entfernt es wieder). Wenn der Chat schon im Planmodus ist, verlässt `Shift+Tab` den Planmodus. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Screenshot: Planmodus mit Shift+Tab"></a> |
|
|
48
48
|
| **Fokus im Eingabefeld behalten** | <a id="feature-keepfocus"></a>Nachdem du einen `/`-Befehl oder einen Skill gesendet hast, bleibt der Cursor im Eingabefeld, und du kannst sofort weitertippen. Das gilt auch für Tastaturmakros, die einen Befehl tippen und `Enter` drücken. dsh schaltet das Eingabefeld schreibgeschützt, während es den Befehl auflöst, und der Browser nimmt dann den Fokus weg. Diese Funktion setzt den Fokus zurück, außer ein Menü, ein Dialog oder ein anderes Feld hat ihn. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Screenshot: Fokus im Eingabefeld behalten"></a> |
|
|
49
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
|
+
| **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> |
|
|
50
51
|
| **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> |
|
|
51
52
|
| **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> |
|
|
52
53
|
| **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> |
|
|
@@ -63,19 +64,22 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
|
|
|
63
64
|
| **Branches im Arbeitsbereichsbaum** | <a id="feature-branchtree"></a>Einstellungen → Composer Plus → **Branches im Arbeitsbereichsbaum** (standardmäßig aus). Jeder Branch mit einem Worktree-Ordner in `<project>/.worktrees/` erscheint dann als Projekt in seinem Projekt; wähle in dsh **Ansichtsoptionen** → **Arbeitsbereichsbaum**, um ihn verschachtelt zu sehen. Ein Branch, dessen Ordner gelöscht wird, verschwindet aus der Liste, und dsh zeigt seine Chats unter **Ohne Gruppe**. Wenn der Agent eines Chats im Projektordner einen Branch erstellt und zu ihm wechselt (`git switch -c`, `git checkout -b`), während der Ordner keine nicht committeten Änderungen hat, geht der Projektordner auf seinen vorherigen Branch zurück, der Branch bekommt einen eigenen Ordner, und der Chat zieht dorthin um: Eine Kopie öffnet sich im Branch-Projekt und setzt die Aufgabe fort, der alte Chat wird archiviert. Die Liste wird beim Start, alle 30 Sekunden, nach jedem Durchgang und bei der Rückkehr ins Fenster geprüft. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Screenshot: Branches im Arbeitsbereichsbaum"></a> |
|
|
64
65
|
| **Vorhersage der nächsten Nachricht** | <a id="feature-nextprediction"></a>Standardmäßig an: Du kannst die Funktion unter **Einstellungen → Composer Plus** ausschalten. Wenn der Agent eine Runde beendet (keine gestoppte oder fehlgeschlagene), zeigt das leere Eingabefeld in Grau eine Vermutung deiner nächsten Nachricht, mit dem Hinweis **Tab zum Übernehmen**. `Tab` setzt den Text ins Eingabefeld, sendet ihn aber nicht. `Esc` blendet die Vermutung für diese Runde aus. Auch Tippen blendet sie aus, und eine neue Runde ersetzt sie. Das Menü **Modell** unter dem Schalter listet die eigenen Modelle von dsh (dieselbe Liste wie im Modellmenü von dsh). **dsh-Standard** ist vorausgewählt und folgt dem Standardmodell von dsh. Jede beendete Runde kostet einen kurzen Modellaufruf. In Tether erscheint die Vermutung über dem leeren Eingabefeld: Tippe darauf, um sie ins Feld zu setzen. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Screenshot: Vorhersage der nächsten Nachricht"></a> |
|
|
65
66
|
| **Beim Tippen vervollständigen** | <a id="feature-typingcompletion"></a>Standardmäßig aus: Du kannst die Funktion unter **Einstellungen → Composer Plus** einschalten. Während du tippst, zeigt grauer Text direkt nach dem Cursor, wie deine Nachricht weitergehen kann. `Tab` fügt ihn der Nachricht hinzu, sendet sie aber nicht. `Esc` blendet ihn aus. Er schlägt nur deine eigenen nächsten Wörter vor: nie eine Antwort an dich und keine erfundenen Fehlertexte oder Namen. Wenn die Nachricht fertig aussieht oder das Modell nicht sicher ist, erscheint nichts. Wenn du die nächsten Buchstaben des grauen Texts tippst, bleibt er stehen, ohne neuen Modellaufruf. Die Funktion hat ein eigenes Menü **Modell** unter ihrem Schalter. Der erste Eintrag, **Wie Vorhersage der nächsten Nachricht**, nutzt das Modell von **Vorhersage der nächsten Nachricht** (das ist der Standard). Wähle ein anderes Modell, um für jede Funktion ein eigenes Modell zu nutzen, zum Beispiel ein schnelleres Modell für Vervollständigungen. Sie macht bei jeder Pause beim Tippen einen Modellaufruf und verbraucht deshalb viel mehr Tokens als die Vorhersage: Wähle ein schnelles, günstiges Modell. Sie läuft nicht bei einem Slash-Befehl, bei einer Nachricht mit einem Datei-Chip oder wenn der Cursor nicht am Ende steht. In Tether erscheint der Rest beim Tippen über dem Feld: Tippe darauf, um ihn hinzuzufügen. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Screenshot: Beim Tippen vervollständigen"></a> |
|
|
66
|
-
| **Prompt verbessern** | <a id="feature-promptimprove"></a>Tippe eine grobe Anfrage und klicke dann auf den Zauberstab (**Prompt verbessern**) neben dem Modellmenü. Ein Modellaufruf schreibt sie als klareren Prompt neu: zuerst das Ziel, kurze nummerierte Schritte, wenn es mehrere Teile gibt, und die Prüfung, die laufen soll. Die Funktion liest diesen Chat (ohne zurückgenommene Nachrichten), README, AGENTS.md und Manifest des Projekts, die geänderten Dateien und die Dateien, deren Namen zu deinen Wörtern passen, und behält deine Sprache bei. Sie erfindet nie Dateinamen. Der neue Text ersetzt deinen Entwurf, wird aber nicht gesendet: Lies ihn, bearbeite ihn und drücke dann `Enter`. `Cmd/Ctrl+Z` holt deinen Text in einem Schritt zurück, ebenso die Schaltfläche (**Verbesserung rückgängig machen**). Wenn du tippst, während sie arbeitet, bleibt dein neuer Text stehen. `Esc` oder ein zweiter Klick bricht ab. Sie hat ein eigenes Menü **Modell** in den Einstellungen (Standard: **Wie das Modell des Chats**). Nicht für Slash-Befehle oder eine Nachricht mit einem Datei-Chip. In Tether ist der Zauberstab neben dem Feld. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Screenshot: Prompt verbessern"></a> |
|
|
67
|
-
| **Zielprüfung** | <a id="feature-goalcheck"></a>Starte ein Ziel mit `/goal`. Wenn der Agent das Ziel in einem automatischen Durchlauf als abgeschlossen markiert, schließt sich das Ziel erst nach zwei Prüfungen. Zuerst läuft der Testbefehl des Projekts im Ordner des Chats, im Sandbox-Modus des Chats. Der Befehl ist dein eigener oder der, der in `package.json`, `Makefile`, `Cargo.toml`, `go.mod` oder pytest gefunden wird. Wenn der neueste eigene Schritt des Agenten ein erfolgreicher Lauf dieses Tests war, läuft er nicht noch einmal. Dann liest ein unabhängiger Modellaufruf ohne Werkzeuge das Ziel, diesen Chat, `git status` und das Testergebnis. Schlägt eine Prüfung fehl, bleibt das Ziel aktiv, der Agent liest
|
|
68
|
-
| **
|
|
67
|
+
| **Prompt verbessern** | <a id="feature-promptimprove"></a>Tippe eine grobe Anfrage und klicke dann auf den Zauberstab (**Prompt verbessern**) neben dem Modellmenü. Ein Modellaufruf schreibt sie als klareren Prompt neu: zuerst das Ziel, kurze nummerierte Schritte, wenn es mehrere Teile gibt, und die Prüfung, die laufen soll. Die Funktion liest diesen Chat (ohne zurückgenommene Nachrichten), README, AGENTS.md und Manifest des Projekts, die geänderten Dateien und die Dateien, deren Namen zu deinen Wörtern passen, und behält deine Sprache bei. Sie erfindet nie Dateinamen. Der neue Text ersetzt deinen Entwurf, wird aber nicht gesendet: Lies ihn, bearbeite ihn und drücke dann `Enter`. `Cmd/Ctrl+Z` holt deinen Text in einem Schritt zurück, ebenso die Schaltfläche (**Verbesserung rückgängig machen**). Wenn du tippst, während sie arbeitet, bleibt dein neuer Text stehen. `Esc` oder ein zweiter Klick bricht ab. Sie hat ein eigenes Menü **Modell** in den Einstellungen (Standard: **Wie das Modell des Chats**). Bei einer Nachricht `/goal <objective>` schreibt sie nur das Ziel neu, als Abschlussbedingung, die die **Zielprüfung** prüfen kann: die Ergebnisse, die Prüfungen, die bestehen müssen, die Belege, die im Chat zu zeigen sind, ein nicht machbarer Teil als ungeklärt markiert und ein Stopp, wenn dasselbe Hindernis bleibt. Der Befehl `/goal` bleibt. Nicht für andere Slash-Befehle, ein Steuerwort von `/goal` (`clear`, `pause`, `resume`) oder eine Nachricht mit einem Datei-Chip. In Tether ist der Zauberstab neben dem Feld. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Screenshot: Prompt verbessern"></a> |
|
|
68
|
+
| **Zielprüfung** | <a id="feature-goalcheck"></a>Starte ein Ziel mit `/goal`. Wenn der Agent das Ziel in einem automatischen Durchlauf als abgeschlossen markiert, schließt sich das Ziel erst nach zwei Prüfungen. Zuerst läuft der Testbefehl des Projekts im Ordner des Chats, im Sandbox-Modus des Chats. Der Befehl ist dein eigener oder der, der in `package.json`, `Makefile`, `Cargo.toml`, `go.mod` oder pytest gefunden wird. Wenn der neueste eigene Schritt des Agenten ein erfolgreicher Lauf dieses Tests war, läuft er nicht noch einmal. Dann liest ein unabhängiger Modellaufruf ohne Werkzeuge das Ziel, diesen Chat, `git status` und das Testergebnis. Das Modell antwortet mit einer Nachweistabelle: Jeder Teil des Ziels ist bestätigt, falsch oder ungeklärt, mit dem Nachweis und der Korrektur; das Ziel schließt sich erst, wenn jeder Teil bestätigt ist. Schlägt eine Prüfung fehl, bleibt das Ziel aktiv, der Agent liest jeden offenen Teil mit seinem Nachweis und seiner Korrektur, und der nächste Durchlauf geht weiter. Eine Zeile unter der Zielleiste (**Zielprüfung**) zeigt den Test, das letzte Ergebnis und wie viele Teile bestätigt sind (fahre mit der Maus darüber, um die Tabelle zu sehen). **Bearbeiten** legt deinen eigenen Testbefehl und ein Zeit- oder Token-Limit fest; über dem Limit wird das Ziel blockiert. Das Token-Limit zählt auch die Subagents des Chats. **Jetzt ausführen** führt die Prüfung aus, ohne das Ziel zu schließen. Die Funktion hat ein eigenes Menü **Modell** in den Einstellungen (Standard: **Wie das Modell des Chats**). Wenn du das Ziel selbst abschließt, wird nichts geprüft. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Screenshot: Zielprüfung"></a> |
|
|
69
|
+
| **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
|
+
| **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
|
+
| **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> |
|
|
72
|
+
| **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> |
|
|
69
73
|
| **Für diesen Chat zulassen** | <a id="feature-allowforchat"></a>Wenn die automatische Prüfung dich fragt, bekommt die Genehmigungskarte **Für diesen Chat zulassen**: Dasselbe Tool ist im selben Chat ab dann erlaubt, mit beliebigen Argumenten, bis das Zeitlimit abläuft (standardmäßig 1 Stunde; wähle es unter **Einstellungen → Composer Plus → Für diesen Chat zulassen**). Danach fragt der Agent wieder. Ein Chip in der Kopfzeile listet die Freigaben mit ihrer Endzeit auf und widerruft sie. Freigaben bleiben nach einem Neustart erhalten. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Screenshot: Für diesen Chat zulassen"></a> |
|
|
70
74
|
| **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> |
|
|
71
|
-
| **Git-Branch in Chatzeilen** | <a id="feature-sessionbranch"></a>Jede Chatzeile in der Seitenleiste zeigt ein kleines graues Etikett mit dem git-Branch, auf dem der Projektordner des Chats in dessen letzter Runde war (zum Beispiel `main` oder `feature/login`; ein losgelöster HEAD
|
|
75
|
+
| **Git-Branch in Chatzeilen** | <a id="feature-sessionbranch"></a>Jede Chatzeile in der Seitenleiste zeigt ein kleines graues Etikett mit dem git-Branch, auf dem der Projektordner des Chats in dessen letzter Runde war (zum Beispiel `main` oder `feature/login`; ein losgelöster HEAD hat keinen Branch und zeigt kein Etikett). Zwei Chats eines Projekts auf verschiedenen Branches sehen nicht mehr gleich aus, und du siehst sofort, wenn du einen Chat auf dem falschen Branch fortsetzen willst. Fahre mit der Maus über das Etikett, um den vollen Namen zu sehen. Die Host-Hälfte liest den Branch (`git branch --show-current`, nur lesend), wenn eine Runde beginnt und wenn sie endet; ein Chat ohne Runde seit der Installation oder ein Ordner, der kein git-Repository ist, zeigt kein Etikett. Wenn die Projektzeile über dem Chat denselben Namen wie der Branch hat (zum Beispiel ein Ordner von „Ein Branch pro Chat“), zeigt die Chatzeile kein Etikett, aber „In einer Liste“ zeigt es weiterhin. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Screenshot: Git-Branch in Chatzeilen"></a> |
|
|
72
76
|
| **Alle als gelesen markieren** | <a id="feature-markprojectread"></a>Klicke in der Seitenleiste auf die Schaltfläche **…** eines Projekts → **Alle als gelesen markieren**. Bei allen Chats in diesem Projekt verschwindet sofort der grüne Punkt für ungelesene Chats. Andere Projekte behalten ihre Punkte. Der Eintrag ist ausgegraut (**Keine ungelesenen Chats**), wenn das Projekt keine hat. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Screenshot: Alle als gelesen markieren"></a> |
|
|
73
77
|
| **Aktive Projekte zuerst** | <a id="feature-activeprojectsfirst"></a>Wenn ein Chat zu laufen beginnt oder dich braucht, rückt sein Projekt mit der eigenen Zeilenanimation von dsh an den Anfang der Seitenleiste (dieselbe Bewegung wie beim Hinziehen von Hand). Fertige Projekte bleiben, wo sie sind; ziehe sie wie gewohnt an eine beliebige Stelle. Die Verschiebungen werden in der Projektreihenfolge von dsh gespeichert. Wenn du die Funktion ausschaltest, bleibt die aktuelle Reihenfolge also erhalten. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Aktive Projekte zuerst"></a> |
|
|
74
78
|
| **Filter für aktuelle Projekte** | <a id="feature-recentprojects"></a>Seitenleiste → Ansichtsoptionen (Schieberegler-Symbol) → **In den letzten 2 Stunden aktiv**. Solange diese Option ausgewählt ist, zeigt die Seitenleiste nur Projekte mit einem Chat, der in den letzten 2 Stunden aktiv war. Das ist ein Chat, der in dieser Zeit aktualisiert wurde, ein laufender oder wartender Chat, der geöffnete Chat oder ein fertiger Chat, den du noch nicht geöffnet hast (der grüne „Fertig“-Punkt von dsh), auch nach den 2 Stunden. Projekte ohne einen solchen Chat sind ausgeblendet, auch neue und leere Projekte. In der Ansicht **Arbeitsbereichsbaum** bleibt ein übergeordneter Ordner sichtbar, solange ein Projekt darin aktiv ist, und Chats, die in den letzten 2 Stunden nicht aktiv waren, sind ebenfalls ausgeblendet, sodass nur die aktuellen Chats sichtbar sind. Wähle die Option erneut, um alle Projekte zu zeigen. Die Auswahl bleibt auf diesem Gerät gespeichert. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Screenshot: Filter für aktuelle Projekte"></a> |
|
|
75
79
|
| **Alle Projekte einklappen** | <a id="feature-collapseprojects"></a>Solange ein Projekt in der Seitenleiste geöffnet ist, erscheint neben den Ansichtsoptionen (Schieberegler-Symbol) eine Schaltfläche. Klicke darauf, um alle geöffneten Projekte auf einmal zu schließen, zum Beispiel 3 geöffnete von 5 Projekten. Die Schaltfläche verschwindet wieder, wenn kein Projekt geöffnet ist. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Screenshot: Alle Projekte einklappen"></a> |
|
|
76
80
|
| **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> |
|
|
77
81
|
| **Hintergrundbenachrichtigungen** | <a id="feature-notifications"></a>Solange dsh im Hintergrund läuft, bekommst du eine Benachrichtigung, wenn eine Runde fertig ist (erste Zeile der Antwort). Du bekommst auch eine, wenn ein Chat wirklich auf dich wartet: auf eine Genehmigung (Toolname), eine Antwort (die Frage) oder eine Planprüfung. Eine Anfrage muss 1,5 s später noch offen sein. So bleiben automatisch beantwortete Genehmigungen (Freigaben der automatischen Prüfung, andere Plugins) stumm. Eine Benachrichtigung verschwindet, sobald ihre Anfrage beantwortet ist. Das Kennzeichen im Dock bzw. in der Taskleiste zählt die wartenden Chats. Ein Klick öffnet den Chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Screenshot: Hintergrundbenachrichtigungen"></a> |
|
|
78
|
-
| **Wartenden Chat bei Inaktivität öffnen** | <a id="feature-idleswitch"></a>Wenn ein Chat eine Frage stellt
|
|
82
|
+
| **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> |
|
|
79
83
|
| **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> |
|
|
80
84
|
| **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> |
|
|
81
85
|
| **Automatische Updates** | <a id="feature-autoupdate"></a>Wenn dsh startet, prüft das Plugin das [neueste GitHub-Release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Ist es neuer und schon auf npm, installiert das Plugin genau diese Version über die eigene Plugin-Verwaltung von dsh (derselbe Weg wie Einstellungen → Plugins) und benachrichtigt dich. Starte dsh neu, um die Version zu laden. **Einstellungen → Composer Plus → Composer-Plus-Updates** zeigt die Version und hat **Nach Updates suchen** / **Jetzt aktualisieren**. Beim ersten Start von dsh mit der neuen Version zeigt ein Fenster **Neu in Composer Plus N** einmal die Release Notes dieser Version (aus derselben Update-Prüfung, ohne weiteren Netzwerkaufruf); **Schließen** oder `Esc` schließt es. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatische Updates"></a> |
|
|
@@ -160,7 +164,10 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
160
164
|
- **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).
|
|
161
165
|
- **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).
|
|
162
166
|
- **Zielprüfung:** Sie läuft nur, wenn der Agent ein `/goal` in einem automatischen Durchlauf als abgeschlossen markiert (oder wenn du auf **Jetzt ausführen** klickst). Die Host-Hälfte führt den Testbefehl im Ordner des Chats im Sandbox-Modus des Chats aus (wie das eigene `bash`-Werkzeug von dsh: dieselbe Richtlinie für den Dateizugriff; kann diese Sandbox nicht starten, läuft der Test nicht und die Prüfung schlägt fehl). Um den Befehl zu finden, liest sie nur `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` und `pytest.ini`, als reguläre Dateien im Ordner (kein Symlink aus dem Ordner hinaus, kein FIFO). Dann sendet sie das Ziel, den Chat seit dem Start des Ziels (deine Nachrichten, die Antworten des Agenten, Werkzeugaufrufe gekürzt auf 1.000 Zeichen und die letzten 2.000 Zeichen jedes Werkzeugergebnisses; kein Reasoning, keine zurückgenommenen Schritte; höchstens etwa 60.000 Zeichen, den neuesten Teil), `git status --short` und das Ende der Testausgabe als eine einzige Anfrage ohne Werkzeuge an das unter **Zielprüfung** gewählte Modell (standardmäßig das eigene Modell des Chats). Werkzeugausgaben können enthalten, was der Agent gelesen hat. Daher kann diese Anfrage Teile deiner Dateien enthalten, so wie der Chat selbst. In den Chat und ins Projekt wird nichts geschrieben. Dein Testbefehl, die Limits, das letzte Ergebnis (mit dem Ende seiner Ausgabe) und die Modellwahl liegen in `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (Datei nur für den Besitzer, die neuesten 500 Chats).
|
|
163
|
-
- **
|
|
167
|
+
- **In einem neuen Chat fortsetzen:** Nichts läuft, bis du darauf klickst. Dann sendet die Host-Hälfte den Chat (so, wie die Zielprüfung ihn liest: kein Reasoning, keine zurückgenommenen Schritte) an das eigene Modell des Chats und zeigt die Übergabenotiz. Nur **Neuen Chat starten** erstellt einen neuen Chat. Ins Projekt wird nichts geschrieben.
|
|
168
|
+
- **Kontextaufschlüsselung:** Die Host-Hälfte liest nur das Chatprotokoll. Kein Modellaufruf, keine Projektdatei.
|
|
169
|
+
- **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.
|
|
170
|
+
- **Projektgedächtnis:** aus, bis du es einschaltest. Solange es an ist, schickt der Host-Teil nach jeder abgeschlossenen Runde eines Chats der obersten Ebene die neuen Nachrichten dieses Chats seit der letzten Prüfung (deine Nachrichten und die Textantworten des Agenten; keine Werkzeugausgabe, kein Reasoning, kein verborgener Kontext, keine zurückgenommenen Nachrichten; in einem abgezweigten Chat bleibt die Kopie des Eltern-Chats weg; höchstens etwa 16.000 Zeichen) und die gespeicherten Notizen an das Modell des Chats, als eine Anfrage ohne Werkzeuge. Die Notizen sind Markdown-Dateien unter `$DSH_HOME/storages/dsh-composer-plus/memory/` (nur für den Eigentümer): `projects/<id>/` für jeden Projektordner (`<id>` ist ein Hash des echten Pfads des Ordners; `project.json` nennt den Ordner), `global/`, `journal.jsonl` (jede Änderung mit der Zeile davor und danach) und `reviewed.json` (wie weit jeder Chat gelesen wurde). In den Projektordner wird nichts geschrieben. Notizen, die wie ein Schlüssel, ein Token, ein Passwort oder eine Ausweisnummer aussehen, werden abgelehnt. Die Notizen eines Projekts kommen in den Systemprompt jedes neuen Chats in diesem Ordner und gehen so mit jeder Anfrage dieses Chats an das Modell. Der Schalter liegt in `memory.json` am selben Ort. **Gedächtnis öffnen** schickt nichts, bis du auf **Änderungen ansehen** klickst; dann schickt es die angezeigten Notizen und deinen Text als eine Anfrage ohne Werkzeuge an das Standardmodell von dsh. Die Änderungen werden erst mit **Anwenden** geschrieben, mit `editor` im Journal. Tether liest und ändert die Notizen über dieselbe Route.
|
|
164
171
|
- **Sicherung:** Nichts verlässt deinen Rechner. Archive landen in `~/Desktop/dsh-backups` (Dateien nur für den Besitzer). Geheimnisse sind nicht im Archiv: Dateien mit Anmeldedaten (`.credentials.yaml`, `.env`), Schlüsseldateien (`.pem`, `.key`, `.p12`, `.pfx`) und die Werte der Einstellungen token, secret, password und API-Schlüssel in den yml-Dateien werden maskiert. Ihre echten Kopien bleiben in `composer-plus-vault/<archive>/` im selben Ordner (nur für den Besitzer), nur auf diesem Computer. **Für einen anderen Computer** kopiert keinen vault: Gib diese Geheimnisse dort neu ein. Deine Chatprotokolle, Einstellungen und der Rest des dsh-Home liegen unverändert im Archiv: Halte den Ordner privat, so wie `$DSH_HOME` selbst. Die Sicherung liest Dateien mit `O_NOFOLLOW | O_NONBLOCK`. Ein Symlink wird als Link gespeichert (nie verfolgt), ein FIFO oder Gerät wird übersprungen. Schalter und Einstellungen der automatischen Sicherung liegen in `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, der Schalter der Rettungskonsole in `rescue-console.json`. Solange dsh läuft, nennt `running/host-<pid>.json` jeden dsh-Prozess (die Rettungskonsole liest diese Dateien, um eine Wiederherstellung abzulehnen).
|
|
165
172
|
- **Rettungskonsole:** ein Menü im Terminal; sie öffnet keinen Netzwerkport. Eine Wiederherstellung schreibt nur in einen neuen Ordner neben dem dsh-Home (Dateien mit `O_EXCL | O_NOFOLLOW`, Symlinks zuletzt und nie verfolgt). Sie lehnt ein Archiv ab, das einen unsicheren Namen (`..`, einen absoluten Pfad), ein Gerät oder FIFO, mehr als einen obersten Ordner oder einen Eintrag unter einem Link enthält.
|
|
166
173
|
|
|
@@ -182,7 +189,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
182
189
|
- **Kein Branch-Etikett an einer Chatzeile:** Der Chat hatte seit der Installation dieser Version keine Runde, sein Ordner ist kein git-Repository, oder **Git-Branch in Chatzeilen** ist aus. Starte dsh nach einem Update neu (die Host-Hälfte zeichnet den Branch auf).
|
|
183
190
|
- **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.
|
|
184
191
|
- **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).
|
|
185
|
-
- **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.
|
|
192
|
+
- **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.17.0`), siehe den Hinweis zur Installation oben.
|
|
186
193
|
- **Jetzt sichern meldet „Eine andere Sicherungsaktion läuft“:** Eine Aktion läuft in einem anderen dsh-Fenster oder in der Rettungskonsole (sie teilen sich eine Sperrdatei, `.composer-plus.lock`, im Sicherungsordner). Warte, bis sie fertig ist. Läuft keine Aktion, wird die Sperre eines beendeten Prozesses beim nächsten Klick übernommen.
|
|
187
194
|
- **Die Rettungskonsole meldet „dsh is running“:** Beende zuerst dsh. Ist dsh wirklich geschlossen, ist die in der Meldung genannte Datei von einem Absturz übrig: Entferne sie und versuche es erneut.
|
|
188
195
|
- **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.
|
|
@@ -205,6 +212,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
205
212
|
- **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.
|
|
206
213
|
- **Fokus im Eingabefeld behalten** gibt den Fokus nur nach einem `/`-Befehl oder Skill zurück. Während dsh den Befehl auflöst, bleibt das Eingabefeld einige Millisekunden lang schreibgeschützt. Tasten, die du in dieser Zeit drückst, gehen verloren. Wenn das `/`-Menü von dsh noch offen ist, wählt `Enter` die markierte Zeile und sendet nicht.
|
|
207
214
|
- **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.
|
|
215
|
+
- **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.
|
|
208
216
|
- **Mobile Verbindung** funktioniert nur unter macOS (sie nutzt `en0`, `openssl`, `swift` und `dns-sd`). Sie nutzt die festen Ports 19390 und 19391. Daher kann auf jedem Mac nur ein dsh sie gleichzeitig ausführen (jeder Mac ist ein Eintrag in der Mac-Liste des Telefons). Das Telefon bekommt Benachrichtigungen nur, solange Tether offen ist oder gerade in den Hintergrund gewechselt ist (kein Push-Dienst). Tether sendet sie erst, wenn du in Tether „Settings → Notifications → Send notifications“ einschaltest. Der Schalter ist standardmäßig aus, und iOS fragt beim Einschalten nach der Erlaubnis. Die iOS-App ist noch nicht im App Store: Baue sie mit Xcode aus `tether/ios`. „Tailscale only“ braucht trotzdem eine WLAN- oder Ethernet-Adresse auf dem Mac (das Gateway startet nur mit einer solchen Adresse). Das Zugriffsprotokoll gilt pro Mac und speichert nur die neuesten 200 Versuche. Ein wiederholter Versuch innerhalb einer Minute zählt dieselbe Zeile um eins hoch. Die App-Sperre von Tether blendet Mitteilungsvorschauen auf dem Sperrbildschirm des iPhone nicht aus: Schalte sie in den iOS-Einstellungen aus. Die grünen Punkte in Tether folgen dem Mac: Ein Chat, den du in dsh öffnest, verliert seinen Punkt auch auf dem Telefon. Ein Chat, den du in Tether öffnest, verliert seinen Punkt nur auf den Telefonen. Der eigene Punkt von dsh auf dem Mac bleibt, bis du den Chat dort öffnest.
|
|
209
217
|
- 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.
|
|
210
218
|
- **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.
|
|
@@ -219,7 +227,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
219
227
|
- **Ein Branch pro Chat**: Wenn der Branch-Ordner eines Chats (`<project>/.worktrees/<name>`) gelöscht wird, zum Beispiel wenn der eigene Agent des Chats den Worktree entfernt und den Branch löscht, verschiebt der nächste Schritt des Chats den Chat aus diesem Ordner. Das Projekt des Branch-Ordners verschwindet aus der Seitenleiste, und der Chat erscheint unter Ohne Gruppe und bleibt offen. Ab dsh 0.2.1 läuft der Chat im Hauptordner des Projekts weiter, und das Modell bekommt einen Hinweis auf den neuen Ordner. Unter dsh 0.2.0 behält der Chat den gelöschten Ordner: Ein Befehl dort schlägt fehl, bis Sie einen neuen Chat beginnen. Auch das Projekt eines gelöschten Branches, das kein Chat nutzt, verschwindet aus der Seitenleiste: Composer Plus prüft die Branch-Ordner beim Start und alle 30 Sekunden, auch ohne Filter der Seitenleiste. Während ein Chat verschoben wird, antwortet **Neuer Branch** im selben Repository mit „erneut versuchen“. Mit ausgeschaltetem Schalter zeigt dsh wieder seinen eigenen Fehler („working-directory: directory does not exist“).
|
|
220
228
|
- **Branches im Arbeitsbereichsbaum** schreibt ohne Klick in git: Wenn es einen Chat verschiebt, setzt es den Projektordner auf seinen vorherigen Branch zurück (`git switch`) und fügt einen Worktree hinzu (`git worktree add`). Es löscht nie einen Branch, einen Worktree oder eine Datei. dsh kann den Ordner eines Chats nicht ändern, daher ist ein verschobener Chat eine Kopie (dshs eigener Fork, mit neuer ID), und der alte Chat wird archiviert. Die Kopie setzt die angehaltene Aufgabe fort; ein Tool-Aufruf, der lief, als der Branch erschien, endet mit einer Ablehnung, und der Agent führt ihn im neuen Ordner erneut aus. Ein Ziel des alten Chats zieht nicht mit. Nur ein Chat, dessen Ordner der Hauptordner des Repositorys ist, wird verschoben, und nur für einen Branch, den er in diesem Durchgang erstellt und ausgecheckt hat (`git switch -c`, `git checkout -b`): Ein nur mit `git branch` erstellter Branch, ein Ordner mit nicht committeten Änderungen, ein verknüpfter Worktree oder ein Unterordner verschieben nichts. Im Baum erscheinen nur Worktrees direkt in `<project>/.worktrees/` mit einem Branch; ein losgelöster (detached) Worktree oder einer an anderer Stelle erscheint nicht. Die Kopie öffnet sich nur von selbst, wenn ihr Chat der geöffnete war (das Plugin liest das aus dshs Zeile in der Seitenleiste); sonst ist sie im Branch-Projekt.
|
|
221
229
|
- **Im Chat suchen** durchsucht nur, was die Seite zeigt: die geladenen Nachrichten und Antworten (scrolle nach oben oder klicke auf **Ältere laden** für ältere), nicht geschlossene Tool-Schritte und nicht den eingeklappten Text in der Ausgabe eines Tools. Die Suche zählt höchstens 2.000 Treffer (dann „2000+“). Sie nutzt die Highlight-API des Browsers (Chromium 105 und neuer; die Desktop-App hat sie): In einem älteren Browser funktionieren die Zählung und das Springen ohne die Farbe. `Cmd+F` auf einem Mac (`Ctrl+F` unter Windows und Linux) öffnet sie nur, solange ein Chat auf dem Bildschirm ist. Anderswo funktioniert die eigene Suche des Browsers wie bisher. Auf einem Mac behält `Ctrl+F` in Textfeldern seine macOS-Funktion (der Cursor geht ein Zeichen weiter).
|
|
222
|
-
- **Wartenden Chat bei Inaktivität öffnen** kennt nur, was das Fenster von dsh sieht: Arbeit in einer anderen App zählt nicht. Ist dsh im Hintergrund, kann es also nach 30 Sekunden einen wartenden Chat öffnen. dsh kommt dabei nicht in den Vordergrund. Lesen ohne Taste, Klick oder Mausbewegung zählt als Inaktivität. Es achtet nur auf Chats mit dem orangefarbenen Punkt von dsh (eine Frage, eine Genehmigung oder eine Planprüfung); die Anfrage eines Subagenten erscheint in seinem übergeordneten Chat. Solange ein wartender Chat auf dem Bildschirm ist, öffnet sich kein anderer; ein Chat, den du ohne Antwort verlassen hast, kann sich nach den nächsten 30 Sekunden ohne Benutzung wieder öffnen. Die 30 Sekunden lassen sich nicht ändern.
|
|
230
|
+
- **Wartenden Chat bei Inaktivität öffnen** kennt nur, was das Fenster von dsh sieht: Arbeit in einer anderen App zählt nicht. Ist dsh im Hintergrund, kann es also nach 30 Sekunden einen wartenden Chat öffnen. dsh kommt dabei nicht in den Vordergrund. Lesen ohne Taste, Klick oder Mausbewegung zählt als Inaktivität. Es achtet nur auf Chats mit dem orangefarbenen Punkt von dsh (eine Frage, eine Genehmigung oder eine Planprüfung) oder mit dem grünen Punkt (eine fertige Runde, die du noch nicht geöffnet hast); die Anfrage eines Subagenten erscheint in seinem übergeordneten Chat. Orangefarbene Chats öffnen sich zuerst. Das Öffnen eines grünen Chats entfernt seinen Punkt, daher beginnen die 30 Sekunden des nächsten grünen Chats erst nach deiner nächsten Taste, deinem nächsten Klick, deiner nächsten Mausbewegung, dem Mausrad oder einer Berührung: Wenn du zurückkommst, sind die anderen grünen Punkte noch da. Solange ein wartender Chat auf dem Bildschirm ist, öffnet sich kein anderer; ein Chat, den du ohne Antwort verlassen hast, kann sich nach den nächsten 30 Sekunden ohne Benutzung wieder öffnen. Die 30 Sekunden lassen sich nicht ändern.
|
|
223
231
|
- Eine Benachrichtigung, die vor einem Neustart gesendet wurde, holt dsh beim Klicken nur in den Vordergrund.
|
|
224
232
|
- Aktive Projekte werden über die gespeicherte Projektreihenfolge von dsh verschoben. Die neue Reihenfolge bleibt also nach einem Neustart erhalten. Chats außerhalb eines Projekts („Ohne Gruppe“) lassen sich nicht verschieben; dsh listet sie immer zuletzt.
|
|
225
233
|
- dsh hat keinen Erweiterungspunkt im Menü der Ansichtsoptionen der Seitenleiste. Deshalb kommt die Option für aktuelle Projekte in das eigene Menü von dsh. Wenn ein dsh-Update dieses Menü ändert, erscheint die Option nicht, und alle Projekte bleiben sichtbar. Der Filter wirkt auf Projektzeilen, daher wird **In einer Liste** nicht gefiltert. In **Arbeitsbereichsbaum** bleibt ein übergeordneter Ordner sichtbar, solange ein Projekt darin aktiv ist, und auch die Chatzeilen, die in den letzten 2 Stunden nicht aktiv waren, werden ausgeblendet; in **Arbeitsbereich** werden nur Projektzeilen gefiltert. Der Filter liest die Ansicht, die dsh zeigt, aus der gespeicherten Ansichtseinstellung von dsh (keine öffentliche API); benennt ein dsh-Update sie um, wird **Arbeitsbereichsbaum** wie **Arbeitsbereich** gefiltert. Die Funktion Projektstatus liest dieselbe Einstellung: In **Arbeitsbereichsbaum** zählt die Zeile eines übergeordneten Ordners auch die Chats der Projekte darin; benennt dsh die Einstellung um, zeigt jede Zeile nur ihre eigenen Chats. **Nach Status** hat dieselbe Art von Grenze: dsh hat keinen Platz für eine Sortierung. Deshalb hängen sich der Eintrag und die Zeilenreihenfolge an das Menü- und Listen-Markup von dsh.
|
|
@@ -228,10 +236,13 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
228
236
|
- dsh hat auch keinen Erweiterungspunkt, der wählt, wo **Neue Sitzung** öffnet. **Standard-Arbeitsbereich für Neue Sitzung** umhüllt eine Methode von dsh, die keine öffentliche API ist (`startSession` des Arbeitsbereich-Dienstes von dsh). Wenn ein dsh-Update sie umbenennt, öffnet **Neue Sitzung** dort, wo dsh es wählt (das geöffnete oder das letzte Projekt). Jeder Aufruf ohne Projekt nutzt den Standard: die Schaltfläche in der Seitenleiste, ihr Tastenkürzel, das Logo und auch **Neu** auf der Seite **Automatisierungsaufgaben**. dsh öffnet beim Start weiterhin den letzten Chat. Der allgemeine Ordner wird bei der ersten Nutzung angelegt und zu deinen Projekten hinzugefügt; unter Windows oder Linux mit verschobenem Documents-Ordner kann er ein anderer Ordner als der von dsh sein.
|
|
229
237
|
- dsh hat auch für einen Hinweis im Eingabefeld keinen Erweiterungspunkt. Deshalb liegt der Text von **Vorhersage der nächsten Nachricht** über dem eigenen Platzhalter von dsh (`[data-composer-placeholder]`). Wenn ein dsh-Update dieses Markup ändert, erscheint keine Vorhersage. Solange die Funktion an ist, kostet jede beendete Runde einen kurzen Modellaufruf.
|
|
230
238
|
- Der Text von **Beim Tippen vervollständigen** erscheint über den eigenen Eingabehinweis von dsh (den Stil `--dsh-composer-hint`, den dsh für den Argumenthinweis eines Slash-Befehls nutzt). Die Funktion läuft nicht bei einem Slash-Befehl, bei einer Nachricht mit einem Datei- oder Symbol-Chip oder wenn der Cursor nicht am Ende der Nachricht steht. Wenn ein dsh-Update diesen Stil ändert, erscheint keine Vervollständigung. Jede Pause beim Tippen kostet einen Modellaufruf.
|
|
231
|
-
- **Prompt verbessern** sieht nur eine kurze Projektzusammenfassung, die geänderten Pfade und die Pfade, deren Namen zu deinen Wörtern passen: nicht den Code selbst. Daher kann die Funktion die richtige Datei übersehen, und sie nennt nur Pfade, die sie bekommen hat. Lies den neuen Text, bevor du ihn sendest. Sie läuft nicht bei einem Slash-Befehl oder bei einer Nachricht mit einem Datei- oder Symbol-Chip (der neue Text ist reiner Text, der Chip ginge also verloren), und eine Nachricht kann höchstens 8.000 Zeichen haben. Bilder bleiben angehängt: Nur der Text ändert sich. Jeder Klick kostet einen Modellaufruf; ein starkes Modell kann eine Minute brauchen (`Esc` bricht ab).
|
|
232
|
-
- **Zielprüfung** prüft nur einen Abschluss, den der Agent in einem automatischen Zieldurchlauf macht: Einen Abschluss, um den du im Chat bittest, `/goal` und die Zielleiste prüft sie nicht. Der Agent kann die Tests oder die Dateien des Testbefehls selbst ändern; der Prüfer liest den Chat und kann das sehen, kann sich aber in beide Richtungen irren (ein falsches „nicht fertig“ kostet einen Durchlauf mehr; ein falsches „fertig“ schließt das Ziel). Der Prüfer sieht den Chat und `git status`, nicht den Code selbst. Ein Testlauf wird nur wiederverwendet, wenn der neueste Schritt des Agenten, der Dateien ändern kann, sein eigener erfolgreicher `bash`-Lauf genau desselben Befehls im selben Ordner war; ein Befehl mit einer Pipe (`| tail`) oder `&&` wird nicht wiederverwendet. Das Budget wird gemessen, wenn eine Runde endet. Daher kann eine Runde darüber hinausgehen.
|
|
239
|
+
- **Prompt verbessern** sieht nur eine kurze Projektzusammenfassung, die geänderten Pfade und die Pfade, deren Namen zu deinen Wörtern passen: nicht den Code selbst. Daher kann die Funktion die richtige Datei übersehen, und sie nennt nur Pfade, die sie bekommen hat. Lies den neuen Text, bevor du ihn sendest. Sie läuft nicht bei einem anderen Slash-Befehl als `/goal <Ziel>`, bei einem Steuerwort von `/goal` (`clear`, `pause`, `resume`) oder bei einer Nachricht mit einem Datei- oder Symbol-Chip (der neue Text ist reiner Text, der Chip ginge also verloren), und eine Nachricht kann höchstens 8.000 Zeichen haben. Für ein `/goal`-Ziel schreibt sie Bedingungen nur aus dem Entwurf und dem Kontext. Eine zu strenge Bedingung kann Zieldurchläufe kosten, lies sie also, bevor du sie sendest. Bilder bleiben angehängt: Nur der Text ändert sich. Jeder Klick kostet einen Modellaufruf; ein starkes Modell kann eine Minute brauchen (`Esc` bricht ab).
|
|
240
|
+
- **Zielprüfung** prüft nur einen Abschluss, den der Agent in einem automatischen Zieldurchlauf macht: Einen Abschluss, um den du im Chat bittest, `/goal` und die Zielleiste prüft sie nicht. Der Agent kann die Tests oder die Dateien des Testbefehls selbst ändern; der Prüfer liest den Chat und kann das sehen, kann sich aber in beide Richtungen irren (ein falsches „nicht fertig“ kostet einen Durchlauf mehr; ein falsches „fertig“ schließt das Ziel). Der Prüfer sieht den Chat und `git status`, nicht den Code selbst. Ein Testlauf wird nur wiederverwendet, wenn der neueste Schritt des Agenten, der Dateien ändern kann, sein eigener erfolgreicher `bash`-Lauf genau desselben Befehls im selben Ordner war; ein Befehl mit einer Pipe (`| tail`) oder `&&` wird nicht wiederverwendet. Das Budget wird gemessen, wenn eine Runde endet. Daher kann eine Runde darüber hinausgehen. Das Token-Budget zählt auch die Aufrufe der Subagent-Chats des Chats (gelesen aus ihren gespeicherten Protokollen am Ende jeder Runde, daher dauert die Prüfung eines Chats mit vielen Subagents etwas länger). Die Nachweistabelle kommt aus der eigenen Lektüre des Chats durch den Prüfer: Einen Teil, den er bestätigt nennt, solltest du selbst ansehen, wenn er wichtig ist. `update_goal` wartet, während die Prüfung läuft (der Test höchstens 15 Minuten, der Prüfer höchstens 3 Minuten). Eine Abzweigung bekommt eine neue Chat-ID und startet daher ohne den eigenen Testbefehl und die Limits des übergeordneten Chats. Jeder Abschluss, der den Prüfer erreicht, kostet einen Modellaufruf.
|
|
241
|
+
- **Geschützte Dateien** ist eine Leitplanke, keine Sandbox. Die Funktion deckt die eigenen Datei-Tools von dsh ab (`read`, `read_image`, `grep` auf eine Datei, `write`, `edit`, `str_replace_editor`). Ein Shell-Befehl (`cat .env`), ein Skript, das der Agent schreibt, die Shell eines Subagents, ein MCP-Tool, eine `glob`-Liste und ein `grep` über einen ganzen Ordner können eine geschützte Datei trotzdem erreichen. Für eine echte Grenze nutze die Sandbox-Modi von dsh oder halte Geheimnisse aus dem Projektordner heraus. Muster kennen `*`, `**` und `?`, nicht `{a,b}` oder `[ab]`, und sie ignorieren Groß- und Kleinschreibung.
|
|
242
|
+
- **In einem neuen Chat fortsetzen** sendet den Chat (Nachrichten, Werkzeugaufrufe und das Ende jedes Werkzeugergebnisses, höchstens etwa 60.000 Zeichen, den neuesten Teil) an das eigene Modell des Chats. Die Übergabenotiz kann eine Entscheidung oder eine Datei auslassen: Lies sie vor dem Start. Der neue Chat kennt nur die Notiz und den verlinkten Chat (dsh hängt den alten Chat als schreibgeschützten Kontext an). Sein Modellkontext beginnt klein, der alte Chat bleibt, wie er ist. Pro Chat läuft immer nur eine Notiz oder ein Start.
|
|
243
|
+
- **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.
|
|
233
244
|
- **Neue Nachricht nach Stoppen zuerst** wirkt nur, nachdem du den Chat gestoppt hast (oder nach einer fehlgeschlagenen Runde, oder wenn du einen Chat öffnest, der noch eine Warteschlange hat): Eine Nachricht, die du sendest, während eine Runde läuft, wartet weiterhin am Ende der Warteschlange. Sie überholt nur deine eigenen eingereihten Nachrichten: Wartet eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange, bleibt die Reihenfolge von dsh. Die Funktion liest einen Teil von dsh, der keine öffentliche API ist (ob die gestoppte Runde noch endet); benennt ein dsh-Update ihn um, rückt die Nachricht erst vor, wenn diese Runde beendet ist. Subagent-Chats behalten die Reihenfolge von dsh.
|
|
234
|
-
- **Projektgedächtnis** gehört zum ersten Ordner des Chats (dem Projektordner von dsh): Ein Chat, der seinen Ordner mit `cd` wechselt, behält das Gedächtnis seines ersten Projekts, und derselbe Ordner, über einen anderen Pfad zu denselben Dateien geöffnet, teilt es. Ein Chat friert seinen Gedächtnisteil beim Start ein, daher erscheint eine später gespeicherte Notiz ab dem nächsten Chat (`memory_recall` findet sie sofort). Die Prüfung behält nur, was das Modell behalten will: Sie kann einen Fakt übersehen oder einen falschen behalten.
|
|
245
|
+
- **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.
|
|
235
246
|
- **Sicherung** nutzt einen einzigen festen Ordner, `~/Desktop/dsh-backups` (der Standardordner von dsh-backup, damit dessen Archive nutzbar bleiben); eine Einstellung für einen anderen Ordner gibt es nicht. Ein Archiv ist etwa so groß wie das dsh-Home ohne `cache/` und `dsh-runtimes/` (gemessen: 1,6 GB Dateien ergaben auf Apple Silicon in etwa 30 s ein Archiv von 830 MB; dsh reagierte weiter). Eine Datei, die sich beim Lesen ändert, wird so gespeichert, wie sie war, als die Sicherung sie geöffnet hat. Daher kann das Protokoll eines offenen Chats mit einem abgeschnittenen Datensatz enden, den dsh beim nächsten Schreiben repariert. Die Maskierung findet ein Geheimnis in einer yml-Datei am Namen seines Schlüssels in einer Zeile (`token:`, `apiKey:`, …); ein Geheimnis in einer Flow-Map (`{token: x}`), in einer Liste unter einem solchen Schlüssel, in einer JSON-Datei (zum Beispiel der `apiKey` eines MCP-Servers in einer `.json`-Datei) oder unter einem anderen Namen bleibt im Archiv. Die typisierten Archive von dsh-backup (`dsh-t-…`) werden nicht aufgelistet. **Für einen anderen Computer** kopiert das Archiv (unter APFS ein Klon: kein zusätzlicher Platz); der vault kommt nicht mit. **Jetzt sichern** löscht keine Sicherung. Eine automatische Sicherung behält die neuesten Sicherungen, die Composer Plus erstellt hat (die Einstellung **Behalten** von **Automatische Sicherung**), und löscht die älteren davon; Snapshots vor einem Upgrade werden getrennt gezählt (die neuesten 2 bleiben). Archive von dsh-backup werden nie gelöscht: Entferne sie mit **Löschen**. Solange dsh-backup noch installiert ist, zählt es die Archive von Composer Plus zu seiner eigenen Anzahl behaltener Sicherungen und kann sie löschen.
|
|
236
247
|
- **Wiederherstellen** läuft nur in der Rettungskonsole, während dsh geschlossen ist, und ersetzt das ganze dsh-Home. Das alte bleibt daneben als `.dsh.pre-restore-<time>`, bis du es entfernst; die Festplatte braucht also Platz für beide. Chats behalten ihre Projektpfade: Auf einem anderen Computer erscheint ein Projekt unter einem anderen Pfad als fehlend, bis du es neu hinzufügst. Symlinks, die aus dem dsh-Home hinaus zeigen (zum Beispiel Skills, die aus einem anderen Ordner verlinkt sind), kommen als Links zurück; ihre Ziele müssen auf diesem Computer existieren.
|
|
237
248
|
- **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.
|
|
@@ -264,7 +275,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
264
275
|
|
|
265
276
|
**Kann der Agent aufhören, seine eigene Arbeit als fertig zu markieren, wie bei den Prüfschleifen im Loop Engineering?** Ja, mit **Zielprüfung** (standardmäßig an): Starte ein Ziel mit `/goal`. Wenn der Agent sagt, dass das Ziel abgeschlossen ist, laufen die Tests des Projekts, und ein unabhängiger Modellaufruf prüft das Ziel anhand des Chats; schlägt eins davon fehl, bleibt das Ziel offen und der Agent liest den Grund. Lege deinen eigenen Testbefehl, ein Zeitlimit oder ein Token-Limit mit **Bearbeiten** in der Zeile **Zielprüfung** unter dem Ziel fest.
|
|
266
277
|
|
|
267
|
-
**Kann sich der Agent meine Vorlieben über Chats hinweg merken, wie das Gedächtnis von DS Bot?** Ja, mit **Projektgedächtnis** (standardmäßig aus): Schalte es unter **Einstellungen → Composer Plus** ein. Nach jeder Runde werden deine dauerhaften Vorlieben und Entscheidungen als kurze Notizen für das Projekt des Chats gespeichert, und jeder neue Chat in diesem Projekt liest sie. Bitte den Agenten, sich etwas zu merken, dann speichert er es sofort.
|
|
278
|
+
**Kann sich der Agent meine Vorlieben über Chats hinweg merken, wie das Gedächtnis von DS Bot?** Ja, mit **Projektgedächtnis** (standardmäßig aus): Schalte es unter **Einstellungen → Composer Plus** ein. Nach jeder Runde werden deine dauerhaften Vorlieben und Entscheidungen als kurze Notizen für das Projekt des Chats gespeichert, und jeder neue Chat in diesem Projekt liest sie. Bitte den Agenten, sich etwas zu merken, dann speichert er es sofort. Um die Notizen zu sehen oder zu ändern, klicke in derselben Zeile auf **Gedächtnis öffnen** und schreibe, was sich ändern soll.
|
|
268
279
|
|
|
269
280
|
**Kann dsh meine Chats und Einstellungen sichern, so wie dsh-backup?** Ja: **Einstellungen → Composer Plus → Sicherung → Jetzt sichern**. Es schreibt dasselbe Archivformat in denselben Ordner (`~/Desktop/dsh-backups`). Daher erscheinen auch die Archive von dsh-backup und lassen sich wiederherstellen, und du kannst dsh-backup entfernen. Schalte **Automatische Sicherung** ein, um nach Zeitplan zu sichern.
|
|
270
281
|
|
|
@@ -304,7 +315,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
|
|
|
304
315
|
|
|
305
316
|
**Wie bekomme ich Benachrichtigungen unter macOS / Windows, wenn eine dsh-Aufgabe fertig ist oder eine Genehmigung braucht?** Lass **Hintergrundbenachrichtigungen** an (Standard) und erlaube Benachrichtigungen für DeepSeek Harness in den Einstellungen des Betriebssystems.
|
|
306
317
|
|
|
307
|
-
**Kann dsh den Chat, der mir eine Frage stellt, von selbst öffnen?** Ja, mit **Wartenden Chat bei Inaktivität öffnen** (standardmäßig an): Wartet ein Chat auf eine Antwort, eine Genehmigung oder eine Planprüfung und du benutzt dsh 30 Sekunden lang nicht, öffnet dsh ihn. Solange du tippst, scrollst oder die Maus bewegst, wartet es.
|
|
318
|
+
**Kann dsh den Chat, der mir eine Frage stellt, von selbst öffnen?** Ja, mit **Wartenden Chat bei Inaktivität öffnen** (standardmäßig an): Wartet ein Chat auf eine Antwort, eine Genehmigung oder eine Planprüfung und du benutzt dsh 30 Sekunden lang nicht, öffnet dsh ihn. Ein Chat, der eine Runde beendet hat, die du noch nicht gelesen hast (der grüne Punkt), öffnet sich genauso, nach den orangefarbenen. Solange du tippst, scrollst oder die Maus bewegst, wartet es.
|
|
308
319
|
|
|
309
320
|
**Wie stelle ich die Oberfläche von DeepSeek Harness auf Türkisch, Spanisch, Japanisch … um?** Einstellungen → Composer Plus → **App-Sprache**.
|
|
310
321
|
|
|
@@ -343,6 +354,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
|
|
|
343
354
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
|
|
344
355
|
# Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
|
|
345
356
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
|
|
357
|
+
# Fit chat header to window (fake model, subagent + background jobs, branch pill, grants chip): no overlap from 1280 to 320 px, wide header unchanged + its thumbnail
|
|
358
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-header-fit.mjs /path/to/dsh/lib/bin.js
|
|
346
359
|
# Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
|
|
347
360
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
348
361
|
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|
package/README.es.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de eso se encarga la app).
|
|
31
31
|
|
|
32
|
-
> El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.
|
|
32
|
+
> El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.17.0`.
|
|
33
33
|
|
|
34
34
|
## Funciones
|
|
35
35
|
|
|
@@ -47,6 +47,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
47
47
|
| **Modo plan con Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` añade `/plan ` al principio del borrador (púlsalo otra vez para quitarlo). Si el chat ya está en modo plan, `Shift+Tab` sale de él. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Captura: Modo plan con Shift+Tab"></a> |
|
|
48
48
|
| **Mantener el foco en el editor** | <a id="feature-keepfocus"></a>Después de enviar un comando `/` o una skill, el cursor se queda en el editor y puedes volver a escribir enseguida. También funciona con macros de teclado que escriben un comando y pulsan `Enter`. dsh pone el editor en solo lectura mientras resuelve el comando, y entonces el navegador le quita el foco. Esta función le devuelve el foco, salvo que lo tenga un menú, un diálogo u otro campo. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Captura: Mantener el foco en el editor"></a> |
|
|
49
49
|
| **Ajustar la tarjeta de pregunta a la ventana** | <a id="feature-questionfit"></a>Cuando el agente te hace una pregunta, la pregunta y sus respuestas se desplazan juntas en la tarjeta, y **Omitir** y **Enviar** siguen a la vista abajo. La tarjeta usa la altura de la ventana (menos 200 px para la cabecera del chat y una franja del chat), así que crece y se reduce con la ventana. Sin esta función, dsh limita la tarjeta al 60 % de la ventana (520 px como máximo) y solo se desplazan las respuestas: una pregunta larga puede dejar fuera de la tarjeta su propio final, las respuestas y los botones. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Captura: Ajustar la tarjeta de pregunta a la ventana"></a> |
|
|
50
|
+
| **Ajustar la cabecera del chat a la ventana** | <a id="feature-headerfit"></a>En una ventana estrecha, los botones de la cabecera del chat de dsh (el modo, los subagentes, los trabajos en segundo plano, Abrir en, la etiqueta de rama y la etiqueta de permisos) ya no se tapan entre sí. El título del chat conserva al menos 120 px; los botones que no caben pasan a una segunda línea a la derecha, y todos se pueden pulsar. Cuando todo cabe en una línea (una ventana ancha), la cabecera es exactamente la de dsh. Sin esta función, dsh solo encoge el título: con un subagente y trabajos en segundo plano, sus botones se superponen en una columna de chat estrecha. La etiqueta de rama (**Una rama por chat**) y la de permisos (**Permitir en este chat**) también se ajustan a la cabecera con este interruptor apagado. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Captura: Ajustar la cabecera del chat a la ventana"></a> |
|
|
50
51
|
| **Continuar con un clic** | <a id="feature-continuebutton"></a>Después de un turno detenido, fallido o cortado, el editor vacío muestra **▶**. Un clic reanuda la conversación existente sin escribir en el campo de entrada ni añadir un mensaje visible al chat (el modelo recibe una breve nota oculta de “continúa desde donde te detuviste”, porque algunos proveedores, como Claude, rechazan una petición que termina con una respuesta del asistente). Los mensajes de la cola se quedan en ella: ▶ continúa solo la tarea detenida y después se ejecuta la cola. Un turno completado mantiene el botón normal de enviar. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Captura: Continuar con un clic"></a> |
|
|
51
52
|
| **Reanudar tras reiniciar** | <a id="feature-resumeafterrestart"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. Si sales de dsh (o se cierra) mientras un chat está trabajando, ese chat continúa solo cuando vuelves a abrir dsh, con la misma nota oculta que Continuar con un clic. Si había una ronda de un objetivo (`/goal`) en ejecución, el objetivo sigue con su siguiente ronda (dsh pausa los objetivos en cada inicio hasta que los reanudas). Los chats que detuviste, que terminaron o que fallaron no continúan. dsh no tiene ningún ajuste para esto: solo marca ese turno como interrumpido. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Captura: Reanudar tras reiniciar"></a> |
|
|
52
53
|
| **Arrastrar y soltar en la cola** | <a id="feature-queuereorder"></a>Los mensajes en cola tienen un asa (⠿). Arrástrala para reordenar, o pon el foco en el asa y pulsa `↑` / `↓`. `Esc` cancela. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Captura: Arrastrar y soltar en la cola"></a> |
|
|
@@ -63,19 +64,22 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
63
64
|
| **Ramas en el árbol de espacios de trabajo** | <a id="feature-branchtree"></a>Configuración → Composer Plus → **Ramas en el árbol de espacios de trabajo** (desactivado por defecto). Cada rama que tiene una carpeta de worktree en `<project>/.worktrees/` aparece entonces como un proyecto dentro de su proyecto; elige **Opciones de vista** → **Árbol de espacios de trabajo** de dsh para verla anidada. Una rama cuya carpeta se borra sale de la lista, y dsh muestra sus chats en **Sin agrupar**. Cuando el agente de un chat en la carpeta del proyecto crea una rama y cambia a ella (`git switch -c`, `git checkout -b`) sin cambios sin confirmar en la carpeta, la carpeta del proyecto vuelve a su rama anterior, la rama recibe su propia carpeta y el chat se mueve allí: una copia se abre en el proyecto de la rama y sigue con la tarea, y el chat anterior se archiva. La lista se revisa al iniciar, cada 30 segundos, después de cada turno y cuando vuelves a la ventana. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Captura: Ramas en el árbol de espacios de trabajo"></a> |
|
|
64
65
|
| **Predicción del siguiente mensaje** | <a id="feature-nextprediction"></a>Activada de forma predeterminada; puedes desactivarla en **Configuración → Composer Plus**. Cuando el agente termina un turno (no uno detenido o fallido), el editor vacío muestra en gris una predicción de tu siguiente mensaje, con la indicación **Tab para aceptar**. `Tab` pone el texto en el editor, pero no lo envía. `Esc` la oculta durante ese turno. Si empiezas a escribir, también se oculta, y un turno nuevo la sustituye. El menú **Modelo** bajo el interruptor muestra los modelos propios de dsh (la misma lista que el menú de modelos de dsh). **Predeterminado de dsh** está seleccionado de forma predeterminada y sigue el modelo predeterminado de dsh. Cada turno terminado cuesta una llamada breve al modelo. En Tether, la predicción aparece encima del editor vacío: tócala para ponerla en el campo. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Captura: Predicción del siguiente mensaje"></a> |
|
|
65
66
|
| **Completar al escribir** | <a id="feature-typingcompletion"></a>Desactivado de forma predeterminada; puedes activarlo en **Configuración → Composer Plus**. Mientras escribes, un texto gris justo después del cursor muestra cómo puede seguir tu mensaje. `Tab` lo añade al mensaje, pero no lo envía. `Esc` lo oculta. Solo sugiere tus propias palabras siguientes: nunca una respuesta para ti, ni textos de error o nombres inventados. Si el mensaje parece completo o el modelo no está seguro, no aparece nada. Si escribes las letras siguientes del texto gris, este se mantiene, sin una nueva llamada al modelo. Tiene su propio menú **Modelo** bajo su interruptor. Su primera opción, **Igual que la predicción del siguiente mensaje**, usa el modelo de **Predicción del siguiente mensaje** (es la opción predeterminada); elige otro modelo para usar uno distinto en cada función, por ejemplo un modelo más rápido para las compleciones. Hace una llamada al modelo en cada pausa mientras escribes, así que gasta muchos más tokens que la predicción: elige un modelo rápido y de bajo coste. No se ejecuta con un comando de barra, con un mensaje que tenga un chip de archivo ni cuando el cursor no está al final. En Tether, el resto aparece encima del campo mientras escribes: tócalo para añadirlo. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Captura: Completar al escribir"></a> |
|
|
66
|
-
| **Mejorar prompt** | <a id="feature-promptimprove"></a>Escribe una petición aproximada y luego haz clic en la varita mágica (**Mejorar prompt**) junto al menú de modelos. Una llamada al modelo la reescribe como un prompt más claro: primero el objetivo, pasos numerados cortos cuando hay varias partes y la comprobación que hay que ejecutar. Lee este chat (sin los mensajes revertidos), el README, AGENTS.md y el manifiesto del proyecto, los archivos modificados y los archivos cuyo nombre coincide con tus palabras, y mantiene tu idioma. Nunca inventa nombres de archivo. El texto nuevo sustituye tu borrador, pero no se envía: léelo, edítalo y luego pulsa `Enter`. `Cmd/Ctrl+Z` recupera tu texto en un solo paso, y el botón (**Deshacer mejora**) también. Si escribes mientras trabaja, tu texto nuevo se mantiene. `Esc` o un segundo clic lo cancela. Tiene su propio menú **Modelo** en Configuración (predeterminado: **Igual que el modelo del chat**). No funciona con comandos de barra ni con un mensaje que tenga un chip de archivo. En Tether, la varita está junto al campo. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Captura: Mejorar prompt"></a> |
|
|
67
|
-
| **Comprobación del objetivo** | <a id="feature-goalcheck"></a>Empieza un objetivo con `/goal`. Cuando el agente marca el objetivo como completado en una ronda automática, el objetivo solo se cierra tras dos comprobaciones. Primero, el comando de prueba del proyecto se ejecuta en la carpeta del chat, con el modo sandbox del chat. El comando es el tuyo o el que se encuentra en `package.json`, `Makefile`, `Cargo.toml`, `go.mod` o pytest. Si el paso más reciente del propio agente fue una ejecución correcta de esa prueba, no se vuelve a ejecutar. Después, una llamada independiente al modelo, sin herramientas, lee el objetivo, este chat, `git status` y el resultado de la prueba. Si una comprobación falla, el objetivo sigue activo y el agente lee
|
|
68
|
-
| **
|
|
67
|
+
| **Mejorar prompt** | <a id="feature-promptimprove"></a>Escribe una petición aproximada y luego haz clic en la varita mágica (**Mejorar prompt**) junto al menú de modelos. Una llamada al modelo la reescribe como un prompt más claro: primero el objetivo, pasos numerados cortos cuando hay varias partes y la comprobación que hay que ejecutar. Lee este chat (sin los mensajes revertidos), el README, AGENTS.md y el manifiesto del proyecto, los archivos modificados y los archivos cuyo nombre coincide con tus palabras, y mantiene tu idioma. Nunca inventa nombres de archivo. El texto nuevo sustituye tu borrador, pero no se envía: léelo, edítalo y luego pulsa `Enter`. `Cmd/Ctrl+Z` recupera tu texto en un solo paso, y el botón (**Deshacer mejora**) también. Si escribes mientras trabaja, tu texto nuevo se mantiene. `Esc` o un segundo clic lo cancela. Tiene su propio menú **Modelo** en Configuración (predeterminado: **Igual que el modelo del chat**). En un mensaje `/goal <objective>` solo reescribe el objetivo, como una condición de finalización que **Comprobación del objetivo** puede verificar: los resultados, las comprobaciones que deben pasar, la evidencia que hay que mostrar en el chat, una parte que no se puede hacer marcada como sin resolver y una parada cuando el mismo bloqueo persiste. El comando `/goal` se mantiene. No funciona con otros comandos de barra, con una palabra de control de `/goal` (`clear`, `pause`, `resume`) ni con un mensaje que tenga un chip de archivo. En Tether, la varita está junto al campo. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Captura: Mejorar prompt"></a> |
|
|
68
|
+
| **Comprobación del objetivo** | <a id="feature-goalcheck"></a>Empieza un objetivo con `/goal`. Cuando el agente marca el objetivo como completado en una ronda automática, el objetivo solo se cierra tras dos comprobaciones. Primero, el comando de prueba del proyecto se ejecuta en la carpeta del chat, con el modo sandbox del chat. El comando es el tuyo o el que se encuentra en `package.json`, `Makefile`, `Cargo.toml`, `go.mod` o pytest. Si el paso más reciente del propio agente fue una ejecución correcta de esa prueba, no se vuelve a ejecutar. Después, una llamada independiente al modelo, sin herramientas, lee el objetivo, este chat, `git status` y el resultado de la prueba. El modelo responde con una tabla de evidencias: cada parte del objetivo queda verificada, incorrecta o sin resolver, con la evidencia y la corrección; el objetivo solo se cierra cuando todas las partes están verificadas. Si una comprobación falla, el objetivo sigue activo y el agente lee cada parte abierta con su evidencia y su corrección; luego continúa la ronda siguiente. Una fila bajo la barra del objetivo (**Comprobación del objetivo**) muestra la prueba, el último resultado y cuántas partes se verificaron (pasa el puntero por encima para ver la tabla). **Editar** define tu propio comando de prueba y un límite de tiempo o de tokens; al superar el límite, el objetivo queda bloqueado. El límite de tokens también cuenta los subagentes del chat. **Ejecutar ahora** ejecuta la comprobación sin cerrar el objetivo. Tiene su propio menú **Modelo** en Configuración (predeterminado: **Igual que el modelo del chat**). Cuando completas el objetivo tú mismo, no se comprueba nada. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura: Comprobación del objetivo"></a> |
|
|
69
|
+
| **Continuar en un chat nuevo** | <a id="feature-handoffchat"></a>Haz clic derecho en un chat de la barra lateral (o abre su menú **…**) → **Continuar en un chat nuevo…**. Una llamada al propio modelo del chat escribe una nota de traspaso con lo que muestra el chat: Tarea, Resultados, Completado, Decisiones, Problemas abiertos y Siguiente acción (las llamadas a herramientas y sus resultados son la evidencia; los pasos que revertiste se omiten). La nota se abre en un diálogo: léela y edítala. **Volver a escribir** escribe una nota nueva. **Iniciar chat nuevo** (o `Cmd/Ctrl+Enter`) abre un chat nuevo en el mismo proyecto con la nota y un enlace al chat anterior como primer mensaje; el chat anterior queda como está. Úsalo cuando un chat largo esté lleno o lento, o para continuar mañana. No se escribe nada en el proyecto. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Captura: Continuar en un chat nuevo"></a> |
|
|
70
|
+
| **Desglose del contexto** | <a id="feature-contextbreakdown"></a>Barra lateral derecha → `+` → **Contexto**. La página muestra qué llena ahora el contexto del modelo del chat abierto y cuánto de la ventana de contexto usa: el prompt del sistema, las instrucciones del proyecto (AGENTS.md), las skills, tus mensajes, las respuestas del agente y las llamadas a herramientas, los resultados de herramientas (por herramienta), los resultados de MCP (por servidor), las definiciones de herramientas, el resumen de compactación y otras notas de contexto, cada uno con sus tokens y su parte. Haz clic en una parte para ver sus herramientas o servidores. Solo lee el registro del chat, después de `/compact` y de las reversiones, y no llama a ningún modelo; vuelve a leerlo después de cada turno y con **Actualizar**. Úsalo para ver por qué un chat está lento o lleno, por ejemplo por un resultado grande de una herramienta MCP o por muchas definiciones de herramientas. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Captura: Desglose del contexto"></a> |
|
|
71
|
+
| **Archivos protegidos** | <a id="feature-protectedfiles"></a>Activado de forma predeterminada. Las herramientas de archivos propias del agente no pueden leer ni cambiar los archivos que coinciden con tus patrones: `read`, `read_image` y `grep` sobre un archivo se rechazan con los patrones de **lectura y escritura**, y `write`, `edit` y `str_replace_editor` con los dos tipos. El agente lee el motivo y se le indica que te pregunte. Los patrones predeterminados son `.env*`, `*.pem` y `*.key`. Configuración → Composer Plus → **Archivos protegidos**: añade un patrón (por ejemplo `published/**` o `config/*.yml`), haz clic en su tipo para cambiar entre **lectura y escritura** y **solo escritura**, quítalo con ✕ o haz clic en **Usar los valores predeterminados**. Un patrón sin `/` coincide con un nombre de archivo en cualquier carpeta. Es una barrera de protección, no un sandbox: un comando de shell (`cat .env`), un script o una herramienta MCP aún pueden llegar al archivo (consulta Límites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Captura: Archivos protegidos"></a> |
|
|
72
|
+
| **Memoria del proyecto** | <a id="feature-projectmemory"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. Cada carpeta de proyecto tiene su propia memoria, que los chats posteriores de ese proyecto leen, como DS Bot guarda una por Bot. Después de cada turno terminado, una llamada al modelo del chat lee los mensajes nuevos (no los revertidos), guarda tus preferencias, decisiones y datos duraderos como notas breves, y cambia o elimina las antiguas. El agente también puede guardar, eliminar y buscar notas por sí mismo (`memory_remember`, `memory_forget`, `memory_recall`). Una nota también puede ser global: todos los proyectos la leen. Un chat nuevo recibe las notas en su prompt de sistema; una nota guardada después aparece desde el chat siguiente. Los archivos son Markdown en la carpeta de inicio de dsh (`storages/dsh-composer-plus/memory/`), nunca en la carpeta del proyecto. **Abrir memoria**, en la misma fila, muestra todas las notas guardadas agrupadas por proyecto (y la memoria global), con un filtro. Escribe con tus palabras qué cambiar (por ejemplo "cambié yarn por pnpm") y pulsa **Vista previa de los cambios**: el modelo predeterminado de dsh propone los cambios y solo **Aplicar** los guarda. En Tether: menú del título del chat → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura: Memoria del proyecto"></a> |
|
|
69
73
|
| **Permitir en este chat** | <a id="feature-allowforchat"></a>Cuando la revisión automática te pregunta, la tarjeta de aprobación muestra **Permitir en este chat**: a partir de entonces, la misma herramienta en el mismo chat queda permitida, con cualquier argumento, hasta que termina el límite de tiempo (1 hora por defecto; elígelo en **Configuración → Composer Plus → Permitir en este chat**). Después, el agente vuelve a preguntar. Un chip en la cabecera muestra los permisos concedidos con su hora de fin y permite revocarlos. Los permisos se mantienen tras un reinicio. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Captura: Permitir en este chat"></a> |
|
|
70
74
|
| **Estado del proyecto** | <a id="feature-projectstatus"></a>La fila de un proyecto en la barra lateral muestra el mismo indicador de en ejecución / en espera / terminado que sus chats, así que un proyecto contraído también te dice que un chat de dentro está trabajando o te necesita. Primero se muestra un chat que te espera, luego un chat terminado que aún no has abierto (el punto verde, también mientras otro chat sigue en ejecución) y luego el indicador de en ejecución. Pasa el puntero por encima para ver los detalles. En **Árbol de espacios de trabajo**, la fila de una carpeta superior también muestra los chats de cada proyecto que contiene (por ejemplo, cada carpeta de rama en `.worktrees/`), también cuando está contraída. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Estado del proyecto"></a> |
|
|
71
|
-
| **Rama de Git en las filas de chat** | <a id="feature-sessionbranch"></a>Cada fila de chat de la barra lateral muestra una pequeña etiqueta gris con la rama de git en la que estaba la carpeta del proyecto del chat en su último turno (por ejemplo `main` o `feature/login`; un HEAD separado
|
|
75
|
+
| **Rama de Git en las filas de chat** | <a id="feature-sessionbranch"></a>Cada fila de chat de la barra lateral muestra una pequeña etiqueta gris con la rama de git en la que estaba la carpeta del proyecto del chat en su último turno (por ejemplo `main` o `feature/login`; un HEAD separado no tiene rama y no muestra etiqueta). Dos chats de un mismo proyecto en ramas distintas ya no se ven iguales, y ves enseguida cuándo vas a continuar un chat en la rama equivocada. Pasa el puntero por la etiqueta para ver el nombre completo. La parte Host lee la rama (`git branch --show-current`, solo lectura) cuando un turno empieza y cuando termina; un chat sin turnos desde que instalaste esto, o una carpeta que no es un repositorio git, no muestra etiqueta. Si la fila de proyecto sobre el chat tiene el mismo nombre que la rama (por ejemplo, una carpeta de «Una rama por chat»), la fila del chat no muestra la etiqueta, pero «En una sola lista» sí la muestra. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura: Rama de Git en las filas de chat"></a> |
|
|
72
76
|
| **Marcar todo como leído** | <a id="feature-markprojectread"></a>En la barra lateral, haz clic en el botón **…** de un proyecto → **Marcar todo como leído**. Todos los chats de ese proyecto pierden su punto verde de no leído a la vez; los demás proyectos conservan los suyos. La opción aparece en gris (**No hay chats sin leer**) cuando el proyecto no tiene ninguno. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Captura: Marcar todo como leído"></a> |
|
|
73
77
|
| **Proyectos activos primero** | <a id="feature-activeprojectsfirst"></a>Cuando un chat empieza a ejecutarse o te necesita, su proyecto sube al principio de la barra lateral con la animación de filas propia de dsh (el mismo movimiento que al arrastrarlo allí). Los proyectos terminados se quedan donde están; arrástralos a donde quieras, como siempre. Los movimientos se guardan en el orden de proyectos de dsh, así que al desactivar esta función se mantiene el orden actual. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Proyectos activos primero"></a> |
|
|
74
78
|
| **Filtro de proyectos recientes** | <a id="feature-recentprojects"></a>Barra lateral → opciones de vista (icono de controles deslizantes) → **Activos en las últimas 2 horas**. Mientras está seleccionado, la barra lateral solo muestra los proyectos con un chat activo en las últimas 2 horas: un chat actualizado en ese tiempo, un chat en ejecución o en espera, el chat abierto o un chat terminado que aún no has abierto (el punto verde de “terminado” de dsh), también después de las 2 horas. Los proyectos sin un chat así se ocultan, también los nuevos y vacíos. En **Árbol de espacios de trabajo**, una carpeta superior sigue visible mientras un proyecto dentro de ella está activo, y los chats que no estuvieron activos en las últimas 2 horas también se ocultan, así que solo se muestran los chats recientes. Selecciónalo otra vez para mostrar todos los proyectos. La elección se guarda en este dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura: Filtro de proyectos recientes"></a> |
|
|
75
79
|
| **Contraer todos los proyectos** | <a id="feature-collapseprojects"></a>Mientras hay un proyecto abierto en la barra lateral, aparece un botón junto a las opciones de vista (icono de controles deslizantes). Haz clic en él para cerrar a la vez todos los proyectos abiertos, por ejemplo 3 proyectos abiertos de 5. El botón se oculta de nuevo cuando no hay ningún proyecto abierto. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Captura: Contraer todos los proyectos"></a> |
|
|
76
80
|
| **Ordenar por estado** | <a id="feature-statusorder"></a>Barra lateral → opciones de vista → **Ordenar por** → **Por estado** (con **En una sola lista**). Primero aparecen los chats terminados (el punto de “terminado” de dsh, que también recibe un turno que acabó con un error), luego los chats en ejecución o en espera, luego los chats con una automatización activa (Tareas automatizadas) y, por último, el resto en el orden de dsh. Al abrir un chat terminado, este baja. Solo cambia la vista: selecciona **Manual** o **Última actualización** para volver. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Captura: Ordenar por estado"></a> |
|
|
77
81
|
| **Notificaciones en segundo plano** | <a id="feature-notifications"></a>Mientras dsh está en segundo plano, recibes una notificación cuando un turno termina (la primera línea de la respuesta) o cuando un chat de verdad te espera: una aprobación (el nombre de la herramienta), una respuesta (la pregunta) o la revisión de un plan. Una solicitud tiene que seguir abierta 1,5 s después, así que las aprobaciones que se responden automáticamente (permisos de la revisión automática, otros plugins) no generan ningún aviso, y una notificación se retira en cuanto se responde su solicitud. La insignia del Dock o de la barra de tareas cuenta los chats en espera. Al hacer clic se abre ese chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Captura: Notificaciones en segundo plano"></a> |
|
|
78
|
-
| **Abrir el chat en espera si estás inactivo** | <a id="feature-idleswitch"></a>Cuando un chat hace una pregunta
|
|
82
|
+
| **Abrir el chat en espera si estás inactivo** | <a id="feature-idleswitch"></a>Cuando un chat hace una pregunta, espera una aprobación o una revisión del plan (el punto naranja) o termina un turno que aún no has leído (el punto verde), y no usas dsh durante 30 segundos, dsh abre ese chat. Los chats naranjas se abren antes que los verdes. En cada grupo, primero se abre el que lleva más tiempo esperando; el siguiente se abre tras otros 30 segundos sin uso. Una tecla, un clic, un movimiento del ratón, la rueda de desplazamiento o un toque reinician los 30 segundos. Texto en el campo con el foco, texto seleccionado o un menú o diálogo abierto también detienen el cambio. Mientras un chat en espera está en pantalla, nada cambia. Si sales de un chat en espera sin responder, puede volver a abrirse tras los siguientes 30 segundos sin uso. Cuando se abre un chat verde, su punto desaparece; el siguiente chat verde solo se abre después de que vuelvas a usar dsh y luego pases 30 segundos sin usarlo. También funciona con dsh en segundo plano, pero dsh no pasa al frente. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Captura: Abrir el chat en espera si estás inactivo"></a> |
|
|
79
83
|
| **Idioma de la aplicación** | <a id="feature-language"></a>Configuración → Composer Plus → **Idioma de la aplicación** cambia toda la interfaz de dsh a Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt o हिन्दी (consulta más abajo). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Captura: Idioma de la aplicación"></a> |
|
|
80
84
|
| **Conexión móvil (iPhone)** | <a id="feature-mobileconnect"></a>Usa dsh desde tu iPhone con la app [Tether](tether/), en la misma red Wi-Fi o a través de [Tailscale](https://tailscale.com). Actívala en **Configuración → Composer Plus** (está desactivada de forma predeterminada, porque abre un puerto de red en este Mac). Después haz clic en **Conexión móvil**, abajo a la izquierda de la barra lateral: escanea el código QR con la Cámara del iPhone (toca **Open in Tether**) o con **Scan code** en Tether, toca **Connect** y haz clic en **Approve**. Primero instala Tether: sin la app, la Cámara no puede abrir el código. El teléfono muestra tus chats, envía mensajes (con fotos: el **+** del editor → Camera, Photos o Paste image), responde aprobaciones y preguntas, y cambia de modelo y de agente. Empareja todos los Mac que quieras: el nombre del Mac, arriba a la izquierda en la app, te permite cambiar entre ellos. El panel **Conexión móvil** muestra los iPhone emparejados con su última conexión: **Remove** desconecta uno al instante. “Tailscale only” rechaza la red local (para una red Wi-Fi compartida), y el registro de accesos muestra quién intentó conectarse. En Tether, “Settings → Privacy” bloquea la app con Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura: Conexión móvil (iPhone)"></a> |
|
|
81
85
|
| **Actualizaciones automáticas** | <a id="feature-autoupdate"></a>Al iniciar dsh, el plugin consulta la [última versión publicada en GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Si es más reciente y ya está en npm, instala esa versión exacta con el gestor de plugins propio de dsh (el mismo camino que Configuración → Plugins) y te avisa. Reinicia dsh para cargarla. **Configuración → Composer Plus → Actualizaciones de Composer Plus** muestra la versión y tiene los botones **Buscar actualizaciones** / **Actualizar ahora**. La primera vez que dsh se inicia con la nueva versión, una ventana **Novedades de Composer Plus N** muestra una vez las notas de esa versión (de la misma comprobación de actualizaciones, sin otra llamada de red); **Cerrar** o `Esc` la cierra. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
|
|
@@ -160,7 +164,10 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
160
164
|
- **Completar al escribir:** desactivado hasta que lo actives. Mientras está activado, en cada pausa mientras escribes, la parte Host envía el texto que llevas escrito y tus propios mensajes del chat y las respuestas de texto del agente (sin salida de herramientas, sin contexto oculto ni razonamiento), como máximo unos 3.000 caracteres del chat, al modelo elegido en **Completar al escribir** (de forma predeterminada, el modelo de **Predicción del siguiente mensaje**). Una pausa más reciente detiene la petición anterior. No se guarda nada en el chat. El interruptor está en `$DSH_HOME/storages/dsh-composer-plus/complete.json` (archivo solo para el propietario).
|
|
161
165
|
- **Mejorar prompt:** no se ejecuta nada hasta que haces clic en la varita mágica. Entonces la parte Host envía tu borrador, tus propios mensajes del chat y las respuestas de texto del agente (sin salida de herramientas, sin contexto oculto, sin razonamiento ni mensajes revertidos; como máximo unos 6.000 caracteres, la parte más reciente), el mismo resumen del proyecto que **Ideas de funciones** (con las mismas reglas de archivos: sin `.env*` ni archivos de claves, sin enlaces simbólicos que salgan de la carpeta, sin FIFO), las rutas que `git status` muestra como modificadas y hasta 30 rutas con seguimiento o sin seguimiento (no ignoradas) cuyos nombres comparten palabras con tu borrador, al modelo elegido en **Mejorar prompt** (de forma predeterminada, el modelo del propio chat), en una sola petición. No se envía el contenido de ningún archivo aparte de ese resumen. No se escribe nada en el chat ni en el proyecto: la respuesta solo sustituye tu borrador en el editor, y tú decides si lo envías. El modelo elegido está en `$DSH_HOME/storages/dsh-composer-plus/improve.json` (archivo solo para el propietario).
|
|
162
166
|
- **Comprobación del objetivo:** solo se ejecuta cuando el agente marca un `/goal` como completado en una ronda automática (o cuando haces clic en **Ejecutar ahora**). La parte Host ejecuta el comando de prueba en la carpeta del chat con el modo sandbox del chat (como la propia herramienta `bash` de dsh: la misma política de acceso a archivos; si ese sandbox no puede iniciarse, la prueba no se ejecuta y la comprobación falla). Para encontrar el comando solo lee `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` y `pytest.ini`, como archivos normales dentro de la carpeta (sin enlaces simbólicos que salgan de ella, sin FIFO). Después envía el objetivo, el chat desde que empezó el objetivo (tus mensajes, las respuestas del agente, las llamadas a herramientas recortadas a 1.000 caracteres y los últimos 2.000 caracteres de cada resultado de herramienta; sin razonamiento ni pasos revertidos; como máximo unos 60.000 caracteres, la parte más reciente), `git status --short` y el final de la salida de la prueba al modelo elegido en **Comprobación del objetivo** (de forma predeterminada, el modelo del propio chat), en una sola petición sin herramientas. La salida de las herramientas puede contener lo que leyó el agente, así que esta petición puede incluir partes de tus archivos, igual que el propio chat. No se escribe nada en el chat ni en el proyecto. Tu comando de prueba, los límites, el último resultado (con el final de su salida) y el modelo elegido están en `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (archivo solo para el propietario, los 500 chats más recientes).
|
|
163
|
-
- **
|
|
167
|
+
- **Continuar en un chat nuevo:** no se ejecuta nada hasta que haces clic. Entonces la parte Host envía el chat (tal como lo lee la Comprobación del objetivo: sin razonamiento ni pasos revertidos) al modelo del propio chat y muestra la nota de traspaso; solo **Iniciar chat nuevo** crea un chat nuevo. No se escribe nada en el proyecto.
|
|
168
|
+
- **Desglose del contexto:** la parte Host solo lee el registro del chat; ninguna llamada al modelo, ningún archivo del proyecto.
|
|
169
|
+
- **Archivos protegidos:** la lista y el interruptor están en `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (archivo solo para el propietario). La comprobación solo lee la ruta de cada llamada a una herramienta de archivos (y su ruta real), nunca el archivo.
|
|
170
|
+
- **Memoria del proyecto:** desactivada hasta que la actives. Mientras está activada, después de cada turno terminado de un chat de nivel superior, la parte Host envía los mensajes nuevos del propio chat desde la última revisión (tus mensajes y las respuestas de texto del agente; sin salida de herramientas, sin razonamiento, sin contexto oculto, sin mensajes revertidos; la copia del chat padre en un chat bifurcado queda fuera; como máximo unos 16.000 caracteres) y las notas guardadas al modelo del propio chat, como una sola petición sin herramientas. Las notas son archivos Markdown en `$DSH_HOME/storages/dsh-composer-plus/memory/` (archivos solo para el propietario): `projects/<id>/` para cada carpeta de proyecto (`<id>` es un hash de la ruta real de la carpeta; `project.json` nombra la carpeta), `global/`, `journal.jsonl` (cada cambio con la línea anterior y la posterior) y `reviewed.json` (hasta dónde se leyó cada chat). No se escribe nada en la carpeta del proyecto. Se rechazan las notas que parecen una clave, un token, una contraseña o un número de identificación. Las notas de un proyecto entran en el prompt de sistema de cada chat nuevo en esa carpeta, así que llegan al modelo con cada petición de ese chat. El interruptor está en `memory.json`, en la misma carpeta. **Abrir memoria** no envía nada hasta que pulsas **Vista previa de los cambios**; entonces envía las notas que muestra y tu texto al modelo predeterminado de dsh, en una sola petición sin herramientas. Sus cambios se escriben solo con **Aplicar**, con `editor` en el registro. Tether lee y cambia las notas por la misma ruta.
|
|
164
171
|
- **Copia de seguridad:** nada sale de tu equipo. Los archivos comprimidos van a `~/Desktop/dsh-backups` (archivos solo para el propietario). Los secretos no están en un archivo comprimido: los archivos de credenciales (`.credentials.yaml`, `.env`), los archivos de claves (`.pem`, `.key`, `.p12`, `.pfx`) y los valores de los ajustes token, secret, password y API key de los archivos yml se ocultan; sus copias reales se quedan en `composer-plus-vault/<archive>/`, en la misma carpeta (solo para el propietario), solo en este equipo. **Para otro equipo** no copia ningún vault: vuelve a introducir esos secretos allí. Tus registros de chat, tus ajustes y el resto del directorio home de dsh están tal cual en el archivo comprimido: mantén la carpeta privada, igual que el propio `$DSH_HOME`. La copia de seguridad lee los archivos con `O_NOFOLLOW | O_NONBLOCK`; un enlace simbólico se guarda como enlace (nunca se sigue) y un FIFO o un dispositivo se omite. El interruptor y los ajustes de la copia de seguridad automática están en `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, el interruptor de la consola de rescate en `rescue-console.json` y, mientras dsh se ejecuta, `running/host-<pid>.json` nombra cada proceso de dsh (la consola de rescate los lee para rechazar una restauración).
|
|
165
172
|
- **Consola de rescate:** un menú de terminal; no abre ningún puerto de red. Una restauración solo escribe en una carpeta nueva junto al directorio home de dsh (archivos con `O_EXCL | O_NOFOLLOW`, enlaces simbólicos al final y nunca seguidos) y rechaza un archivo comprimido con un nombre inseguro (`..`, una ruta absoluta), un dispositivo o FIFO, más de una carpeta superior o una entrada bajo un enlace.
|
|
166
173
|
|
|
@@ -182,7 +189,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
182
189
|
- **No hay etiqueta de rama en una fila de chat:** el chat no tuvo ningún turno desde que instalaste esta versión, su carpeta no es un repositorio git o **Rama de Git en las filas de chat** está desactivada. Después de una actualización, reinicia dsh (la parte Host registra la rama).
|
|
183
190
|
- **Comprobación del objetivo dice que la prueba terminó con el código 127 o «not found»:** dsh iniciado desde el Finder o el Dock puede tener un PATH más corto que tu terminal, así que no encuentra `npm`, `pnpm` ni `cargo`. Inicia dsh desde una terminal, o define tu propio comando de prueba con la ruta completa en **Comprobación del objetivo** → **Editar**. **Ejecutar ahora** muestra el resultado al momento.
|
|
184
191
|
- **El objetivo no se cierra y el agente sigue trabajando:** **Comprobación del objetivo** encontró una prueba fallida o trabajo pendiente; la fila bajo el objetivo muestra el motivo (pasa el puntero por el resultado para ver los detalles). Corrige la causa o el comando de prueba, o completa el objetivo tú mismo con `/goal` o con la barra del objetivo (eso no se comprueba).
|
|
185
|
-
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.
|
|
192
|
+
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.17.0`); consulta la nota de instalación de más arriba.
|
|
186
193
|
- **Hacer copia ahora dice «Ya hay otra acción de copia de seguridad en curso»:** hay una acción en marcha en otra ventana de dsh o en la consola de rescate (comparten un archivo de bloqueo, `.composer-plus.lock`, en la carpeta de copias de seguridad). Espera a que termine. Si no hay ninguna acción en marcha, el siguiente clic toma el bloqueo de un proceso cerrado.
|
|
187
194
|
- **La consola de rescate dice «dsh is running»:** primero sal de dsh. Si dsh está realmente cerrado, el archivo que nombra el mensaje quedó de un cierre inesperado: elimínalo y vuelve a intentarlo.
|
|
188
195
|
- **Después de una restauración, dsh no se inicia o falta un plugin:** hay que volver a instalar los paquetes de plugins de un perfil. La consola de rescate lo ofrece después de una restauración; o ejecuta `pnpm install` en cada carpeta de `$DSH_HOME/profiles/` que indique. Los secretos que no estaban en el vault (otro equipo) hay que introducirlos de nuevo: la consola los enumera.
|
|
@@ -205,6 +212,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
205
212
|
- **Permitir en este chat** cuenta el límite de tiempo desde el momento en que se concede el permiso. Un nuevo límite de tiempo se aplica al instante a los permisos vigentes, así que uno más corto puede terminarlos al instante. Los permisos de la versión 1.12 y anteriores no tienen hora: después de la actualización, el agente vuelve a preguntar una vez por esas herramientas.
|
|
206
213
|
- **Mantener el foco en el editor** solo devuelve el foco después de un comando `/` o una skill. Mientras dsh resuelve el comando, el editor queda en solo lectura unos milisegundos, así que las teclas que pulses en ese tiempo se pierden. Si el menú `/` de dsh sigue abierto, `Enter` elige la fila resaltada y no envía.
|
|
207
214
|
- **Ajustar la tarjeta de pregunta a la ventana** cambia solo la tarjeta de pregunta de dsh, no la tarjeta de revisión del plan. Encuentra la tarjeta por el marcado de dsh (`data-question-key`, `data-question-scroll`); si una actualización de dsh cambia ese marcado, la tarjeta se ve como la dibuja dsh. La altura de la tarjeta sigue a la ventana, no al chat: en un chat dentro de un panel lateral estrecho, una tarjeta alta puede sobresalir por encima del chat.
|
|
215
|
+
- **Ajustar la cabecera del chat a la ventana** encuentra la cabecera del chat de dsh por sus nombres de clase generados (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), porque dsh no ofrece un punto de enganche para su diseño. Si una actualización de dsh los cambia, la cabecera se muestra como la dibuja dsh. En una columna de chat muy estrecha la cabecera puede ocupar dos o tres líneas, así que queda menos espacio sobre los mensajes.
|
|
208
216
|
- **Conexión móvil** solo funciona en macOS (usa `en0`, `openssl`, `swift` y `dns-sd`). Usa los puertos fijos 19390 y 19391, así que solo un dsh por Mac puede ejecutarla a la vez (cada Mac es una entrada en la lista de Mac del teléfono). El teléfono solo recibe notificaciones mientras Tether está abierta o acaba de pasar a segundo plano (no hay servicio push). Tether solo las envía después de que actives «Settings → Notifications → Send notifications» en Tether. Esta opción está desactivada de forma predeterminada, e iOS pide el permiso cuando la activas. La app de iOS aún no está en la App Store: compílala desde `tether/ios` con Xcode. «Tailscale only» sigue necesitando una dirección Wi-Fi o Ethernet en el Mac (la pasarela solo se inicia con una). El registro de accesos es propio de cada Mac y solo guarda los 200 intentos más recientes; un intento repetido en menos de un minuto suma uno a la misma fila. El bloqueo de la app Tether no oculta las vistas previas de las notificaciones en la pantalla bloqueada del iPhone: desactívalas en Ajustes de iOS. Los puntos verdes de Tether siguen al Mac: un chat que abres en dsh también pierde su punto en el teléfono. Un chat que abres en Tether pierde su punto solo en los teléfonos. El punto propio de dsh en el Mac se queda hasta que abres el chat allí.
|
|
209
217
|
- Un enlace de sesión funciona dentro de los chats; hacer clic en él no abre el chat. Un enlace creado con **Copiar enlace del mensaje** abre su mensaje solo en dsh 0.2.1 y posteriores, y solo desde un mensaje de un chat (dsh 0.2.0 no tiene reglas de texto de usuario, así que allí el enlace se copia, pero se muestra como texto normal). Un mensaje que una reversión quitó, o que la compactación eliminó del historial que carga dsh, no se puede mostrar: el enlace lo indica. Los botones 🔗 se enganchan a las filas de mensajes de dsh; si una actualización de dsh cambia ese marcado, no aparecen.
|
|
210
218
|
- **Marcar todo como leído** cambia los puntos de no leído propios de dsh mediante una parte de dsh que no es una API pública (la lista `completionUnread` del estado de sesión de dsh). Si una actualización de dsh le cambia el nombre, el elemento no aparece. El elemento va en el menú «…» del proyecto de dsh, que no tiene un espacio para plugins; si dsh cambia ese menú, el elemento tampoco aparece.
|
|
@@ -219,7 +227,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
219
227
|
- **Una rama por chat**: cuando se elimina la carpeta de la rama de un chat (`<project>/.worktrees/<name>`), por ejemplo cuando el propio agente del chat quita el worktree y elimina la rama, el siguiente paso del chat lo saca de esa carpeta. El proyecto de la carpeta de la rama desaparece de la barra lateral, y el chat aparece en Sin agrupar y sigue abierto. En dsh 0.2.1 y posteriores, el chat continúa en la carpeta principal del proyecto, y el modelo recibe una nota sobre la nueva carpeta. En dsh 0.2.0, el chat conserva la carpeta eliminada: un comando allí falla hasta que empieces un chat nuevo. El proyecto de una rama eliminada que ningún chat usa también desaparece de la barra lateral: Composer Plus revisa las carpetas de ramas al iniciar y cada 30 segundos, también sin ningún filtro de la barra lateral. Mientras un chat se mueve, **Nueva rama** en el mismo repositorio responde «inténtalo de nuevo». Con el interruptor apagado, vuelve a aparecer el error propio de dsh («working-directory: directory does not exist»).
|
|
220
228
|
- **Ramas en el árbol de espacios de trabajo** escribe en git sin un clic: cuando mueve un chat, devuelve la carpeta del proyecto a su rama anterior (`git switch`) y añade un worktree (`git worktree add`). Nunca borra una rama, un worktree ni un archivo. dsh no puede cambiar la carpeta de un chat, así que un chat movido es una copia (la bifurcación propia de dsh, con un id nuevo) y el chat anterior se archiva. La copia sigue con la tarea detenida; una llamada a herramienta que se ejecutaba cuando apareció la rama termina con un rechazo, y el agente la vuelve a ejecutar en la carpeta nueva. Un objetivo del chat anterior no se mueve con él. Solo se mueve un chat cuya carpeta es la carpeta principal del repositorio, y solo por una rama que creó y a la que cambió en ese turno (`git switch -c`, `git checkout -b`): una rama hecha solo con `git branch`, una carpeta con cambios sin confirmar, un worktree vinculado o una subcarpeta no mueven nada. En el árbol solo aparecen los worktrees que están directamente en `<project>/.worktrees/` y tienen una rama; un worktree separado (detached) o uno en otro lugar no aparece. La copia se abre sola solo cuando su chat era el abierto (el plugin lo lee de la fila de la barra lateral de dsh); si no, está en el proyecto de la rama.
|
|
221
229
|
- **Buscar en el chat** solo busca en lo que muestra la página: los mensajes y respuestas cargados (desplázate hacia arriba o haz clic en **Cargar anteriores** para ver los más antiguos), no en los pasos de herramientas cerrados ni en el texto plegado dentro de la salida de una herramienta. Cuenta como máximo 2.000 coincidencias (después, «2000+»). Usa la API de resaltado del navegador (Chromium 105 y posteriores; la app de escritorio la tiene): en un navegador más antiguo, el recuento y los saltos funcionan sin el color. `Cmd+F` en un Mac (`Ctrl+F` en Windows y Linux) solo lo abre mientras hay un chat en pantalla; en otros lugares, la búsqueda propia del navegador funciona como antes. En un Mac, `Ctrl+F` mantiene su uso de macOS en los campos de texto (el cursor avanza un carácter).
|
|
222
|
-
- **Abrir el chat en espera si estás inactivo** solo conoce lo que ve la ventana de dsh: el trabajo en otra app no cuenta, así que con dsh en segundo plano puede abrir un chat en espera a los 30 segundos. No trae dsh al frente. Leer sin pulsar una tecla, hacer clic ni mover el ratón cuenta como inactividad. Solo mira los chats con el punto naranja de dsh (una pregunta, una aprobación o una revisión del plan); la solicitud de un subagente se muestra en su chat principal. Mientras un chat en espera está en pantalla, no se abre otro; un chat que dejaste sin responder puede volver a abrirse tras los siguientes 30 segundos sin uso. Los 30 segundos no se pueden cambiar.
|
|
230
|
+
- **Abrir el chat en espera si estás inactivo** solo conoce lo que ve la ventana de dsh: el trabajo en otra app no cuenta, así que con dsh en segundo plano puede abrir un chat en espera a los 30 segundos. No trae dsh al frente. Leer sin pulsar una tecla, hacer clic ni mover el ratón cuenta como inactividad. Solo mira los chats con el punto naranja de dsh (una pregunta, una aprobación o una revisión del plan) o con su punto verde (un turno terminado que aún no has abierto); la solicitud de un subagente se muestra en su chat principal. Los chats naranjas se abren primero. Abrir un chat verde quita su punto, así que los 30 segundos del siguiente chat verde solo empiezan tras tu siguiente tecla, clic, movimiento del ratón, rueda de desplazamiento o toque: cuando vuelves, los demás puntos verdes siguen ahí. Mientras un chat en espera está en pantalla, no se abre otro; un chat que dejaste sin responder puede volver a abrirse tras los siguientes 30 segundos sin uso. Los 30 segundos no se pueden cambiar.
|
|
223
231
|
- Al hacer clic en una notificación enviada antes de un reinicio, solo se trae dsh al frente.
|
|
224
232
|
- Los proyectos activos se mueven con el orden de proyectos guardado de dsh, así que el nuevo orden se mantiene tras un reinicio. Los chats que no pertenecen a ningún proyecto («Sin agrupar») no se pueden mover; dsh siempre los muestra al final.
|
|
225
233
|
- dsh no tiene un punto de extensión en el menú de opciones de vista de la barra lateral, así que la opción de proyectos recientes se añade al menú propio de dsh. Si una actualización de dsh cambia ese menú, la opción no aparece y todos los proyectos siguen visibles. El filtro funciona sobre las filas de proyecto, así que **En una sola lista** no se filtra. En **Árbol de espacios de trabajo**, una carpeta padre sigue visible mientras un proyecto que contiene está activo, y también se ocultan las filas de chat que no estuvieron activas en las últimas 2 horas; en **Espacio de trabajo** solo se filtran las filas de proyecto. El filtro lee qué vista muestra dsh desde el ajuste de vista que dsh guarda (no es una API pública); si una actualización de dsh le cambia el nombre, **Árbol de espacios de trabajo** se filtra como **Espacio de trabajo**. La función Estado del proyecto lee el mismo ajuste: en **Árbol de espacios de trabajo**, la fila de una carpeta padre también cuenta los chats de los proyectos que contiene; si dsh cambia el nombre del ajuste, cada fila muestra solo sus propios chats. **Por estado** tiene el mismo tipo de límite: dsh no tiene un espacio para el orden, así que la opción y el orden de las filas se enganchan al marcado del menú y de la lista de dsh.
|
|
@@ -228,10 +236,13 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
228
236
|
- dsh tampoco tiene un punto de extensión que elija dónde se abre **Nueva sesión**. **Espacio de trabajo predeterminado para Nueva sesión** envuelve un método de dsh que no es una API pública (`startSession` del servicio de espacios de trabajo de dsh). Si una actualización de dsh le cambia el nombre, **Nueva sesión** se abre donde elija dsh (el proyecto abierto o el más reciente). Toda llamada que no indica un proyecto usa el predeterminado: el botón de la barra lateral, su atajo, el logotipo y también **Nueva** en la página **Tareas automatizadas**. dsh sigue abriendo el último chat al iniciar. La carpeta general se crea y se añade a tus proyectos en el primer uso; en Windows o Linux con la carpeta Documents movida puede ser otra carpeta distinta de la de dsh.
|
|
229
237
|
- dsh tampoco tiene un punto de extensión para una indicación en el editor, así que el texto de **Predicción del siguiente mensaje** se coloca sobre el texto de ejemplo propio de dsh (`[data-composer-placeholder]`). Si una actualización de dsh cambia ese marcado, no aparece ninguna predicción. Mientras está activada, cada turno terminado cuesta una llamada breve al modelo.
|
|
230
238
|
- **Completar al escribir** muestra su texto mediante la indicación propia del editor de dsh (el estilo `--dsh-composer-hint` que dsh usa para la indicación del argumento de un comando de barra). No se ejecuta con un comando de barra, con un mensaje que tenga un chip de archivo o de símbolo ni cuando el cursor no está al final del mensaje. Si una actualización de dsh cambia ese estilo, no aparece ninguna compleción. Cada pausa mientras escribes cuesta una llamada al modelo.
|
|
231
|
-
- **Mejorar prompt** solo ve un breve resumen del proyecto, las rutas modificadas y las rutas cuyos nombres coinciden con tus palabras: no el código en sí. Por eso puede pasar por alto el archivo correcto, y solo nombra rutas que recibió. Lee el texto nuevo antes de enviarlo. No se ejecuta con un comando de barra ni con un mensaje que tenga un chip de archivo o de símbolo (el texto nuevo es texto plano, así que perdería el chip), y un mensaje puede tener como máximo 8.000 caracteres. Las imágenes siguen adjuntas: solo cambia el texto. Cada clic cuesta una llamada al modelo; un modelo potente puede tardar un minuto (`Esc` lo cancela).
|
|
232
|
-
- **Comprobación del objetivo** solo comprueba una finalización que el agente hace en una ronda automática del objetivo: una finalización que pides en el chat, `/goal` y la barra del objetivo no se comprueban. El agente puede cambiar las pruebas o los archivos del comando de prueba por sí mismo; el verificador lee el chat y puede verlo, pero puede equivocarse en ambos sentidos (un «no terminado» erróneo cuesta una ronda más; un «terminado» erróneo cierra el objetivo). El verificador ve el chat y `git status`, no el código en sí. Una ejecución de prueba solo se reutiliza cuando el paso más reciente del agente que puede cambiar archivos fue su propia ejecución correcta de `bash` con exactamente el mismo comando en la misma carpeta; un comando con una tubería (`| tail`) o `&&` no se reutiliza. El presupuesto se mide cuando termina un turno, así que un turno puede superarlo.
|
|
239
|
+
- **Mejorar prompt** solo ve un breve resumen del proyecto, las rutas modificadas y las rutas cuyos nombres coinciden con tus palabras: no el código en sí. Por eso puede pasar por alto el archivo correcto, y solo nombra rutas que recibió. Lee el texto nuevo antes de enviarlo. No se ejecuta con un comando de barra que no sea `/goal <objetivo>`, con una palabra de control de `/goal` (`clear`, `pause`, `resume`) ni con un mensaje que tenga un chip de archivo o de símbolo (el texto nuevo es texto plano, así que perdería el chip), y un mensaje puede tener como máximo 8.000 caracteres. Para un objetivo de `/goal`, solo escribe condiciones a partir del borrador y del contexto; una condición demasiado estricta puede costar rondas del objetivo, así que léela antes de enviarla. Las imágenes siguen adjuntas: solo cambia el texto. Cada clic cuesta una llamada al modelo; un modelo potente puede tardar un minuto (`Esc` lo cancela).
|
|
240
|
+
- **Comprobación del objetivo** solo comprueba una finalización que el agente hace en una ronda automática del objetivo: una finalización que pides en el chat, `/goal` y la barra del objetivo no se comprueban. El agente puede cambiar las pruebas o los archivos del comando de prueba por sí mismo; el verificador lee el chat y puede verlo, pero puede equivocarse en ambos sentidos (un «no terminado» erróneo cuesta una ronda más; un «terminado» erróneo cierra el objetivo). El verificador ve el chat y `git status`, no el código en sí. Una ejecución de prueba solo se reutiliza cuando el paso más reciente del agente que puede cambiar archivos fue su propia ejecución correcta de `bash` con exactamente el mismo comando en la misma carpeta; un comando con una tubería (`| tail`) o `&&` no se reutiliza. El presupuesto se mide cuando termina un turno, así que un turno puede superarlo. El presupuesto de tokens también cuenta las llamadas de los chats de subagentes del chat (se leen de sus registros guardados al final de cada turno, así que un chat con muchos subagentes tarda un poco más en comprobarse). La tabla de evidencias viene de la propia lectura del chat que hace el verificador: una parte que marca como verificada aún necesita que la revises tú cuando importa. `update_goal` espera mientras se ejecuta la comprobación (la prueba como máximo 15 minutos, el verificador como máximo 3 minutos). Una bifurcación recibe un nuevo id de chat, así que empieza sin el comando de prueba ni los límites propios del chat original. Cada finalización que llega al verificador cuesta una llamada al modelo.
|
|
241
|
+
- **Archivos protegidos** es una barrera de protección, no un sandbox. Cubre las herramientas de archivos propias de dsh (`read`, `read_image`, `grep` en un archivo, `write`, `edit`, `str_replace_editor`). Un comando de shell (`cat .env`), un script que escribe el agente, el shell de un subagente, una herramienta MCP, un listado de `glob` y un `grep` sobre una carpeta entera aún pueden llegar a un archivo protegido. Para un límite real, usa los modos sandbox de dsh o deja los secretos fuera de la carpeta del proyecto. Los patrones conocen `*`, `**` y `?`, no `{a,b}` ni `[ab]`, y no distinguen mayúsculas de minúsculas.
|
|
242
|
+
- **Continuar en un chat nuevo** envía el chat (mensajes, llamadas a herramientas y el final de cada resultado de herramienta, como máximo unos 60.000 caracteres, la parte más reciente) al modelo del propio chat. La nota de traspaso puede omitir una decisión o un archivo: léela antes de empezar. El chat nuevo solo conoce la nota y el chat enlazado (dsh adjunta el chat anterior como contexto de solo lectura); su contexto del modelo empieza pequeño y el chat anterior se queda como está. Solo una nota o un inicio por chat a la vez.
|
|
243
|
+
- **Desglose del contexto** muestra estimaciones con la regla propia de dsh (unos 4 caracteres por token), la misma regla que usa el anillo de contexto de dsh; el recuento propio del modelo puede ser distinto. Las definiciones de herramientas son las de la petición más reciente. Muestra el contexto tal como lo tiene el registro del chat; un turno que se está ejecutando aparece después de su siguiente paso.
|
|
233
244
|
- **Prioridad al mensaje enviado tras Detener** solo actúa después de que detienes el chat (o tras un turno que falló, o al abrir un chat que aún tiene cola): un mensaje que envías mientras un turno se ejecuta sigue esperando al final de la cola. Solo pasa por delante de tus propios mensajes en cola: si en la cola espera una ronda de un objetivo o una respuesta a una pregunta, se mantiene el orden de dsh. Lee una parte de dsh que no es una API pública (si el turno detenido aún está terminando); si una actualización de dsh le cambia el nombre, el mensaje pasa delante solo cuando ese turno ha terminado. Los chats de subagentes mantienen el orden de dsh.
|
|
234
|
-
- **Memoria del proyecto** pertenece a la primera carpeta del chat (la carpeta de proyecto de dsh): un chat que cambia de carpeta con `cd` conserva la memoria de su primer proyecto, y la misma carpeta abierta por otra ruta a los mismos archivos la comparte. Un chat congela su sección de memoria al empezar, así que una nota guardada después aparece desde el chat siguiente (`memory_recall` la encuentra al momento). La revisión solo guarda lo que el modelo decide guardar: puede pasar por alto un dato o guardar uno erróneo;
|
|
245
|
+
- **Memoria del proyecto** pertenece a la primera carpeta del chat (la carpeta de proyecto de dsh): un chat que cambia de carpeta con `cd` conserva la memoria de su primer proyecto, y la misma carpeta abierta por otra ruta a los mismos archivos la comparte. Un chat congela su sección de memoria al empezar, así que una nota guardada después aparece desde el chat siguiente (`memory_recall` la encuentra al momento). La revisión solo guarda lo que el modelo decide guardar: puede pasar por alto un dato o guardar uno erróneo; revísalas en **Abrir memoria** y cámbialas allí, o edita los archivos a mano con dsh cerrado. **Abrir memoria** envía las notas del proyecto seleccionado y las notas globales (todos los proyectos si seleccionas Todas las notas; como mucho unos 60.000 caracteres, el resto solo se cuenta y no puede cambiar en esa solicitud) y tu texto al modelo predeterminado de dsh, no al modelo del chat. Una vista previa se guarda en el Mac 30 minutos y hasta que dsh se reinicia; si una revisión o el agente cambian las notas mientras tanto, **Aplicar** se niega y vuelves a pedir la vista previa. **Aplicar** guarda todos los cambios de una vista previa o ninguno: si un cambio no se puede guardar (por ejemplo, MEMORY.md está lleno), las notas quedan como estaban y se muestra el motivo. Cada turno terminado con un mensaje tuyo cuesta una llamada al modelo; una llamada fallida vuelve a leer los mismos mensajes después del turno siguiente. Los chats de subagentes no se revisan. La idea y el formato de archivo vienen de [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus no usa su código y nunca lee ni escribe la memoria propia de DS Bot.
|
|
235
246
|
- **Copia de seguridad** usa una sola carpeta fija, `~/Desktop/dsh-backups` (la predeterminada de dsh-backup, para que sus archivos comprimidos sigan sirviendo); no hay ningún ajuste para otra carpeta. Un archivo comprimido ocupa más o menos lo mismo que el directorio home de dsh sin `cache/` ni `dsh-runtimes/` (medido: 1,6 GB de archivos dieron un archivo comprimido de 830 MB en unos 30 s en Apple Silicon; dsh siguió respondiendo). Un archivo que cambia mientras se lee se guarda tal como estaba cuando la copia de seguridad lo abrió, así que el registro de un chat abierto puede terminar en una entrada cortada, que dsh repara en su siguiente escritura. El ocultamiento encuentra un secreto en un archivo yml por el nombre de su clave en una línea (`token:`, `apiKey:`, …); un secreto en un mapa de flujo (`{token: x}`), en una lista bajo una de esas claves, en un archivo JSON (por ejemplo, la `apiKey` de un servidor MCP en un archivo `.json`) o con otro nombre se queda en el archivo comprimido. Los archivos comprimidos por tipo de dsh-backup (`dsh-t-…`) no aparecen en la lista. **Para otro equipo** copia el archivo comprimido (un clon en APFS: sin espacio adicional); el vault no va con él. **Hacer copia ahora** no elimina ninguna copia de seguridad. Una copia de seguridad automática conserva las copias más recientes que hizo Composer Plus (el ajuste **Conservar** de **Copia de seguridad automática**) y elimina sus copias más antiguas; las instantáneas anteriores a una actualización se cuentan aparte (se quedan las 2 más recientes). Los archivos comprimidos de dsh-backup nunca se eliminan: quítalos con **Eliminar**. Mientras dsh-backup siga instalado, cuenta los archivos comprimidos de Composer Plus en su propio número de copias que conserva y puede eliminarlos.
|
|
236
247
|
- **Restaurar** solo funciona en la consola de rescate, con dsh cerrado: sustituye todo el directorio home de dsh. El anterior se queda a su lado como `.dsh.pre-restore-<time>` hasta que lo elimines, así que el disco necesita espacio para los dos. Los chats conservan las rutas de sus proyectos: en otro equipo, un proyecto en otra ruta aparece como ausente hasta que vuelvas a añadirlo. Los enlaces simbólicos que apuntan fuera del directorio home de dsh (por ejemplo, skills enlazadas desde otra carpeta) vuelven como enlaces; sus destinos deben existir en ese equipo.
|
|
237
248
|
- **Comprobación de registros de sesión** lee el registro más reciente de cada chat con las propias reglas de dsh sobre lo que se abre: una línea que no es JSON o que está fuera de orden solo cuenta como daño cuando después viene un final de turno (si no, dsh abre el chat sin las líneas desde ese punto, así que no aparece en la lista). No comprueba los eventos de un registro con las reglas de eventos del propio dsh, así que un registro que considera sano puede no abrirse después de una actualización de dsh. Una reparación toma la copia de una copia de seguridad: los mensajes posteriores a esa copia de seguridad se pierden en ese chat (el archivo dañado se queda a su lado). Un chat abierto en este dsh no se repara en Configuración: dsh lo tiene retenido.
|
|
@@ -264,7 +275,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
264
275
|
|
|
265
276
|
**¿Puede el agente dejar de dar por terminado su propio trabajo, como en los bucles de verificación de la loop engineering?** Sí, con **Comprobación del objetivo** (activada de forma predeterminada): empieza un objetivo con `/goal`. Cuando el agente dice que el objetivo está completado, se ejecutan las pruebas del proyecto y una llamada independiente al modelo comprueba el objetivo frente al chat; si alguna falla, el objetivo sigue abierto y el agente lee el motivo. Define tu propio comando de prueba, un límite de tiempo o un límite de tokens con **Editar** en la fila **Comprobación del objetivo** bajo el objetivo.
|
|
266
277
|
|
|
267
|
-
**¿Puede el agente recordar mis preferencias entre chats, como la memoria de DS Bot?** Sí, con **Memoria del proyecto** (desactivada de forma predeterminada): actívala en **Configuración → Composer Plus**. Después de cada turno, tus preferencias y decisiones duraderas se guardan como notas breves para el proyecto del chat, y cada chat nuevo de ese proyecto las lee. Pide al agente que recuerde algo y lo guarda al momento.
|
|
278
|
+
**¿Puede el agente recordar mis preferencias entre chats, como la memoria de DS Bot?** Sí, con **Memoria del proyecto** (desactivada de forma predeterminada): actívala en **Configuración → Composer Plus**. Después de cada turno, tus preferencias y decisiones duraderas se guardan como notas breves para el proyecto del chat, y cada chat nuevo de ese proyecto las lee. Pide al agente que recuerde algo y lo guarda al momento. Para ver o cambiar las notas, pulsa **Abrir memoria** en la misma fila y escribe qué cambiar.
|
|
268
279
|
|
|
269
280
|
**¿Puede dsh hacer copias de seguridad de mis chats y ajustes, como dsh-backup?** Sí: **Configuración → Composer Plus → Copia de seguridad → Hacer copia ahora**. Escribe el mismo formato de archivo comprimido en la misma carpeta (`~/Desktop/dsh-backups`), así que los archivos comprimidos de dsh-backup también aparecen y se pueden restaurar, y puedes desinstalar dsh-backup. Activa **Copia de seguridad automática** para hacer copias según un horario.
|
|
270
281
|
|
|
@@ -304,7 +315,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
304
315
|
|
|
305
316
|
**¿Cómo recibo notificaciones de macOS / Windows cuando una tarea de dsh termina o necesita aprobación?** Deja activada **Notificaciones en segundo plano** (lo está de forma predeterminada) y permite las notificaciones de DeepSeek Harness en los ajustes del sistema operativo.
|
|
306
317
|
|
|
307
|
-
**¿Puede dsh abrir por sí solo el chat que me hace una pregunta?** Sí, con **Abrir el chat en espera si estás inactivo** (activado por defecto): cuando un chat espera una respuesta, una aprobación o una revisión del plan y no usas dsh durante 30 segundos, dsh lo abre. Mientras escribes, te desplazas o mueves el ratón, espera.
|
|
318
|
+
**¿Puede dsh abrir por sí solo el chat que me hace una pregunta?** Sí, con **Abrir el chat en espera si estás inactivo** (activado por defecto): cuando un chat espera una respuesta, una aprobación o una revisión del plan y no usas dsh durante 30 segundos, dsh lo abre. Un chat que terminó un turno que aún no has leído (el punto verde) se abre de la misma forma, después de los naranjas. Mientras escribes, te desplazas o mueves el ratón, espera.
|
|
308
319
|
|
|
309
320
|
**¿Cómo cambio la interfaz de DeepSeek Harness a turco, español, japonés…?** Configuración → Composer Plus → **Idioma de la aplicación**.
|
|
310
321
|
|
|
@@ -343,6 +354,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
|
|
|
343
354
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
|
|
344
355
|
# Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
|
|
345
356
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
|
|
357
|
+
# Fit chat header to window (fake model, subagent + background jobs, branch pill, grants chip): no overlap from 1280 to 320 px, wide header unchanged + its thumbnail
|
|
358
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-header-fit.mjs /path/to/dsh/lib/bin.js
|
|
346
359
|
# Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
|
|
347
360
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
348
361
|
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|