dsh-composer-plus 1.23.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.de.md CHANGED
@@ -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.23.0`.
32
+ > Das pnpm von dsh überspringt Versionen, die jünger als 24 Stunden sind. Gib direkt nach einem Release die Version mit an: `dsh-composer-plus@1.24.0`.
33
33
 
34
34
  ## Funktionen
35
35
 
@@ -75,6 +75,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
75
75
  | **Geschützte Dateien** | <a id="feature-protectedfiles"></a>Standardmäßig an. Die eigenen Datei-Tools des Agenten können Dateien, die zu deinen Mustern passen, weder lesen noch ändern: `read`, `read_image` und `grep` auf eine Datei werden bei Mustern mit **Lesen und Schreiben** abgelehnt, `write`, `edit` und `str_replace_editor` bei beiden Arten. Der Agent liest den Grund und wird angewiesen, dich zu fragen. Die Standardmuster sind `.env*`, `*.pem` und `*.key`. Einstellungen → Composer Plus → **Geschützte Dateien**: Füge ein Muster hinzu (zum Beispiel `published/**` oder `config/*.yml`), klicke auf seine Art, um zwischen **Lesen und Schreiben** und **nur Schreiben** zu wechseln, entferne es mit ✕ oder klicke auf **Standardwerte verwenden**. Ein Muster ohne `/` passt auf einen Dateinamen in jedem Ordner. Das ist eine Leitplanke, keine Sandbox: Ein Shell-Befehl (`cat .env`), ein Skript oder ein MCP-Tool kann die Datei trotzdem erreichen (siehe Grenzen). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Screenshot: Geschützte Dateien"></a> |
76
76
  | **Blockierte Befehle** | <a id="feature-blockedcommands"></a>Standardmäßig an, mit einer leeren Liste. Die Shell-Befehle des Agenten (`bash`, `pwsh`) können keinen Befehl ausführen, der zu deinen Regeln passt: Eine Regel mit **blockieren** lehnt den Aufruf ab (der Agent liest den Grund und wird angewiesen, dich zu fragen), eine Regel mit **zuerst fragen** zeigt die Genehmigungskarte von dsh, und der Befehl läuft nur, wenn du ihn zulässt. Einstellungen → Composer Plus → **Blockierte Befehle**: Gib eine Regel ein (zum Beispiel `npm publish`, `git push --force` oder `ssh *192.168.2.19`), klicke auf die Art, um zwischen **blockieren** und **zuerst fragen** zu wechseln, dann auf **Hinzufügen**; klicke auf die Art einer Regel, um sie zu ändern, und entferne sie mit ✕. Eine Regel ist ein Befehlsname und Wörter, die in dieser Reihenfolge nach ihm kommen müssen; `*` passt auf beliebigen Text. Die Funktion findet den Befehl auch nach `&&`, `;`, `\|`, innerhalb von `$(…)`, `bash -c "…"` oder `eval` sowie nach `sudo` oder `env`. Das ist eine Leitplanke, keine Sandbox: Eine Variable (`$CMD`), eine Skriptdatei oder ein anderes Programm kann den Befehl trotzdem ausführen (siehe Grenzen). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Screenshot: Blockierte Befehle"></a> |
77
77
  | **Aufgabentafel** | <a id="feature-taskboard"></a>Linke Seitenleiste → **Aufgabentafel**, oder drücke überall in dsh `Cmd+Shift+K` (`Strg+Shift+K` unter Windows und Linux). Eine Kanban-Tafel deiner dsh-Chats mit dem Live-Zustand, den die Seitenleiste zeigt: Ein Chat, der auf deine Genehmigung, deine Antwort oder die Prüfung eines Plans wartet, steht mit einem orangen Punkt in **In Prüfung**, ein laufender Chat steht in **In Arbeit**, ein beendeter Chat, den du noch nicht geöffnet hast, steht in **Fertig** (grün). Wenn du einen Chat öffnest, verlässt seine Karte **Fertig** von selbst; klicke unter den grünen Karten auf **Kürzlich beendet (N)**, um die beendeten Chats zu sehen, die du gelesen hast (die 10 neuesten, dann **N ältere anzeigen**; offen oder zu bleibt auf diesem Gerät). Ein Chat, der fertig wird, während er hinter der Tafel offen ist (eine **Neue Aufgabe**), bleibt grün, bis du ihn öffnest. Klicke oben auf der Tafel auf den Projektnamen, um die Projektliste zu öffnen, und wähle ein Projekt oder **Alle Projekte**; der Ordner eines Branches pro Chat zählt zu seinem Projekt. Die Liste schließt sich nach der Auswahl, mit `Esc` oder mit einem Klick außerhalb. Tippe oben in der Liste in **Projekte durchsuchen**, um ein Projekt nach seinem Namen zu finden (Groß- und Kleinschreibung und Akzente spielen keine Rolle; `Esc` leert das Feld), drücke `Enter`, um den ersten Treffer zu wählen, und klicke auf **In den letzten 2 Stunden aktiv**, um nur Projekte mit einem Chat zu zeigen, der wartet, läuft, ungesehen fertig wurde oder sich in den letzten 2 Stunden geändert hat (bleibt auf diesem Gerät gespeichert). **Neue Aufgabe** (oder `n`) öffnet den eigenen neuen Chat von dsh in dem Projekt, das die Tafel zeigt (bei **Alle Projekte** das Projekt, das Neue Sitzung von dsh wählt), damit du wie in jedem Chat Dateien hinzufügen, Befehle nutzen und das Modell wählen kannst. Wenn deine erste Nachricht abgeht, kommt die Tafel von selbst zurück. Bis dahin wartet der Chat oben in **In Arbeit** als **Neue Aufgabe**: Klicke darauf, um die erste Nachricht zu schreiben. Ein Projekt mit einem Chat, der auf dich wartet, hat in der Projektliste einen orangen Punkt (der Projektname oben hat ihn auch, solange ein Chat wartet). dsh benennt den Chat, und das Modell des Chats schreibt aus dieser Nachricht bis zu 3 Schlagwörter. Klicke auf eine Karte, um ihren Chat zu öffnen. Klicke auf eine orange Karte (oder auf ihr **Antworten**), um direkt auf der Tafel zu antworten; das Feld hat **Chat öffnen** für den ganzen Chat: **Ablehnen** oder **Einmal zulassen**, **Genehmigen** oder **Änderungen anfordern** bei einem Plan, oder die Optionen und dein eigener Text bei einer Frage. Klicke auf einer beendeten Karte auf **×**, um sie von der Tafel zu nehmen, oder öffne **Kürzlich beendet** und klicke oben in **Fertig** auf **Alle entfernen**, um diese Karten von der Tafel zu nehmen: Zuerst zeigt ein Dialog, wie viele Karten welches Projekts gehen, und ungelesene (grüne) Karten bleiben. In den 8 Sekunden danach legt **Rückgängig** die Karten zurück; **Entfernt (N)** unter **Fertig** listet die Karten, die von der Tafel genommen sind, und **Zurücklegen** zeigt eine davon wieder in **Fertig**. Kein Chat wird gelöscht: Die Chats bleiben in der Seitenleiste von dsh, die Tafel merkt sich das auch nach einem Neustart (Tether zeigt dieselbe Tafel), und ein Chat, der wieder läuft, kommt zurück. Zeige auf eine Karte in **In Arbeit** (oder setze den Tastaturfokus darauf), um ihren Fortschritt zu sehen: wie lange der Chat läuft, den Schritt seiner To-do-Liste, das Tool, das gerade läuft, und die letzte Zeile des Agenten. Unter Einstellungen → Composer Plus → Aufgabentafel wählt **Fortschritt beim Darüberfahren** zwischen **Schnell (ohne KI)** (Standard: liest nur den Chat) und **KI-Zusammenfassung** (ein kurzer Aufruf an das Modell des Chats schreibt zusätzlich ein oder zwei Sätze). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Screenshot: Aufgabentafel"></a> |
78
+ | **Assistent** | <a id="feature-assistant"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Klicke dann in der linken Seitenleiste auf **Assistent** (direkt unter **Aufgabentafel**): Es öffnet sich ein dauerhafter Chat, den du wie einen ChatGPT- oder Grok-Chat als persönlichen Assistenten nutzt. Der erste Klick legt den Ordner `~/Assistant` an, fügt ihn als Projekt "Assistant" hinzu und startet den Chat mit dem Berechtigungsmodus workspace-write und dem Standardmodell von dsh; jeder spätere Klick öffnet denselben Chat (ein archivierter kommt zurück, ein gelöschter wird neu angelegt). Bitte ihn um eine Erinnerung („erinnere mich in 2 Minuten daran, Wasser zu trinken“): Er nutzt die geplanten Aufgaben von dsh, daher führt die Erinnerung den Chat zu dieser Zeit aus, und Tether sendet seine Benachrichtigung "Turn finished", wenn Mobile Verbindung an ist. Bitte ihn, im Web zu suchen, oder frag ihn nach deinen anderen Chats: Er kann die Chats aller Projekte auflisten (läuft, wartet auf dich oder inaktiv) und die neuesten Nachrichten eines Chats lesen. Er kann auch einem Chat eine Nachricht senden, in einem Projekt einen neuen Chat starten, einen laufenden Chat stoppen oder einen Chat archivieren: Jede dieser vier Aktionen zeigt zuerst die Genehmigungskarte von dsh (auch in Tether), und nichts passiert, bevor du auf **Einmal zulassen** klickst. Er hat kein Tool zum Löschen. Nur dieser Chat hat diese Tools und seine kurzen Anweisungen; Text, den er auf einer Webseite oder in einem anderen Chat liest, gilt als Daten, nicht als Anweisung. Speichere dein Profil im Gedächtnis dieses Projekts (**Projektgedächtnis**, Thema "profil"), statt es ihm jedes Mal zu erzählen. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Screenshot: Assistent"></a> |
78
79
  | **Projektgedächtnis** | <a id="feature-projectmemory"></a>Standardmäßig aus: Schalte die Funktion unter **Einstellungen → Composer Plus** ein. Jeder Projektordner bekommt ein eigenes Gedächtnis, das spätere Chats dieses Projekts lesen, so wie DS Bot eines pro Bot führt. Nach jeder abgeschlossenen Runde liest ein Aufruf an das Modell des Chats die neuen Nachrichten (keine zurückgenommenen), speichert deine dauerhaften Vorlieben, Entscheidungen und Fakten als kurze Notizen und ändert oder entfernt alte. Der Agent kann Notizen auch selbst speichern, entfernen und suchen (`memory_remember`, `memory_forget`, `memory_recall`). Eine Notiz kann auch global sein: Jedes Projekt liest sie. Ein neuer Chat bekommt die Notizen in seinem Systemprompt; eine später gespeicherte Notiz erscheint ab dem nächsten Chat. Die Dateien sind Markdown im dsh-Basisordner (`storages/dsh-composer-plus/memory/`), nie im Projektordner. **Gedächtnis öffnen** in derselben Zeile zeigt alle gespeicherten Notizen nach Projekt gruppiert (und das globale Gedächtnis), mit einem Filter. Schreibe in eigenen Worten, was sich ändern soll (zum Beispiel „ich nutze jetzt pnpm statt yarn“), dann **Änderungen ansehen**: Das Standardmodell von dsh schlägt die Änderungen vor, und erst **Anwenden** speichert sie. In Tether: Menü des Chat-Titels → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Screenshot: Projektgedächtnis"></a> |
79
80
  | **Versionsverlauf des Gedächtnisses** | <a id="feature-memoryhistory"></a>Standardmäßig an, solange **Projektgedächtnis** an ist. Vor jedem Speichern des Gedächtnisses (der Agent, die Prüfung nach einem Durchgang, **Gedächtnis öffnen**) wird eine Kopie der Notizen im vorherigen Zustand behalten. Wähle in **Gedächtnis öffnen** ein Projekt oder **Globales Gedächtnis** und dann **Verlauf**: die Versionen nach Datum und wer das Gedächtnis danach geändert hat. Wähle eine Version, um als Diff zu sehen, was eine Wiederherstellung ändert, dann **Wiederherstellen**. Die Notizen vor einer Wiederherstellung werden auch behalten, sodass du sie rückgängig machen kannst. Die neuesten 50 Versionen jedes Gedächtnisses bleiben. In Tether: Menü des Chat-Titels → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Screenshot: Versionsverlauf des Gedächtnisses"></a> |
80
81
  | **Gedächtnis nach AGENTS.md exportieren** | <a id="feature-memoryexport"></a>Wähle in **Gedächtnis öffnen** ein Projekt und dann **Nach AGENTS.md exportieren**: Die Notizen dieses Projekts kommen in einen markierten Abschnitt von `AGENTS.md` in seinem Ordner, damit du sie committen und mit deinem Team und anderen Agent-Tools teilen kannst. Du siehst die Änderung zuerst als Diff; nur **AGENTS.md schreiben** speichert sie. Der nächste Export ersetzt nur diesen Abschnitt. Globales Gedächtnis, Quellen und Daten bleiben draußen. In Tether: Menü des Chat-Titels → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Screenshot: Gedächtnis nach AGENTS.md exportieren"></a> |
@@ -103,7 +104,7 @@ Starte dsh danach neu. (Die CLI kann nicht in das Desktop-Profil installieren; d
103
104
  | **Options-Schaltflächen** | <a id="feature-optionpicks"></a>Wenn eine Antwort mit einer Liste von Optionen endet (eine nummerierte Liste mit 1 bis 9 Einträgen unter einer Überschrift „Optionen“ oder einer fetten Zeile „Optionen“, auch „Nächste Schritte“ und dieselben Wörter in den Sprachen der App), erscheint unter der Antwort für jede Option eine Schaltfläche. Ein Klick sendet „Option N: …“ mit der ganzen Option als Ihre Nachricht, als hätten Sie sie getippt. Die mit „(empfohlen)“ markierte Option ist hervorgehoben. Die Schaltflächen erscheinen nur unter der neuesten Antwort, solange der Chat untätig und das Eingabefeld leer ist; eine bereits gewählte Antwort und eine durch ein Zurücksetzen zurückgezogene Antwort zeigen keine. Solange sie sichtbar sind, macht die Vorhersage der nächsten Nachricht keinen Vorschlag. Auf einer Fragekarte des Agenten wählen die Tasten 1–9 diese Option wie ein Klick (nicht im Antwortfeld und nicht in den ersten 0,8 Sekunden nach dem Erscheinen der Frage). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Screenshot: Options-Schaltflächen"></a> |
104
105
  | **App-Sprache** | <a id="feature-language"></a>Einstellungen → Composer Plus → **App-Sprache** stellt die ganze dsh-Oberfläche auf Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt oder हिन्दी um (siehe unten). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Screenshot: App-Sprache"></a> |
105
106
  | **Mobile Verbindung (iPhone)** | <a id="feature-mobileconnect"></a>Nutze dsh mit der App [Tether](tether/) von deinem iPhone aus, im selben WLAN oder über [Tailscale](https://tailscale.com). Schalte die Funktion unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie einen Netzwerkport auf diesem Mac öffnet). Klicke dann unten links in der Seitenleiste auf **Mobile Verbindung**: Scanne den QR-Code mit der iPhone-Kamera (tippe auf **Open in Tether**) oder mit **Scan code** in Tether, tippe auf **Connect** und klicke auf **Approve**. Installiere Tether zuerst: Ohne die App kann die Kamera den Code nicht öffnen. Das Telefon zeigt deine Chats, sendet Nachrichten (mit Fotos: das **+** im Eingabefeld → Camera, Photos oder Paste image), beantwortet Genehmigungen und Fragen und wechselt Modelle und Agenten. Kopple so viele Macs, wie du willst: Mit dem Mac-Namen oben links in der App wechselst du zwischen ihnen. Das Panel **Mobile Verbindung** listet die gekoppelten iPhones mit ihrer letzten Verbindung auf: **Remove** trennt eines sofort. „Tailscale only“ lehnt das lokale Netzwerk ab (für ein geteiltes WLAN), und das Zugriffsprotokoll zeigt, wer sich verbinden wollte. In Tether sperrt „Settings → Privacy“ die App mit Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Screenshot: Mobile Verbindung (iPhone)"></a> |
106
- | **Remote-Computer** | <a id="feature-remotecomputers"></a>Öffne dsh auf deinen anderen Macs über [Tailscale](https://tailscale.com) und nutze sie in diesem dsh-Fenster. Schalte die Funktion auf jedem Mac unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie Netzwerkports öffnet). Schalte auf dem Mac, den du öffnen willst, **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link. Wähle auf diesem Mac in der Computerauswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein (nicht den Namen dieses Macs oder eines anderen Computers) und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach listet die Auswahl **Dieser Mac** und deine Computer auf: Wähle einen, und sein dsh füllt dieses Fenster, mit seinen eigenen Chats, seiner Seitenleiste, seinen Tools und Dateien, während dieser Mac dahinter weiterläuft. Der andere Mac zeigt dieselbe Auswahl an derselben Stelle: Wähle dort **Dieser Mac**, um zurückzukommen. Im Einstellungsbereich kannst du Computer umbenennen und entfernen. Dort siehst du auch die Computer, die diesen Mac öffnen können (**Entfernen** trennt einen sofort). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Screenshot: Remote-Computer"></a> |
107
+ | **Remote-Computer** | <a id="feature-remotecomputers"></a>Öffne dsh auf deinen anderen Macs über [Tailscale](https://tailscale.com) und nutze sie in diesem dsh-Fenster. Schalte die Funktion auf jedem Mac unter **Einstellungen → Composer Plus** ein (sie ist standardmäßig aus, weil sie Netzwerkports öffnet). Schalte auf dem Mac, den du öffnen willst, **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link. Wähle auf diesem Mac in der Computerauswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein (nicht den Namen dieses Macs oder eines anderen Computers) und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach listet die Auswahl **Dieser Mac** und deine Computer auf: Wähle einen, und sein dsh füllt dieses Fenster, mit seinen eigenen Chats, seiner Seitenleiste, seinen Tools und Dateien, während dieser Mac dahinter weiterläuft. Die Auswahl bleibt an derselben Stelle und zeigt **Zurück zu diesem Mac**: Klicke darauf, um zurückzukommen. Mit mehr als einem Computer öffnet der Klick das Menü, in dem du **Dieser Mac** oder einen anderen Computer wählst. Im Einstellungsbereich kannst du Computer umbenennen und entfernen. Dort siehst du auch die Computer, die diesen Mac öffnen können (**Entfernen** trennt einen sofort). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Screenshot: Remote-Computer"></a> |
107
108
  | **Automatische Updates** | <a id="feature-autoupdate"></a>Wenn dsh startet, prüft das Plugin das [neueste GitHub-Release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Ist es neuer und schon auf npm, installiert das Plugin genau diese Version über die eigene Plugin-Verwaltung von dsh (derselbe Weg wie Einstellungen → Plugins) und benachrichtigt dich. Starte dsh neu, um die Version zu laden. **Einstellungen → Composer Plus → Composer-Plus-Updates** zeigt die Version und hat **Nach Updates suchen** / **Jetzt aktualisieren**. Beim ersten Start von dsh mit der neuen Version zeigt ein Fenster **Neu in Composer Plus N** einmal die Release Notes dieser Version in der Sprache von **App-Sprache** (sie kommen mit der neuen Version, ohne weiteren Netzwerkaufruf; eine Sprache ohne Notes zeigt die englischen); **Schließen** oder `Esc` schließt es. Unter den Notes bittet eine Zeile um einen Stern auf GitHub, höchstens einmal in 30 Tagen (ohne Netzwerkaufruf); nach **Auf GitHub einen Stern geben** oder **Nicht mehr fragen** erscheint sie nicht mehr. Das Fenster erscheint auch nach einem Update über Einstellungen → Plugins oder einen kopierten Ordner, einmal je neuer Version; nicht bei der ersten Installation. **Neu in dieser Version** in der Update-Zeile öffnet es erneut. Liegt auf der Festplatte eine neuere Version als die laufende, bittet die Zeile um einen Neustart von dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatische Updates"></a> |
108
109
  | **An/Aus-Filter** | <a id="feature-featurefilter"></a>Neben **Funktionen suchen** unter **Einstellungen → Composer Plus**: **Alle** zeigt alle Funktionen, **An** nur die Funktionen mit eingeschaltetem Schalter und **Aus** nur die mit ausgeschaltetem Schalter. Es entscheidet der Schalter jeder Zeile, auch ein Schalter, den der Host von dsh speichert (zum Beispiel **Mobile Verbindung**). Der Filter wirkt zusammen mit der Suche: Gib ein Wort ein und wähle **Aus**, um eine Funktion zu finden, die du ausgeschaltet hast. Eine Zeile, die du umschaltest, während **An** oder **Aus** gewählt ist, bleibt, bis du wieder einen Filter wählst; so bleibt der Fokus auf ihrem Schalter. **An** und **Aus** blenden die Zeilen **App-Sprache** und **Composer-Plus-Updates** aus (sie haben keinen Schalter). Die Einstellungen öffnen sich jedes Mal mit **Alle**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Screenshot: An/Aus-Filter"></a> |
109
110
  | **Issue melden** | <a id="feature-issuereport"></a>Einstellungen → Composer Plus → **Issue melden…** (unter der Einleitung), oder Rechtsklick auf einen Chat in der Seitenleiste (oder sein Menü **…** öffnen) → **Issue zu Composer Plus melden…**. Wähle einen Typ: **Fehler**, **Funktionswunsch**, **Verbesserung**, **Übersetzung** oder **Frage**. Beschreibe es in deinen eigenen Worten und in deiner Sprache und klicke dann auf **Entwurf schreiben** (oder `Cmd/Ctrl+Enter`). Ein Aufruf an das Standardmodell von dsh schreibt ein englisches Issue: einen Titel mit dem Präfix des Typs (zum Beispiel `[Bug]`) und die Abschnitte dieses Typs (bei einem Fehler: What happened, Steps to reproduce, Expected, Actual), dazu eine Zeile mit den Versionen von Composer Plus, dsh und dem System. Lies und bearbeite den Titel und die Beschreibung; **Neu schreiben** schreibt einen neuen Entwurf. **Issue öffnen** öffnet es im GitHub-Repository von Composer Plus mit deiner Anmeldung bei GitHub CLI (`gh`) und zeigt seinen Link. Das Issue ist öffentlich: Text, der wie ein Schlüssel oder ein Passwort aussieht, wird abgelehnt. Wenn `gh` es nicht öffnen kann, öffnet **Stattdessen auf GitHub öffnen** die eigene Seite von GitHub mit dem ausgefüllten Entwurf. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Screenshot: Issue melden"></a> |
@@ -198,6 +199,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
198
199
  - **In einem neuen Chat fortsetzen:** Nichts läuft, bis du darauf klickst. Dann sendet die Host-Hälfte den Chat (so, wie die Zielprüfung ihn liest: kein Reasoning, keine zurückgenommenen Schritte) an das eigene Modell des Chats und zeigt die Übergabenotiz. Nur **Neuen Chat starten** erstellt einen neuen Chat. Ins Projekt wird nichts geschrieben.
199
200
  - **Kontextaufschlüsselung:** Die Host-Hälfte liest nur das Chatprotokoll. Kein Modellaufruf, keine Projektdatei.
200
201
  - **Aufgabentafel:** Die Tafel zeigt die Chats von dsh aus den eigenen Listen von dsh in diesem Fenster; sie fügt keine eigenen Chatdaten hinzu. **Neue Aufgabe** öffnet den eigenen neuen Chat von dsh, und du schreibst die erste Nachricht im Eingabefeld von dsh; Freigaben, die Sandbox und das Modell des Chats gelten also wie sonst. Die Host-Hälfte behält die erste Nachricht dieses Chats als Prompt der Karte und sendet sie (ihre ersten 4.000 Zeichen, sonst nichts) in einer weiteren Anfrage ohne Tools an das Modell dieses Chats, um bis zu 3 Schlagwörter zu bekommen. Prompt, Schlagwörter und Startzeit jeder Aufgabe liegen in `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (Datei nur für den Besitzer, die neuesten 2.000), dazu die IDs der Chats, die du mit **×** oder **Alle entfernen** von der Tafel genommen hast (die neuesten 5.000); der Schalter liegt daneben in `board-switch.json`. Nichts wird in einen Projektordner geschrieben. **Antworten** sendet deine Antwort an die offene Anfrage von dsh, so wie es die Karte im Chat selbst tut. Die alte Aufgabenliste früherer Versionen (`board.json`) bleibt unverändert auf der Festplatte und wird nicht gelesen. **Fortschritt beim Darüberfahren** liest das Protokoll des Chats auf diesem Mac. Mit **Schnell (ohne KI)** (Standard) wird nichts gesendet. Mit **KI-Zusammenfassung** sendet die Host-Hälfte, solange das Fortschrittsfeld einer laufenden Karte zu sehen ist (oder solange die Tafel in Tether offen ist, für bis zu 8 laufende Karten), den neuesten Teil dieses Chats (höchstens etwa 6.000 Zeichen: deine Nachrichten, die Textantworten des Agenten, seine Werkzeugaufrufe und das Ende ihrer Ergebnisse; kein Reasoning, keine zurückgenommenen Nachrichten) als eine Anfrage ohne Werkzeuge an das Modell des Chats. Erneut sendet sie erst, wenn der Chat weitergekommen ist, höchstens alle 20 Sekunden pro Chat. Die Notiz bleibt nur im Speicher; die Einstellung liegt in `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (Datei nur für den Besitzer).
202
+ - **Assistent:** Der Assistenten-Chat ist ein gewöhnlicher dsh-Chat in `~/Assistant`; seine Modellaufrufe gehen wie in jedem Chat an das Standardmodell von dsh. Seine Tools lesen die Protokolle deiner anderen Chats auf diesem Mac (Titel, Projekte, Status und mit chat_read ihre neuesten Nachrichten) und geben sie diesem Modell nur, wenn es ein Tool aufruft. Senden, Starten, Stoppen und Archivieren eines Chats warten jeweils auf deine Genehmigung. Die Chat-ID liegt in `$DSH_HOME/storages/dsh-composer-plus/assistant.json` und der Schalter in `assistant-switch.json` (Dateien nur für den Besitzer). Erinnerungen und Automatisierungen sind die eigenen geplanten Aufgaben von dsh. Nichts verlässt diesen Mac außer den Modellanfragen und den Websuchen, die der Chat macht.
201
203
  - **Geschützte Dateien:** Die Liste und der Schalter liegen in `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (Datei nur für den Besitzer). Die Prüfung liest nur den Pfad jedes Aufrufs eines Datei-Tools (und seinen echten Pfad), nie die Datei.
202
204
  - **Blockierte Befehle:** Die Regeln und der Schalter liegen in `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (Datei nur für den Besitzer). Die Prüfung liest nur den Befehlstext jedes Aufrufs von `bash` und `pwsh`; sie führt nichts aus und sendet nichts.
203
205
  - **Geheime Eingabe:** Der Wert geht von der Karte (oder von Tether über das Gateway, das keine Anfrageinhalte protokolliert) nur in der Antwortanfrage an den Host. Der Host schreibt ihn nach `$DSH_HOME/storages/dsh-composer-plus/secrets/<zufälliger Name>` (Ordner 0700, Datei 0600); nichts geht ins Projekt, ins Chatprotokoll oder ins Tool-Ergebnis. Der Host hält den Wert im Speicher, um ihn in späteren Tool-Ergebnissen dieses Chats durch `[secret]` zu ersetzen. Die Datei und diese Kopie werden am Ende des Durchgangs des Chats und beim Start von dsh gelöscht. Der Schalter liegt daneben in `secrets.json`. Ein Befehl, den der Agent mit der Datei ausführt, kann den Wert dorthin senden, wohin dieser Befehl sendet: Das ist der Zweck.
@@ -224,7 +226,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
224
226
  - **Kein Branch-Etikett an einer Chatzeile:** Die Seitenleiste ist nicht in „In einer Liste“ (in „Arbeitsbereich“ und „Arbeitsbereichsbaum“ zeigt keine Chatzeile ein Etikett), der Chat hatte seit der Installation dieser Version keine Runde, sein Ordner ist kein git-Repository, oder **Git-Branch in Chatzeilen** ist aus. Starte dsh nach einem Update neu (die Host-Hälfte zeichnet den Branch auf).
225
227
  - **Zielprüfung meldet, dass der Test mit Code 127 oder „not found“ beendet wurde:** Ein dsh, das aus dem Finder oder dem Dock gestartet wurde, kann einen kürzeren PATH als dein Terminal haben und findet daher `npm`, `pnpm` oder `cargo` nicht. Starte dsh aus einem Terminal, oder lege unter **Zielprüfung** → **Bearbeiten** deinen eigenen Testbefehl mit dem vollständigen Pfad fest. **Jetzt ausführen** zeigt das Ergebnis sofort.
226
228
  - **Das Ziel schließt sich nicht und der Agent arbeitet weiter:** **Zielprüfung** hat einen fehlschlagenden Test oder fehlende Arbeit gefunden. Die Zeile unter dem Ziel zeigt den Grund (fahre mit der Maus über das Ergebnis, um die Details zu sehen). Behebe die Ursache oder den Testbefehl, oder schließe das Ziel selbst mit `/goal` oder der Zielleiste ab (das wird nicht geprüft).
227
- - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.23.0`), siehe den Hinweis zur Installation oben.
229
+ - **Die Installation schlägt direkt nach einem Release fehl:** Gib die Version mit an (`dsh-composer-plus@1.24.0`), siehe den Hinweis zur Installation oben.
228
230
  - **Jetzt sichern meldet „Eine andere Sicherungsaktion läuft“:** Eine Aktion läuft in einem anderen dsh-Fenster oder in der Rettungskonsole (sie teilen sich eine Sperrdatei, `.composer-plus.lock`, im Sicherungsordner). Warte, bis sie fertig ist. Läuft keine Aktion, wird die Sperre eines beendeten Prozesses beim nächsten Klick übernommen.
229
231
  - **Die Rettungskonsole meldet „dsh is running“:** Beende zuerst dsh. Ist dsh wirklich geschlossen, ist die in der Meldung genannte Datei von einem Absturz übrig: Entferne sie und versuche es erneut.
230
232
  - **Nach einer Wiederherstellung startet dsh nicht oder ein Plugin fehlt:** Die Plugin-Pakete eines Profils müssen neu installiert werden. Die Rettungskonsole bietet das nach einer Wiederherstellung an; oder führe `pnpm install` in jedem Ordner unter `$DSH_HOME/profiles/` aus, den sie auflistet. Geheimnisse, die nicht im vault waren (anderer Computer), müssen neu eingegeben werden: Die Konsole listet sie auf.
@@ -258,7 +260,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
258
260
  - **Fragekarte an das Fenster anpassen** ändert nur die Fragekarte von dsh, nicht die Karte zur Planprüfung. Sie findet die Karte über das Markup von dsh (`data-question-key`, `data-question-scroll`); ändert ein dsh-Update dieses Markup, erscheint die Karte so, wie dsh sie zeichnet. Die Höhe der Karte folgt dem Fenster, nicht dem Chat: In einem Chat in einem schmalen Seitenbereich kann eine hohe Karte noch über den Chat hinausragen.
259
261
  - **Chat-Kopfzeile an Fenster anpassen** findet die Chat-Kopfzeile von dsh über ihre generierten Klassennamen (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), weil dsh dafür keinen Layout-Haken bietet. Benennt ein dsh-Update sie um, erscheint die Kopfzeile so, wie dsh sie zeichnet. In einer sehr schmalen Chat-Spalte kann die Kopfzeile zwei oder drei Zeilen belegen, sodass über den Nachrichten weniger Platz bleibt.
260
262
  - **Mobile Verbindung** funktioniert nur unter macOS (sie nutzt `en0`, `openssl`, `swift` und `dns-sd`). Sie nutzt die festen Ports 19390 und 19391. Daher kann auf jedem Mac nur ein dsh sie gleichzeitig ausführen (jeder Mac ist ein Eintrag in der Mac-Liste des Telefons). Mit einem APNs-Schlüssel in `apns.json` (siehe `tether/README.md`) sendet der Mac die Benachrichtigungen über Apples Push-Dienst, sodass sie auch bei geschlossenem Tether ankommen; der Mac muss wach sein und dsh offen. Ohne den Schlüssel bekommt das Telefon sie nur, solange Tether offen ist oder gerade in den Hintergrund gewechselt ist. Tether sendet sie erst, wenn du in Tether „Settings → Notifications → Send notifications“ einschaltest. Tether speichert den Schalter und seine Uhrzeiten für jeden gekoppelten Mac getrennt. Der Schalter ist auf jedem Mac standardmäßig aus, und iOS fragt beim Einschalten nach der Erlaubnis. Die iOS-App ist noch nicht im App Store: Baue sie mit Xcode aus `tether/ios`. „Tailscale only“ braucht trotzdem eine WLAN- oder Ethernet-Adresse auf dem Mac (das Gateway startet nur mit einer solchen Adresse). Das Zugriffsprotokoll gilt pro Mac und speichert nur die neuesten 200 Versuche. Ein wiederholter Versuch innerhalb einer Minute zählt dieselbe Zeile um eins hoch. Jede Mitteilung zeigt den Mac und das Projekt des Chats (`Studio Mac · recipe-box`), den Titel des Chats und den Text: Turn finished zeigt die letzte Antwort des Agenten. Mit dem APNs-Schlüssel geht dieser Text über Apples Push-Dienst. Die App-Sperre von Tether blendet Mitteilungsvorschauen auf dem Sperrbildschirm des iPhone nicht aus: Schalte sie in den iOS-Einstellungen aus. Die grünen Punkte in Tether folgen dem Mac: Ein Chat, den du in dsh öffnest, verliert seinen Punkt auch auf dem Telefon. Ein Chat, den du in Tether öffnest, verliert seinen Punkt nur auf den Telefonen. Der eigene Punkt von dsh auf dem Mac bleibt, bis du den Chat dort öffnest.
261
- - **Remote-Computer** braucht Tailscale auf beiden Macs und Composer Plus mit eingeschalteter Funktion auf dem Mac, den du öffnest. Dieser Mac muss wach sein, und dsh muss dort laufen. Die Auswahl erscheint nur, wenn die linke Seitenleiste offen ist (nicht, wenn sie nur Symbole zeigt). Die Seite des anderen Macs zeigt die Auswahl nur, wenn dieser Mac diese oder eine neuere Version von Composer Plus hat. Mit einer älteren Version erscheint nach einigen Sekunden oben die Schaltfläche **Zurück zu diesem Mac**. Jeder Computer, den du geöffnet hast, behält seine Seite im Speicher, bis du die Funktion ausschaltest oder dsh neu startest. In der Desktop-App ist die Seite des anderen Macs eine eingebettete Seite: Die eigenen Tastenkürzel von dsh (zum Beispiel für einen neuen Chat) funktionieren darin nicht, und auch Dateidownloads, Mikrofon und Benachrichtigungen funktionieren dort nicht. Die Funktion nutzt Port 19392 (nur ein dsh pro Mac kann andere Computer hereinlassen). Auf der Seite eines anderen Macs wechselt die Auswahl nur zwischen den Computern dieses Macs: Du kannst über den anderen Mac keinen dritten Mac öffnen.
263
+ - **Remote-Computer** braucht Tailscale auf beiden Macs und Composer Plus mit eingeschalteter Funktion auf dem Mac, den du öffnest. Dieser Mac muss wach sein, und dsh muss dort laufen. Die Auswahl erscheint nur, wenn die linke Seitenleiste offen ist (nicht, wenn sie nur Symbole zeigt). Hat die Seite des anderen Macs keine eigene Auswahl (dort Composer Plus älter als 1.23.0), zeigt sich die Auswahl dieses Macs an derselben Stelle über dieser Seite. Mit 1.23.0 dort zeigt die Auswahl den Namen des anderen Macs: Wähle in ihrem Menü **Dieser Mac**, um zurückzukommen. Jeder Computer, den du geöffnet hast, behält seine Seite im Speicher, bis du die Funktion ausschaltest oder dsh neu startest. In der Desktop-App ist die Seite des anderen Macs eine eingebettete Seite: Die eigenen Tastenkürzel von dsh (zum Beispiel für einen neuen Chat) funktionieren darin nicht, und auch Dateidownloads, Mikrofon und Benachrichtigungen funktionieren dort nicht. Die Funktion nutzt Port 19392 (nur ein dsh pro Mac kann andere Computer hereinlassen). Auf der Seite eines anderen Macs wechselt die Auswahl nur zwischen den Computern dieses Macs: Du kannst über den anderen Mac keinen dritten Mac öffnen.
262
264
  - Ein Sitzungslink funktioniert in Chats; ein Klick darauf öffnet den Chat nicht. Ein mit **Nachrichtenlink kopieren** erstellter Link öffnet seine Nachricht nur ab dsh 0.2.1 und nur aus einer Nachricht in einem Chat (dsh 0.2.0 hat keine Regeln für Benutzertext, dort wird der Link kopiert, erscheint aber als einfacher Text). Eine Nachricht, die ein Zurücknehmen entfernt hat oder die die Komprimierung aus dem Verlauf entfernt hat, den dsh lädt, kann nicht angezeigt werden: Der Link sagt das dann. Die 🔗-Schaltflächen hängen sich an die Nachrichtenzeilen von dsh. Wenn ein dsh-Update dieses Markup ändert, erscheinen sie nicht.
263
265
  - **Alle als gelesen markieren** ändert die eigenen Ungelesen-Punkte von dsh über einen Teil von dsh, der keine öffentliche API ist (die Liste `completionUnread` im Sitzungsstatus von dsh). Wenn ein dsh-Update sie umbenennt, erscheint der Eintrag nicht. Der Eintrag kommt in das „…“-Menü des Projekts in dsh, das keinen Platz für Plugins hat. Wenn dsh dieses Menü ändert, erscheint der Eintrag ebenfalls nicht.
264
266
  - **Eingereihte Nachricht direkt bearbeiten** ändert keine Nachricht, deren Senden inzwischen begonnen hat, und überschreibt keine Nachricht, die sich inzwischen geändert hat (zum Beispiel in Tether auf dem iPhone): Ein Hinweis meldet das. Ein neues Bild braucht ein Modell, das Bilder annimmt (die eigenen Bildgrenzen von dsh gelten), und eine neue Datei muss fertig hochgeladen sein, bevor du speichern kannst. Nur deine eigenen eingereihten Nachrichten lassen sich bearbeiten: Eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange nicht. Nach einem Update des Plugins funktionieren nur Textänderungen sofort: Starte dsh neu, bevor du eine Nachricht mit Bildern oder Dateien speicherst (die Host-Hälfte lädt beim Start).
@@ -294,6 +296,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
294
296
  - **Türkisches Skill-Paket** installiert einen Skill von Dritten: Seine Regeln kommen aus dem GitHub-Repository des Autors, nicht von Composer Plus, und eine neue Version gilt ab der nächsten täglichen Prüfung, ohne dass wir sie prüfen. Die Prüfung beweist, dass die Dateien die sind, die GitHub für diesen Commit auflistet, nicht dass die Regeln gut sind. Das Modell entscheidet, wann es den Skill lädt (du kannst ihn auch mit Namen aufrufen); die Regeln gelten nur für türkische Texte. Die Host-Hälfte nutzt die Sprache, die ein Browser zuletzt gemeldet hat: Nutzen zwei Browser verschiedene Sprachen, gilt die neueste Meldung. GitHub erlaubt ohne Anmeldung 60 API-Aufrufe pro Stunde; eine abgelehnte Prüfung behält die installierte Kopie und zeigt den Grund in den Einstellungen.
295
297
  - **Codebasis entwirren** enthält eine feste Kopie des Skills (caldoai/skills, Commit f3cf477): Eine Änderung im Original kommt erst mit einer neuen Composer-Plus-Version. Der Skill führt ein langes Ziel aus, das viele Dateien ändern kann, und seine Subagenten und Prüfungen verbrauchen viele Tokens. Wo das Projekt keine Tests hat, kann er das Verhalten unbemerkt ändern: Starte ihn in einem Branch und lies den Diff vor dem Merge. Ein Skill mit demselben Namen im Projekt, in einem eigenen Skill-Ordner oder in `~/.dsh/skills` ersetzt ihn. Solange der Schalter aus ist, geht `/untangle-codebase` als normaler Text an das Modell.
296
298
  - **Aufgabentafel** zeigt die Chats, die dsh in diesem Fenster auflistet: Ein Chat außerhalb eines Projekts erscheint nur unter **Alle Projekte**, und der Ordner eines Branches pro Chat (`<project>/.worktrees/<name>`) zählt zu seinem Projekt. Die Spalte einer Karte ist der Live-Zustand des Chats, daher lassen sich Karten nicht ziehen: Ein Chat kommt nach **Fertig**, wenn seine Runde endet, auch nach einem Fehler oder einem Stopp, und zurück nach **In Arbeit**, wenn er wieder läuft. Der grüne Punkt ist der Fertig-Punkt von dsh, den dsh nur in diesem Fenster behält: Nach einem Neuladen erscheinen beendete Chats ohne ihn. **Fertig** zeigt die neuesten 50 Chats (**N ältere anzeigen** zeigt den Rest). **Projekte durchsuchen** findet ein Projekt nur über seinen Namen, nicht über seinen Ordnerpfad. **In den letzten 2 Stunden aktiv** blendet ein Projekt aus, wenn jeder seiner Chats älter als 2 Stunden, inaktiv und gelesen ist; die Tafel zeigt das Projekt, das du gewählt hast, weiterhin. **Neue Aufgabe** merkt sich nur den neuesten neuen Chat dieses Fensters: Wenn du vor der ersten Nachricht einen anderen Chat öffnest, bleibt dieser Chat als **Neue Aufgabe** oben in **In Arbeit**, bis du darin schreibst, aber die Tafel kommt nur für den neuesten von selbst zurück. Nach einem Neuladen steht ein neuer Chat ohne Nachricht nicht auf der Tafel (dsh behält ihn als seine leere Neue Sitzung). Die Schlagwörter kommen aus einem Modellaufruf pro Aufgabe, aus ihrer ersten Nachricht: Sie können falsch sein, und ein Chat, den du nicht auf der Tafel gestartet hast, hat keine. Der Titel ist der Chattitel von dsh (der Titeldienst von dsh, mit dem Modell des Chats); bis er da ist, zeigt die Karte die erste Zeile der ersten Nachricht. **×** und **Alle entfernen** nehmen Karten nur von der Tafel: Kein Chat wird gelöscht. **Rückgängig** erscheint nur 8 Sekunden lang, in diesem Fenster; später holt **Entfernt (N)** → **Zurücklegen** eine Karte zurück, und ein Chat, der wieder läuft, kommt von selbst zurück. **Alle entfernen** fragt zuerst und nimmt die gelesenen fertigen Karten des gezeigten Projekts von der Tafel (bei **Alle Projekte** die aller Projekte), auch die hinter **N ältere anzeigen**; eine ungelesene (grüne) Karte bleibt. dsh behält seinen grünen Punkt nur in diesem Fenster, daher kann Alle entfernen nach einem Neuladen eine Karte nehmen, deren Antwort du nicht gelesen hast. Die Liste liegt auf diesem Mac, für jedes Fenster und für Tether; wenn sie 5.000 Chats hat, kommen die ältesten zurück. **Antworten** beantwortet nur die neueste Anfrage des Chats: Wenn sie an anderer Stelle beantwortet wurde (ein anderes Fenster, Tether, die automatische Prüfung) oder der Chat etwas Neues fragt, sagt das Panel das und sendet nichts. Frühere Versionen hatten eine Aufgabenliste mit Kommentaren und Agenten-Tools; diese gibt es nicht mehr, und die alte `board.json` wird nicht angezeigt. Die Idee und das Aussehen stammen von [Kanzo](https://github.com/emanuele-em/kanzo) von emanuele-em (AGPL-3.0); Composer Plus nutzt keinen Code daraus. `Cmd+Shift+K` ist ein dsh-Tastenkürzel: Im Browser unter Linux hat es keine Standardtaste (lege eine auf der Seite Tastenkürzel von dsh fest), und eine Browser-Erweiterung oder eine andere App kann die Taste vorher belegen. Eine Karte verlässt **Fertig**, wenn der grüne Punkt von dsh verschwindet (du hast den Chat geöffnet), oder, bei einem Chat, der hinter der Tafel als offener Chat fertig wurde, wenn dieser Chat ohne Panel darüber zu sehen ist. Dieser Gelesen-Zustand lebt nur in diesem dsh-Fenster, wie die Punkte von dsh: Nach einem Neuladen oder in einem anderen Fenster zählt jeder beendete Chat als gelesen und steht in **Kürzlich beendet**.
299
+ - **Assistent** hat einen Chat für alle Fenster dieses Macs. Er läuft mit dem Berechtigungsmodus workspace-write: Er schreibt Dateien nur in `~/Assistant`, und ein Befehl außerhalb dieses Ordners fragt zuerst. Wenn du den Chat auf einen Modus ohne Genehmigungen (Vollzugriff) umstellst, lehnt dsh jede Genehmigung ab. Dann kann der Assistent keinem Chat eine Nachricht senden und keinen Chat starten, stoppen oder archivieren. Die Genehmigungskarte schützt nur die sechs Tools: Ein Shell-Befehl des Assistenten kann weiterhin das Netzwerk erreichen, wie in jedem Chat mit diesem Modus. Unter dsh 0.2.0 und 0.2.1 sehen die Planungs-Tools von dsh nur die Erinnerungen des Assistenten-Chats selbst, nicht die Automatisierungen anderer Chats; ab dsh 0.2.2 listen und ändern sie jede geplante Aufgabe. chats_list lässt archivierte, leere und Subagent-Chats sowie den Assistenten-Chat selbst weg; „wartet auf dich“ bedeutet eine offene Genehmigung, Frage oder Planprüfung in einem laufenden Chat. chat_read liefert die Nachrichten des Benutzers und die Antworten des Agenten (keine Tool-Ausgabe), höchstens 50 Nachrichten und etwa 24.000 Zeichen. chat_archive lehnt einen Chat ab, der noch läuft oder aktive Erinnerungen hat. Ein Text, den das Modell liest, kann es trotzdem täuschen: Die Genehmigungskarte ist die letzte Prüfung, also lies sie, bevor du auf **Einmal zulassen** klickst.
297
300
  - **Neue Nachricht nach Stoppen zuerst** wirkt nur, nachdem du den Chat gestoppt hast (oder nach einer fehlgeschlagenen Runde, oder wenn du einen Chat öffnest, der noch eine Warteschlange hat): Eine Nachricht, die du sendest, während eine Runde läuft, wartet weiterhin am Ende der Warteschlange. Sie überholt nur deine eigenen eingereihten Nachrichten: Wartet eine Zielrunde oder eine Antwort auf eine Frage in der Warteschlange, bleibt die Reihenfolge von dsh. Die Funktion liest einen Teil von dsh, der keine öffentliche API ist (ob die gestoppte Runde noch endet); benennt ein dsh-Update ihn um, rückt die Nachricht erst vor, wenn diese Runde beendet ist. Subagent-Chats behalten die Reihenfolge von dsh.
298
301
  - **Projektgedächtnis** gehört zum ersten Ordner des Chats (dem Projektordner von dsh): Ein Chat, der seinen Ordner mit `cd` wechselt, behält das Gedächtnis seines ersten Projekts, und derselbe Ordner, über einen anderen Pfad zu denselben Dateien geöffnet, teilt es. Ein Chat friert seinen Gedächtnisteil beim Start ein, daher erscheint eine später gespeicherte Notiz ab dem nächsten Chat (`memory_recall` findet sie sofort). Die Prüfung behält nur, was das Modell behalten will: Sie kann einen Fakt übersehen oder einen falschen behalten. Prüfe sie in **Gedächtnis öffnen** und ändere sie dort, oder bearbeite die Dateien von Hand, während dsh geschlossen ist. **Gedächtnis öffnen** schickt die Notizen des gewählten Projekts und die globalen Notizen (alle Projekte, wenn du Alle Notizen wählst; höchstens etwa 60.000 Zeichen, der Rest wird nur gezählt und kann in dieser Anfrage nicht geändert werden) und deinen Text an das Standardmodell von dsh, nicht an das Modell des Chats. Eine Vorschau bleibt 30 Minuten und bis zum Neustart von dsh auf dem Mac; ändern eine Prüfung oder der Agent die Notizen in der Zwischenzeit, lehnt **Anwenden** ab und du holst eine neue Vorschau. **Anwenden** speichert alle Änderungen einer Vorschau oder keine: Lässt sich eine Änderung nicht speichern (zum Beispiel, weil MEMORY.md voll ist), bleiben die Notizen, wie sie waren, und der Grund wird angezeigt. Jede abgeschlossene Runde mit einer Nachricht von dir kostet einen Modellaufruf; ein fehlgeschlagener Aufruf liest dieselben Nachrichten nach der nächsten Runde erneut. Chats von Subagenten werden nicht geprüft. Die Idee und das Dateiformat stammen von [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus nutzt keinen Code daraus und liest oder schreibt nie das eigene Gedächtnis von DS Bot.
299
302
  - **Versionsverlauf des Gedächtnisses** behält die neuesten 50 Versionen jedes Gedächtnisses (jedes Projekt und das globale Gedächtnis); ältere werden gelöscht. Eine Version enthält das ganze Gedächtnis dieses Projekts, nicht eine Notiz. **Wiederherstellen** setzt alle Dateien dieser Version zurück (Themen eingeschlossen) und lehnt ab, wenn sich das Gedächtnis nach dem Öffnen der Version geändert hat; das Gedächtnis vor der Wiederherstellung wird eine neue Version, sodass du sie rückgängig machen kannst. Solange der Schalter aus ist, wird keine neue Version behalten und **Wiederherstellen** lehnt ab; behaltene Versionen bleiben. Versionen von vor dieser Funktion gibt es nicht: Der Verlauf beginnt mit dem ersten Speichern nach der Installation.
@@ -347,6 +350,8 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
347
350
 
348
351
  **Kann ich alle meine Chats als Kanban-Tafel sehen und von dort neue starten?** Ja, mit **Aufgabentafel** (standardmäßig an): Öffne sie in der linken Seitenleiste. Jeder Chat ist eine Karte in **In Arbeit**, **In Prüfung** (er wartet auf dich) oder **Fertig**. **Neue Aufgabe** öffnet den neuen Chat von dsh im Projekt, und die Tafel kommt zurück, wenn deine erste Nachricht abgeht; klicke auf einer orangen Karte auf **Antworten**, um zu antworten, ohne den Chat zu öffnen. **Alle entfernen** in **Fertig** fragt zuerst und nimmt die fertigen Karten, die du gelesen hast, von der Tafel; **Rückgängig** und **Entfernt (N)** holen sie zurück, und die Chats bleiben in dsh.
349
352
 
353
+ **Kann ich einen persönlichen Assistenten-Chat haben, der mich erinnert und meine anderen Chats verwaltet?** Ja, mit **Assistent** (standardmäßig aus): Schalte ihn unter Einstellungen → Composer Plus ein und klicke dann in der linken Seitenleiste auf **Assistent**. Er legt Erinnerungen mit den geplanten Aufgaben von dsh an, sucht im Web, listet und liest deine Chats und sendet einem Chat eine Nachricht oder startet, stoppt oder archiviert einen Chat erst, nachdem du es genehmigt hast. Speichere dein Profil im Gedächtnis seines Projekts, Thema "profil".
354
+
350
355
  **Kann dsh meine Chats und Einstellungen sichern, so wie dsh-backup?** Ja: **Einstellungen → Composer Plus → Sicherung → Jetzt sichern**. Es schreibt dasselbe Archivformat in denselben Ordner (`~/Desktop/dsh-backups`). Daher erscheinen auch die Archive von dsh-backup und lassen sich wiederherstellen, und du kannst dsh-backup entfernen. Schalte **Automatische Sicherung** ein, um nach Zeitplan zu sichern.
351
356
 
352
357
  **dsh startet nicht mehr. Wie stelle ich eine Sicherung wieder her?** Öffne den Sicherungsordner (`~/Desktop/dsh-backups`) und doppelklicke auf `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Wähle `3) Restore a backup`, wähle eine Sicherung aus und tippe `RESTORE`. Das funktioniert ohne dsh.
@@ -389,7 +394,7 @@ Getestet mit dsh `0.2.0-rc.2` (Desktop und Web) und `0.2.1-rc.2` (Web). Die CI f
389
394
 
390
395
  **Ich habe mein iPhone verloren. Wie verhindere ich, dass es meinen Mac erreicht?** Klicke unten links in der Seitenleiste auf **Mobile Verbindung** und dann neben diesem iPhone auf **Remove**. Sein Schlüssel funktioniert sofort nicht mehr. Es kann nur mit einer neuen Kopplung zurückkommen, die du auf dem Mac bestätigst.
391
396
 
392
- **Wie setze ich einen Chat meines anderen Macs auf diesem Mac fort?** Schalte auf dem anderen Mac **Einstellungen → Composer Plus → Remote-Computer** und **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link (schicke ihn dir selbst, zum Beispiel mit AirDrop oder Notizen). Schalte auf diesem Mac ebenfalls **Remote-Computer** ein, wähle in der Auswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach wählst du diesen Computer im selben Menü: Er füllt dieses Fenster. Wähle an derselben Stelle **Dieser Mac**, um zurückzukommen. Die Chats dieses Macs laufen in der Zwischenzeit weiter.
397
+ **Wie setze ich einen Chat meines anderen Macs auf diesem Mac fort?** Schalte auf dem anderen Mac **Einstellungen → Composer Plus → Remote-Computer** und **Anderen Computern erlauben, diesen Mac zu öffnen** ein, klicke auf **Kopplungslink erstellen** und kopiere den Link (schicke ihn dir selbst, zum Beispiel mit AirDrop oder Notizen). Schalte auf diesem Mac ebenfalls **Remote-Computer** ein, wähle in der Auswahl der linken Seitenleiste (rechts neben dem Markennamen, über **Neue Sitzung**) **Computer hinzufügen…**, füge den Link ein, gib unter **Name** einen Namen ein und klicke auf **Verbinden**. Klicke dann auf dem anderen Mac auf **Genehmigen**. Danach wählst du diesen Computer im selben Menü: Er füllt dieses Fenster. Klicke an derselben Stelle auf **Zurück zu diesem Mac**, um zurückzukommen. Die Chats dieses Macs laufen in der Zwischenzeit weiter.
393
398
 
394
399
  **Kann ich Tether mit Face ID sperren?** Ja: Schalte in Tether „Settings → Privacy → Lock with Face ID“ ein. Tether fragt dann beim Öffnen und bei der Rückkehr zur App nach Face ID (oder dem Code).
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```sh
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.23.0`.
32
+ > El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.24.0`.
33
33
 
34
34
  ## Funciones
35
35
 
@@ -75,6 +75,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
75
75
  | **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> |
76
76
  | **Comandos bloqueados** | <a id="feature-blockedcommands"></a>Activado de forma predeterminada, con una lista vacía. Los comandos de shell del agente (`bash`, `pwsh`) no pueden ejecutar un comando que coincida con tus reglas: una regla **bloquear** rechaza la llamada (el agente lee el motivo y se le indica que te pregunte), una regla **preguntar antes** muestra la tarjeta de aprobación de dsh, y el comando solo se ejecuta cuando tú lo permites. Configuración → Composer Plus → **Comandos bloqueados**: escribe una regla (por ejemplo `npm publish`, `git push --force` o `ssh *192.168.2.19`), haz clic en el tipo para cambiar entre **bloquear** y **preguntar antes** y luego haz clic en **Añadir**; haz clic en el tipo de una regla para cambiarlo y quítala con ✕. Una regla es un nombre de comando y palabras que deben venir después de él en este orden; `*` coincide con cualquier texto. La comprobación también encuentra el comando después de `&&`, `;`, `\|`, dentro de `$(…)`, `bash -c "…"` o `eval`, y después de `sudo` o `env`. Es una barrera de protección, no un sandbox: una variable (`$CMD`), un archivo de script u otro programa aún pueden ejecutar el comando (consulta Límites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Captura: Comandos bloqueados"></a> |
77
77
  | **Tablero de tareas** | <a id="feature-taskboard"></a>Barra lateral izquierda → **Tablero de tareas**, o pulsa `Cmd+Shift+K` (`Ctrl+Shift+K` en Windows y Linux) en cualquier lugar de dsh. Un tablero kanban de tus chats de dsh con el estado en vivo que muestra la barra lateral: un chat que espera tu aprobación, tu respuesta o la revisión de un plan está en **En revisión** con un punto naranja, un chat en ejecución está en **En curso** y un chat terminado que aún no abriste está en **Hecho** (verde). Cuando abres un chat, su tarjeta sale de **Hecho** por sí sola; haz clic en **Terminados hace poco (N)**, debajo de las tarjetas verdes, para ver los chats terminados que ya leíste (los 10 más recientes y luego **Mostrar N más antiguas**; abierto o cerrado se guarda en este dispositivo). Un chat que termina mientras está abierto detrás del tablero (una **Nueva tarea**) sigue verde hasta que lo abres. Haz clic en el nombre del proyecto, arriba del tablero, para abrir la lista de proyectos y elige un proyecto o **Todos los proyectos**; una carpeta de «Una rama por chat» cuenta como su proyecto. La lista se cierra al elegir, con `Esc` o con un clic fuera de ella. Escribe en **Buscar proyectos**, arriba de la lista, para encontrar un proyecto por su nombre (no importan las mayúsculas ni los acentos; `Esc` vacía el cuadro), pulsa `Enter` para elegir la primera coincidencia y haz clic en **Activos en las últimas 2 horas** para mostrar solo los proyectos con un chat que espera, se ejecuta, terminó sin que lo vieras o cambió en las últimas 2 horas (se guarda en este dispositivo). **Nueva tarea** (o `n`) abre el propio chat nuevo de dsh en el proyecto que muestra el tablero (con **Todos los proyectos**, el proyecto que elige Nueva sesión de dsh), así que puedes añadir archivos, usar comandos y elegir el modelo como en cualquier chat. Cuando se envía tu primer mensaje, el tablero vuelve por sí solo. Hasta entonces, el chat espera en la parte superior de **En curso** como **Nueva tarea**: haz clic en él para escribir el primer mensaje. Un proyecto con un chat que te espera tiene un punto naranja en la lista de proyectos (el nombre del proyecto arriba también lo tiene mientras algún chat espera). dsh pone nombre al chat y el modelo del chat escribe hasta 3 etiquetas a partir de ese mensaje. Haz clic en una tarjeta para abrir su chat. Haz clic en una tarjeta naranja (o en su **Responder**) para responderla en el tablero; el panel tiene **Abrir chat** para ver el chat entero: **Rechazar** o **Permitir una vez**, **Aprobar** o **Solicitar cambios** para un plan, o las opciones y tu propio texto para una pregunta. Haz clic en **×** en una tarjeta terminada para quitarla del tablero, o abre **Terminados hace poco** y haz clic en **Limpiar todo**, en la parte superior de **Hecho**, para quitar esas tarjetas del tablero: primero muestra cuántas tarjetas de qué proyecto se quitan, y las tarjetas sin leer (verdes) se quedan. Durante los 8 segundos siguientes, **Deshacer** devuelve las tarjetas; **Quitadas (N)**, debajo de **Hecho**, lista las tarjetas que están fuera del tablero, y **Volver a poner** muestra una de nuevo en **Hecho**. No se borra ningún chat: los chats siguen en la barra lateral de dsh, el tablero lo recuerda después de reiniciar (Tether muestra el mismo tablero) y un chat que vuelve a ejecutarse regresa al tablero. Apunta a una tarjeta de **En curso** (o mueve el foco del teclado a ella) para ver su progreso: cuánto tiempo lleva en ejecución, el paso de su lista de tareas pendientes, la herramienta que se ejecuta ahora y la última línea del agente. En Configuración → Composer Plus → Tablero de tareas, **Progreso al pasar el cursor** elige **Rápido (sin IA)** (el predeterminado: solo lee el chat) o **Resumen con IA** (una llamada corta al modelo del chat también escribe una o dos frases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Captura: Tablero de tareas"></a> |
78
+ | **Asistente** | <a id="feature-assistant"></a>Desactivado de forma predeterminada: actívalo en **Configuración → Composer Plus**. Después haz clic en **Asistente** en la barra lateral izquierda (justo debajo de **Tablero de tareas**): abre un chat permanente que usas como tu asistente personal, como un chat de ChatGPT o Grok. El primer clic crea la carpeta `~/Assistant`, la añade como el proyecto "Assistant" e inicia el chat con el modo de permisos workspace-write y el modelo predeterminado de dsh; cada clic posterior abre el mismo chat (uno archivado vuelve, uno eliminado se crea de nuevo). Pídele que te recuerde algo («recuérdame beber agua dentro de 2 minutos»): usa las tareas programadas de dsh, así que el recordatorio ejecuta el chat a esa hora, y Tether envía su notificación "Turn finished" cuando Conexión móvil está activada. Pídele que busque en la web o pregúntale por tus otros chats: puede listar los chats de todos los proyectos (en ejecución, esperándote o inactivos) y leer los mensajes más recientes de uno. También puede enviar un mensaje a un chat, iniciar un chat nuevo en un proyecto, detener un chat en ejecución o archivar uno: cada una de estas cuatro acciones muestra primero la tarjeta de aprobación de dsh (también en Tether), y no pasa nada hasta que haces clic en **Permitir una vez**. No tiene ninguna herramienta para eliminar. Solo este chat tiene estas herramientas y sus instrucciones breves; el texto que lee en una página web o en otro chat cuenta como datos, no como una orden. Guarda tu perfil en la memoria de este proyecto (**Memoria del proyecto**, tema "profil") en lugar de contárselo cada vez. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Captura: Asistente"></a> |
78
79
  | **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> |
79
80
  | **Historial de versiones de la memoria** | <a id="feature-memoryhistory"></a>Activado por defecto mientras **Memoria del proyecto** está activada. Antes de cada guardado de la memoria (el agente, la revisión tras un turno, **Abrir memoria**), se guarda una copia de las notas tal como estaban. En **Abrir memoria**, selecciona un proyecto o **Memoria global** y luego **Historial**: las versiones por fecha y quién cambió la memoria después de cada una. Selecciona una versión para ver como diff lo que cambia una restauración y luego **Restaurar**. Las notas anteriores a una restauración también se guardan, así que puedes deshacerla. Se conservan las 50 versiones más recientes de cada memoria. En Tether: menú del título del chat → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Captura: Historial de versiones de la memoria"></a> |
80
81
  | **Exportar la memoria a AGENTS.md** | <a id="feature-memoryexport"></a>En **Abrir memoria**, selecciona un proyecto y luego **Exportar a AGENTS.md**: las notas de ese proyecto van a una sección marcada de `AGENTS.md` en su carpeta, para que puedas confirmarlas en git y compartirlas con tu equipo y otras herramientas de agentes. Primero ves el cambio como diff; solo **Escribir AGENTS.md** lo guarda. La siguiente exportación sustituye solo esa sección. La memoria global, las fuentes y las fechas no se incluyen. En Tether: menú del título del chat → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Captura: Exportar la memoria a AGENTS.md"></a> |
@@ -103,7 +104,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
103
104
  | **Botones de opciones** | <a id="feature-optionpicks"></a>Cuando una respuesta termina con una lista de opciones (una lista numerada de 1 a 9 elementos bajo un título "Opciones" o una línea en negrita "Opciones", también "Próximos pasos" y las mismas palabras en los idiomas de la aplicación), aparece un botón para cada opción debajo de la respuesta. Un clic envía "Option N: …" con toda la opción como tu mensaje, como si lo hubieras escrito. La opción marcada "(recomendada)" se destaca. Los botones solo aparecen debajo de la respuesta más reciente, mientras el chat está inactivo y el cuadro de mensaje está vacío; una respuesta ya elegida y una respuesta retirada por una reversión no muestran botones. Mientras se muestran, la predicción del siguiente mensaje no propone nada. En una tarjeta de pregunta del agente, las teclas 1–9 eligen esa opción, igual que un clic (no en el campo de respuesta, ni en los primeros 0,8 segundos después de que aparece la pregunta). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Captura: Botones de opciones"></a> |
104
105
  | **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> |
105
106
  | **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> |
106
- | **Equipos remotos** | <a id="feature-remotecomputers"></a>Abre el dsh de tus otros Mac a través de [Tailscale](https://tailscale.com) y úsalos en esta ventana de dsh. Actívala en **Configuración → Composer Plus** en cada Mac (está desactivada de forma predeterminada, porque abre puertos de red). En el Mac que quieres abrir, activa **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace. En este Mac, elige **Añadir un equipo…** en el selector de equipos de la barra lateral izquierda (a la derecha del nombre de la marca, encima de **Nueva sesión**), pega el enlace, escribe un **Nombre** (no el de este Mac ni el de otro equipo) y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, el selector muestra **Este Mac** y tus equipos: elige uno y su dsh ocupa esta ventana, con sus propios chats, barra lateral, herramientas y archivos, mientras este Mac sigue funcionando detrás. El otro Mac muestra el mismo selector en el mismo lugar: elige **Este Mac** allí para volver. El panel de Configuración cambia el nombre de los equipos y los quita, y muestra los equipos que pueden abrir este Mac (**Quitar** desconecta uno al instante). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Captura: Equipos remotos"></a> |
107
+ | **Equipos remotos** | <a id="feature-remotecomputers"></a>Abre el dsh de tus otros Mac a través de [Tailscale](https://tailscale.com) y úsalos en esta ventana de dsh. Actívala en **Configuración → Composer Plus** en cada Mac (está desactivada de forma predeterminada, porque abre puertos de red). En el Mac que quieres abrir, activa **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace. En este Mac, elige **Añadir un equipo…** en el selector de equipos de la barra lateral izquierda (a la derecha del nombre de la marca, encima de **Nueva sesión**), pega el enlace, escribe un **Nombre** (no el de este Mac ni el de otro equipo) y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, el selector muestra **Este Mac** y tus equipos: elige uno y su dsh ocupa esta ventana, con sus propios chats, barra lateral, herramientas y archivos, mientras este Mac sigue funcionando detrás. El selector se queda en el mismo lugar y muestra **Volver a este Mac**: haz clic en él para volver. Si tienes más de un equipo, el clic abre el menú, donde eliges **Este Mac** u otro equipo. El panel de Configuración cambia el nombre de los equipos y los quita, y muestra los equipos que pueden abrir este Mac (**Quitar** desconecta uno al instante). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Captura: Equipos remotos"></a> |
107
108
  | **Actualizaciones automáticas** | <a id="feature-autoupdate"></a>Al iniciar dsh, el plugin consulta la [última versión publicada en GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Si es más reciente y ya está en npm, instala esa versión exacta con el gestor de plugins propio de dsh (el mismo camino que Configuración → Plugins) y te avisa. Reinicia dsh para cargarla. **Configuración → Composer Plus → Actualizaciones de Composer Plus** muestra la versión y tiene los botones **Buscar actualizaciones** / **Actualizar ahora**. La primera vez que dsh se inicia con la nueva versión, una ventana **Novedades de Composer Plus N** muestra una vez las notas de esa versión en el idioma de **Idioma de la aplicación** (llegan con la nueva versión, sin otra llamada de red; un idioma sin notas muestra las notas en inglés); **Cerrar** o `Esc` la cierra. Debajo de las notas, una línea pide una estrella en GitHub, como mucho una vez cada 30 días (sin llamada de red); después de **Dar una estrella en GitHub** o **No volver a preguntar**, no vuelve a aparecer. La ventana también aparece tras una actualización desde Configuración → Plugins o una carpeta copiada, una vez por versión nueva; no en la primera instalación. **Novedades de esta versión** en la fila de actualizaciones la abre de nuevo. Si en el disco hay una versión más reciente que la que se ejecuta, la fila pide reiniciar dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
108
109
  | **Filtro activadas/desactivadas** | <a id="feature-featurefilter"></a>Junto a **Buscar funciones** en **Configuración → Composer Plus**: **Todas** muestra todas las funciones, **Activadas** solo las que tienen el interruptor activado y **Desactivadas** solo las que lo tienen desactivado. Decide el interruptor de cada fila, también uno que guarda el Host de dsh (por ejemplo **Conexión móvil**). Funciona junto con la búsqueda: escribe una palabra y elige **Desactivadas** para encontrar una función que desactivaste. Una fila que cambias con **Activadas** o **Desactivadas** elegido se queda hasta que eliges un filtro de nuevo, así el foco sigue en su interruptor. **Activadas** y **Desactivadas** ocultan las filas **Idioma de la aplicación** y **Actualizaciones de Composer Plus** (no tienen interruptor). Configuración se abre siempre con **Todas**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Captura: Filtro activadas/desactivadas"></a> |
109
110
  | **Informar de un problema** | <a id="feature-issuereport"></a>Configuración → Composer Plus → **Informar de un problema…** (debajo de la introducción), o haz clic derecho en un chat de la barra lateral (o abre su menú **…**) → **Informar de un problema de Composer Plus…**. Elige un tipo: **Error**, **Solicitud de función**, **Mejora**, **Traducción** o **Pregunta**. Descríbelo con tus propias palabras y en tu idioma, y luego haz clic en **Escribir borrador** (o pulsa `Cmd/Ctrl+Enter`). Una llamada al modelo predeterminado de dsh escribe una issue en inglés: un título con el prefijo del tipo (por ejemplo `[Bug]`) y las secciones de ese tipo (para un error: What happened, Steps to reproduce, Expected, Actual), más una línea con las versiones de Composer Plus, de dsh y del sistema. Lee y edita el título y la descripción; **Volver a escribir** escribe un borrador nuevo. **Abrir issue** la abre en el repositorio de GitHub de Composer Plus con tu sesión de GitHub CLI (`gh`) y muestra su enlace. La issue es pública: se rechaza el texto que parece una clave o una contraseña. Cuando `gh` no puede abrirla, **Abrir en GitHub en su lugar** abre la propia página de GitHub con el borrador ya rellenado. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Captura: Informar de un problema"></a> |
@@ -198,6 +199,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
198
199
  - **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.
199
200
  - **Desglose del contexto:** la parte Host solo lee el registro del chat; ninguna llamada al modelo, ningún archivo del proyecto.
200
201
  - **Tablero de tareas:** el tablero muestra los propios chats de dsh a partir de las propias listas de dsh en esta ventana; no añade datos de chat propios. **Nueva tarea** abre el propio chat nuevo de dsh, y tú escribes el primer mensaje en el editor de dsh, así que las aprobaciones, el sandbox y el modelo del chat se aplican como siempre. La parte Host guarda el primer mensaje de ese chat como el prompt de la tarjeta y lo envía (sus primeros 4.000 caracteres, nada más) al modelo de ese chat en una petición más, sin herramientas, para obtener hasta 3 etiquetas. El prompt, las etiquetas y la hora de inicio de cada tarea se guardan en `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (archivo solo para el propietario, las 2.000 más recientes), junto con los ID de los chats que quitaste del tablero con **×** o **Limpiar todo** (los 5.000 más recientes); el interruptor está en `board-switch.json`, junto a él. No se escribe nada en ninguna carpeta de proyecto. **Responder** envía tu respuesta a la propia solicitud pendiente de dsh, igual que la tarjeta del propio chat. La antigua lista de tareas de versiones anteriores (`board.json`) se queda en el disco tal como estaba y no se lee. **Progreso al pasar el cursor** lee el registro del chat en este Mac. Con **Rápido (sin IA)** (el predeterminado), no se envía nada. Con **Resumen con IA**, mientras se ve el cuadro de progreso de una tarjeta en curso (o mientras el tablero de Tether está abierto, para hasta 8 tarjetas en curso), la parte Host envía la parte más reciente de ese chat (como máximo unos 6.000 caracteres: tus mensajes, las respuestas de texto del agente, sus llamadas a herramientas y el final de sus resultados; sin razonamiento ni mensajes revertidos) al modelo del chat, en una sola solicitud sin herramientas. Solo vuelve a enviar cuando el chat avanzó, como máximo una vez cada 20 segundos por chat. La nota solo se guarda en memoria; el ajuste está en `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (archivo solo para el propietario).
202
+ - **Asistente:** el chat del asistente es un chat normal de dsh en `~/Assistant`; sus llamadas al modelo van al modelo predeterminado de dsh, como en cualquier chat. Sus herramientas leen los registros de tus otros chats en este Mac (títulos, proyectos, estado y, con chat_read, sus mensajes más recientes) y se los dan a ese modelo solo cuando llama a una herramienta. Enviar, iniciar, detener y archivar un chat esperan cada uno tu aprobación. El ID del chat se guarda en `$DSH_HOME/storages/dsh-composer-plus/assistant.json` y el interruptor en `assistant-switch.json` (archivos solo para el propietario). Los recordatorios y las automatizaciones son las propias tareas programadas de dsh. Nada sale de este Mac, excepto las peticiones al modelo y las búsquedas web que hace el chat.
201
203
  - **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.
202
204
  - **Comandos bloqueados:** las reglas y el interruptor están en `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (archivo solo para el propietario). La comprobación solo lee el texto del comando de cada llamada a `bash` y `pwsh`; no ejecuta nada y no envía nada.
203
205
  - **Entrada secreta:** el valor va de la tarjeta (o de Tether, a través del gateway, que no registra el cuerpo de las solicitudes) al Host solo en la solicitud de respuesta. El Host lo escribe en `$DSH_HOME/storages/dsh-composer-plus/secrets/<nombre aleatorio>` (carpeta 0700, archivo 0600); nada va al proyecto, al registro del chat ni al resultado de la herramienta. El Host guarda el valor en memoria para reemplazarlo por `[secret]` en los resultados de herramienta posteriores de ese chat. El archivo y esa copia se borran al terminar el turno del chat y al iniciar dsh. El interruptor está en `secrets.json`, a su lado. Un comando que el agente ejecuta con el archivo puede enviar el valor adonde ese comando lo envíe: ese es su propósito.
@@ -224,7 +226,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
224
226
  - **No hay etiqueta de rama en una fila de chat:** la barra lateral no está en «En una sola lista» (en «Espacio de trabajo» y «Árbol de espacios de trabajo», ninguna fila de chat muestra una etiqueta), el chat no tuvo ningún turno desde que instalaste esta versión, su carpeta no es un repositorio git o **Rama de Git en las filas de chat** está desactivada. Después de una actualización, reinicia dsh (la parte Host registra la rama).
225
227
  - **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.
226
228
  - **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).
227
- - **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.23.0`); consulta la nota de instalación de más arriba.
229
+ - **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.24.0`); consulta la nota de instalación de más arriba.
228
230
  - **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.
229
231
  - **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.
230
232
  - **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.
@@ -258,7 +260,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
258
260
  - **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.
259
261
  - **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.
260
262
  - **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). Con una clave APNs en `apns.json` (consulta `tether/README.md`), el Mac envía las notificaciones mediante el servicio push de Apple, así que llegan también con Tether cerrada; el Mac debe estar activo y con dsh abierto. Sin la clave, el teléfono solo las recibe mientras Tether está abierta o acaba de pasar a segundo plano. Tether solo las envía después de que actives «Settings → Notifications → Send notifications» en Tether. Tether guarda esta opción y su horario por separado para cada Mac emparejado. Está desactivada de forma predeterminada en cada Mac, 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. Cada notificación muestra el Mac y el proyecto del chat (`Studio Mac · recipe-box`), el título del chat y el texto: Turn finished muestra la última respuesta del agente. Con la clave de APNs, este texto pasa por el servicio push de Apple. 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í.
261
- - **Equipos remotos** necesita Tailscale en los dos Mac, y Composer Plus con esta función activada en el Mac que abres. Ese Mac no debe estar en reposo, y dsh debe estar en ejecución en él. El selector solo aparece cuando la barra lateral izquierda está abierta (no cuando solo muestra iconos). La página del otro Mac solo muestra el selector cuando ese Mac tiene esta versión de Composer Plus o una más reciente. Con una versión más antigua, aparece un botón **Volver a este Mac** arriba después de unos segundos. Cada equipo que abriste guarda su página en memoria hasta que desactives la función o reinicies dsh. En la app de escritorio, la página del otro Mac es una página incrustada: los atajos de teclado propios de dsh (por ejemplo, un nuevo chat) no funcionan en ella, y tampoco funcionan allí las descargas de archivos, el micrófono ni las notificaciones. Usa el puerto 19392 (solo un dsh por Mac puede dejar entrar a otros equipos). Desde la página de otro Mac, el selector solo cambia entre los equipos de este Mac: no puedes abrir un tercer Mac a través del otro Mac.
263
+ - **Equipos remotos** necesita Tailscale en los dos Mac, y Composer Plus con esta función activada en el Mac que abres. Ese Mac no debe estar en reposo, y dsh debe estar en ejecución en él. El selector solo aparece cuando la barra lateral izquierda está abierta (no cuando solo muestra iconos). Si la página del otro Mac no tiene su propio selector (allí hay un Composer Plus anterior a 1.23.0), el selector de este Mac aparece sobre esa página en el mismo lugar. Con 1.23.0 allí, el selector muestra el nombre de ese Mac: elige **Este Mac** en su menú para volver. Cada equipo que abriste guarda su página en memoria hasta que desactives la función o reinicies dsh. En la app de escritorio, la página del otro Mac es una página incrustada: los atajos de teclado propios de dsh (por ejemplo, un nuevo chat) no funcionan en ella, y tampoco funcionan allí las descargas de archivos, el micrófono ni las notificaciones. Usa el puerto 19392 (solo un dsh por Mac puede dejar entrar a otros equipos). Desde la página de otro Mac, el selector solo cambia entre los equipos de este Mac: no puedes abrir un tercer Mac a través del otro Mac.
262
264
  - 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.
263
265
  - **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.
264
266
  - **Editar el mensaje en cola en su sitio** no cambia un mensaje que empezó a enviarse mientras tanto ni sobrescribe un mensaje que cambió mientras tanto (por ejemplo, en Tether en el iPhone): un aviso lo indica. Una imagen nueva necesita un modelo que acepte imágenes (se aplican los límites de imagen propios de dsh), y un archivo nuevo debe terminar de subirse antes de que puedas guardar. Solo se pueden editar tus propios mensajes en cola: una ronda de un objetivo o una respuesta a una pregunta en la cola, no. Tras una actualización del plugin, solo las ediciones de texto funcionan al momento: reinicia dsh antes de guardar un mensaje con imágenes o archivos (la parte Host se carga al iniciar).
@@ -294,6 +296,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
294
296
  - **Paquete de skill en turco** instala un skill de terceros: sus reglas vienen del repositorio de GitHub de su autor, no de Composer Plus, y una versión nueva se usa desde la siguiente comprobación diaria sin que la revisemos. La comprobación demuestra que los archivos son los que GitHub lista para ese commit, no que las reglas sean buenas. El modelo decide cuándo cargar el skill (también puedes llamarlo por su nombre); las reglas solo se aplican a textos en turco. La parte Host usa el idioma que un navegador informó por última vez: si dos navegadores usan idiomas distintos, gana el más reciente. GitHub permite 60 llamadas a la API por hora sin iniciar sesión; una comprobación rechazada conserva la copia instalada y muestra el motivo en la configuración.
295
297
  - **Desenredar el código** incluye una copia fija de la skill (caldoai/skills, commit f3cf477): un cambio en el original solo llega con una nueva versión de Composer Plus. La skill ejecuta un objetivo largo que puede cambiar muchos archivos, y sus subagentes y comprobaciones gastan muchos tokens. Donde el proyecto no tiene pruebas, puede cambiar el comportamiento sin avisar: iníciala en una rama y lee el diff antes de fusionar. Una skill con el mismo nombre en el proyecto, en una carpeta de skills personalizada o en `~/.dsh/skills` la sustituye. Mientras el interruptor está apagado, `/untangle-codebase` llega al modelo como texto normal.
296
298
  - **Tablero de tareas** muestra los chats que dsh lista en esta ventana: un chat fuera de un proyecto solo aparece en **Todos los proyectos**, y una carpeta de «Una rama por chat» (`<project>/.worktrees/<name>`) cuenta como su proyecto. La columna de una tarjeta es el estado en vivo del chat, así que las tarjetas no se pueden arrastrar: un chat pasa a **Hecho** cuando termina su turno, también después de un error o una detención, y vuelve a **En curso** cuando se ejecuta de nuevo. El punto verde es el propio punto de terminado de dsh, que dsh solo guarda en esta ventana: después de recargar, los chats terminados aparecen sin él. **Hecho** muestra los 50 chats más recientes (**Mostrar N más antiguas** muestra el resto). **Buscar proyectos** encuentra un proyecto solo por su nombre, no por la ruta de su carpeta. **Activos en las últimas 2 horas** oculta un proyecto cuando todos sus chats tienen más de 2 horas, están inactivos y leídos; el tablero sigue mostrando el proyecto que elegiste. **Nueva tarea** solo recuerda el chat nuevo más reciente de esta ventana: cuando abres otro chat antes del primer mensaje, ese chat se queda en la parte superior de **En curso** como **Nueva tarea** hasta que escribas en él, pero el tablero vuelve por sí solo únicamente para el más reciente. Después de recargar, un chat nuevo sin mensajes no está en el tablero (dsh lo guarda como su Nueva sesión vacía). Las etiquetas vienen de una llamada al modelo por cada tarea, a partir de su primer mensaje: pueden ser incorrectas, y un chat que no iniciaste en el tablero no tiene ninguna. El título es el propio título del chat en dsh (el servicio de títulos de dsh, con el modelo del chat); hasta que llega, la tarjeta muestra la primera línea del primer mensaje. **×** y **Limpiar todo** solo quitan tarjetas del tablero: no se borra ningún chat. **Deshacer** solo aparece durante 8 segundos, en esta ventana; después, **Quitadas (N)** → **Volver a poner** devuelve una tarjeta, y un chat que vuelve a ejecutarse regresa por sí solo. **Limpiar todo** pregunta primero y quita las tarjetas terminadas y leídas del proyecto que se muestra (de todos los proyectos con **Todos los proyectos**), también las que están detrás de **Mostrar N más antiguas**; una tarjeta sin leer (verde) se queda. dsh guarda su punto verde solo en esta ventana, así que después de recargar, Limpiar todo puede quitar una tarjeta cuya respuesta no leíste. La lista se guarda en este Mac para todas las ventanas y para Tether; cuando llega a 5.000 chats, los más antiguos vuelven. **Responder** solo responde la solicitud más reciente del chat: cuando el chat la respondió en otro lugar (otra ventana, Tether, la revisión automática) o pregunta algo nuevo, el panel lo indica y no envía nada. Las versiones anteriores tenían una lista de tareas con comentarios y herramientas para agentes; ya no existen, y el antiguo `board.json` no se muestra. La idea y el aspecto vienen de [Kanzo](https://github.com/emanuele-em/kanzo), de emanuele-em (AGPL-3.0); Composer Plus no usa su código. `Cmd+Shift+K` es un atajo de dsh: en un navegador en Linux no tiene tecla predeterminada (asígnala en la página de atajos de teclado de dsh), y una extensión del navegador u otra aplicación puede tomarla antes. Una tarjeta sale de **Hecho** cuando desaparece el punto verde de dsh (abriste el chat) o, para un chat que terminó detrás del tablero mientras era el chat abierto, cuando ese chat se muestra sin un panel encima. Este estado de leído vive solo en esta ventana de dsh, como los puntos de dsh: tras recargar o en otra ventana, cada chat terminado cuenta como leído, así que está en **Terminados hace poco**.
299
+ - **Asistente** tiene un solo chat para todas las ventanas de este Mac. Se ejecuta con el modo de permisos workspace-write: solo escribe archivos en `~/Assistant`, y un comando fuera de esa carpeta pregunta primero. Cuando cambias el chat a un modo sin aprobaciones (Acceso completo), dsh rechaza cada aprobación, así que el asistente no puede enviar, iniciar, detener ni archivar un chat. La tarjeta de aprobación solo protege las seis herramientas: un comando de shell del asistente aún puede llegar a la red, como en cualquier chat con ese modo. En dsh 0.2.0 y 0.2.1, las herramientas de programación de dsh solo ven los recordatorios del propio chat del asistente, no las automatizaciones de otros chats; desde dsh 0.2.2, listan y cambian todas las tareas programadas. chats_list deja fuera los chats archivados, vacíos y de subagentes, y el propio chat del asistente; «esperándote» significa una aprobación, una pregunta o una revisión de plan abierta en un chat en ejecución. chat_read da los mensajes del usuario y las respuestas del agente (sin la salida de las herramientas), como máximo 50 mensajes y unos 24.000 caracteres. chat_archive rechaza un chat que aún se ejecuta o que tiene recordatorios activos. Un texto que el modelo lee aún puede engañarlo: la tarjeta de aprobación es la última comprobación, así que léela antes de hacer clic en **Permitir una vez**.
297
300
  - **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.
298
301
  - **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.
299
302
  - **Historial de versiones de la memoria** conserva las 50 versiones más recientes de cada memoria (cada proyecto y la memoria global); las más antiguas se borran. Una versión guarda toda la memoria de ese proyecto, no una nota. **Restaurar** devuelve todos los archivos de esa versión (temas incluidos) y se niega si la memoria cambió después de abrir la versión; la memoria anterior a la restauración pasa a ser una versión nueva, así que puedes deshacerla. Con el interruptor desactivado no se guardan versiones nuevas y **Restaurar** se niega; las versiones guardadas se quedan. No hay versiones de antes de esta función: el historial empieza con el primer guardado tras instalarla.
@@ -347,6 +350,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
347
350
 
348
351
  **¿Puedo ver todos mis chats como un tablero kanban e iniciar chats nuevos desde él?** Sí, con **Tablero de tareas** (activado de forma predeterminada): ábrelo en la barra lateral izquierda. Cada chat es una tarjeta en **En curso**, **En revisión** (te espera) o **Hecho**. **Nueva tarea** abre el chat nuevo de dsh en el proyecto, y el tablero vuelve cuando se envía tu primer mensaje; haz clic en **Responder** en una tarjeta naranja para responderla sin abrir el chat. **Limpiar todo**, en **Hecho**, pregunta primero y quita del tablero las tarjetas terminadas que ya leíste; **Deshacer** y **Quitadas (N)** las devuelven, y los chats siguen en dsh.
349
352
 
353
+ **¿Puedo tener un chat de asistente personal que me haga recordatorios y gestione mis otros chats?** Sí, con **Asistente** (desactivado de forma predeterminada): actívalo en Configuración → Composer Plus y luego haz clic en **Asistente** en la barra lateral izquierda. Crea recordatorios con las tareas programadas de dsh, busca en la web, lista y lee tus chats, y envía un mensaje a un chat o inicia, detiene o archiva uno solo después de que lo apruebes. Guarda tu perfil en la memoria de su proyecto, tema "profil".
354
+
350
355
  **¿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.
351
356
 
352
357
  **dsh ya no se inicia. ¿Cómo restauro una copia de seguridad?** Abre la carpeta de copias de seguridad (`~/Desktop/dsh-backups`) y haz doble clic en `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Elige `3) Restore a backup`, selecciona una y escribe `RESTORE`. Funciona sin dsh.
@@ -389,7 +394,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
389
394
 
390
395
  **Perdí mi iPhone. ¿Cómo evito que llegue a mi Mac?** Haz clic en **Conexión móvil**, abajo a la izquierda de la barra lateral, y haz clic en **Remove** junto a ese iPhone. Su clave deja de funcionar al instante; solo puede volver con un nuevo emparejamiento que apruebes en el Mac.
391
396
 
392
- **¿Cómo continúo un chat de mi otro Mac desde este?** En el otro Mac, activa **Configuración → Composer Plus → Equipos remotos** y **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace (envíatelo, por ejemplo con AirDrop o Notas). En este Mac, activa también **Equipos remotos**, elige **Añadir un equipo…** en el selector de la barra lateral izquierda (a la derecha del nombre de la marca, encima de **Nueva sesión**), pega el enlace, escribe un **Nombre** y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, elige ese equipo en el mismo menú: ocupa esta ventana. Elige **Este Mac** en el mismo lugar para volver. Mientras tanto, los chats de este Mac siguen funcionando.
397
+ **¿Cómo continúo un chat de mi otro Mac desde este?** En el otro Mac, activa **Configuración → Composer Plus → Equipos remotos** y **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace (envíatelo, por ejemplo con AirDrop o Notas). En este Mac, activa también **Equipos remotos**, elige **Añadir un equipo…** en el selector de la barra lateral izquierda (a la derecha del nombre de la marca, encima de **Nueva sesión**), pega el enlace, escribe un **Nombre** y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, elige ese equipo en el mismo menú: ocupa esta ventana. Haz clic en **Volver a este Mac** en el mismo lugar para volver. Mientras tanto, los chats de este Mac siguen funcionando.
393
398
 
394
399
  **¿Puedo bloquear Tether con Face ID?** Sí: en Tether, activa «Settings → Privacy → Lock with Face ID». Después, Tether pide Face ID (o el código) al abrirse y cuando vuelves a la app.
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```sh
package/README.fr.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau ; c’est l’app qui le gère.)
31
31
 
32
- > Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.23.0`.
32
+ > Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.24.0`.
33
33
 
34
34
  ## Fonctionnalités
35
35
 
@@ -75,6 +75,7 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
75
75
  | **Fichiers protégés** | <a id="feature-protectedfiles"></a>Activée par défaut. Les outils de fichiers propres à l’agent ne peuvent ni lire ni modifier les fichiers qui correspondent à vos motifs : `read`, `read_image` et `grep` sur un fichier sont refusés pour les motifs **lecture et écriture**, et `write`, `edit` et `str_replace_editor` pour les deux types. L’agent lit pourquoi et on lui demande de vous consulter. Les motifs par défaut sont `.env*`, `*.pem` et `*.key`. Réglages → Composer Plus → **Fichiers protégés** : ajoutez un motif (par exemple `published/**` ou `config/*.yml`), cliquez sur son type pour basculer entre **lecture et écriture** et **écriture seule**, supprimez-le avec ✕, ou cliquez sur **Utiliser les valeurs par défaut**. Un motif sans `/` correspond à un nom de fichier dans n’importe quel dossier. C’est un garde-fou, pas un sandbox : une commande shell (`cat .env`), un script ou un outil MCP peut encore atteindre le fichier (voir Limites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Capture d’écran : Fichiers protégés"></a> |
76
76
  | **Commandes bloquées** | <a id="feature-blockedcommands"></a>Activée par défaut, avec une liste vide. Les commandes shell de l’agent (`bash`, `pwsh`) ne peuvent pas exécuter une commande qui correspond à vos règles : une règle **bloquer** refuse l’appel (l’agent lit pourquoi et on lui demande de vous consulter), une règle **demander d’abord** affiche la carte d’approbation de dsh, et la commande ne s’exécute que si vous l’autorisez. Réglages → Composer Plus → **Commandes bloquées** : tapez une règle (par exemple `npm publish`, `git push --force` ou `ssh *192.168.2.19`), cliquez sur son type pour basculer entre **bloquer** et **demander d’abord**, puis cliquez sur **Ajouter** ; cliquez sur le type d’une règle pour le changer, supprimez-la avec ✕. Une règle est un nom de commande et des mots qui doivent le suivre dans cet ordre ; `*` correspond à n’importe quel texte. La vérification trouve aussi la commande après `&&`, `;`, `\|`, dans `$(…)`, `bash -c "…"` ou `eval`, et après `sudo` ou `env`. C’est un garde-fou, pas un sandbox : une variable (`$CMD`), un fichier de script ou un autre programme peut encore exécuter la commande (voir Limites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Capture d’écran : Commandes bloquées"></a> |
77
77
  | **Tableau des tâches** | <a id="feature-taskboard"></a>Barre latérale gauche → **Tableau des tâches**, ou appuyez sur `Cmd+Shift+K` (`Ctrl+Shift+K` sous Windows et Linux) partout dans dsh. Un tableau kanban de vos discussions dsh, avec l’état en direct que montre la barre latérale : une discussion qui attend votre approbation, votre réponse ou la revue d’un plan est dans **En revue** avec un point orange, une discussion en cours d’exécution est dans **En cours**, une discussion terminée que vous n’avez pas encore ouverte est dans **Terminé** (en vert). Quand vous ouvrez une discussion, sa carte quitte **Terminé** d’elle-même ; cliquez sur **Terminées récemment (N)**, sous les cartes vertes, pour voir les discussions terminées que vous avez lues (les 10 plus récentes, puis **Afficher N plus anciennes** ; ouvert ou fermé reste sur cet appareil). Une discussion qui se termine alors qu’elle est ouverte derrière le tableau (une **Nouvelle tâche**) reste verte jusqu’à ce que vous l’ouvriez. Cliquez sur le nom du projet, en haut du tableau, pour ouvrir la liste des projets, puis choisissez un projet ou **Tous les projets** ; le dossier d’une branche par discussion compte comme son projet. La liste se ferme après le choix, avec `Esc` ou avec un clic en dehors. Tapez dans **Rechercher des projets**, en haut de la liste, pour trouver un projet par son nom (la casse et les accents ne comptent pas ; `Esc` vide le champ), appuyez sur `Entrée` pour choisir le premier résultat, et cliquez sur **Actifs au cours des 2 dernières heures** pour n’afficher que les projets avec une discussion qui attend, s’exécute, s’est terminée sans être vue ou a changé au cours des 2 dernières heures (réglage gardé sur cet appareil). **Nouvelle tâche** (ou `n`) ouvre la nouvelle discussion de dsh lui-même dans le projet que montre le tableau (avec **Tous les projets**, le projet que choisit Nouvelle session de dsh) : vous pouvez donc ajouter des fichiers, utiliser des commandes et choisir le modèle comme dans toute discussion. Quand votre premier message part, le tableau revient de lui-même. D’ici là, la discussion attend en haut de **En cours** sous le nom **Nouvelle tâche** : cliquez dessus pour écrire le premier message. Un projet dont une discussion vous attend a un point orange dans la liste des projets (le nom du projet en haut en a un aussi tant qu’une discussion attend). dsh nomme la discussion et le modèle de la discussion écrit jusqu’à 3 étiquettes à partir de ce message. Cliquez sur une carte pour ouvrir sa discussion. Cliquez sur une carte orange (ou sur son **Répondre**) pour y répondre depuis le tableau ; le panneau a **Ouvrir la discussion** pour voir toute la discussion : **Refuser** ou **Autoriser une fois**, **Approuver** ou **Demander des modifications** pour un plan, ou les options et votre propre texte pour une question. Cliquez sur **×** sur une carte terminée pour la retirer du tableau, ou ouvrez **Terminées récemment** et cliquez sur **Tout retirer** en haut de **Terminé** pour retirer ces cartes du tableau : une fenêtre montre d’abord combien de cartes de quel projet partent, et les cartes non lues (vertes) restent. Pendant les 8 secondes qui suivent, **Annuler** remet les cartes ; **Retirées (N)**, sous **Terminé**, liste les cartes qui sont hors du tableau, et **Remettre** affiche de nouveau l’une d’elles dans **Terminé**. Aucune discussion n’est supprimée : les discussions restent dans la barre latérale de dsh, le tableau s’en souvient après un redémarrage (Tether affiche le même tableau), et une discussion qui s’exécute de nouveau revient sur le tableau. Pointez une carte dans **En cours** (ou placez-y le focus du clavier) pour voir sa progression : depuis combien de temps la discussion s’exécute, l’étape de sa liste de tâches, l’outil qui s’exécute en ce moment et la dernière ligne de l’agent. Dans Réglages → Composer Plus → Tableau des tâches, **Progression au survol** choisit **Rapide (sans IA)** (par défaut : lit seulement la discussion) ou **Résumé par IA** (un court appel au modèle de la discussion écrit aussi une ou deux phrases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Capture d’écran : Tableau des tâches"></a> |
78
+ | **Assistant** | <a id="feature-assistant"></a>Désactivé par défaut : activez-le dans **Réglages → Composer Plus**. Cliquez ensuite sur **Assistant** dans la barre latérale gauche (juste sous **Tableau des tâches**) : il ouvre une discussion durable que vous utilisez comme assistant personnel, comme une discussion ChatGPT ou Grok. Le premier clic crée le dossier `~/Assistant`, l’ajoute comme projet "Assistant" et lance la discussion avec le mode d’autorisation workspace-write et le modèle par défaut de dsh ; chaque clic suivant ouvre la même discussion (une discussion archivée revient, une discussion supprimée est recréée). Demandez-lui un rappel (« rappelle-moi de boire de l’eau dans 2 minutes ») : il utilise les tâches planifiées de dsh, donc le rappel lance la discussion à cette heure-là, et Tether envoie sa notification "Turn finished" quand Connexion mobile est activée. Demandez-lui de chercher sur le web, ou interrogez-le sur vos autres discussions : il peut lister les discussions de tous les projets (en cours, en attente de vous ou inactives) et lire les messages les plus récents de l’une d’elles. Il peut aussi envoyer un message à une discussion, lancer une nouvelle discussion dans un projet, arrêter une discussion en cours ou en archiver une : chacune de ces quatre actions affiche d’abord la carte d’approbation de dsh (aussi dans Tether), et rien ne se passe tant que vous ne cliquez pas sur **Autoriser une fois**. Il n’a aucun outil de suppression. Seule cette discussion a ces outils et ses courtes consignes ; un texte qu’il lit sur une page web ou dans une autre discussion compte comme une donnée, pas comme un ordre. Gardez votre profil dans la mémoire de ce projet (**Mémoire du projet**, sujet "profil") au lieu de le lui redire à chaque fois. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Capture d’écran : Assistant"></a> |
78
79
  | **Mémoire du projet** | <a id="feature-projectmemory"></a>Désactivée par défaut : activez-la dans **Réglages → Composer Plus**. Chaque dossier de projet a sa propre mémoire, que les discussions suivantes de ce projet lisent, comme DS Bot en garde une par Bot. Après chaque tour terminé, un appel au modèle de la discussion lit les nouveaux messages (pas ceux annulés), garde vos préférences, décisions et faits durables sous forme de notes courtes, et modifie ou supprime les anciennes. L’agent peut aussi enregistrer, supprimer et chercher des notes lui-même (`memory_remember`, `memory_forget`, `memory_recall`). Une note peut aussi être globale : tous les projets la lisent. Une nouvelle discussion reçoit les notes dans son prompt système ; une note enregistrée plus tard apparaît à partir de la discussion suivante. Les fichiers sont en Markdown dans le dossier personnel de dsh (`storages/dsh-composer-plus/memory/`), jamais dans le dossier du projet. **Ouvrir la mémoire**, sur la même ligne, montre toutes les notes enregistrées, groupées par projet (et la mémoire globale), avec un filtre. Écrivez avec vos mots ce qu’il faut changer (par exemple « je suis passé de yarn à pnpm »), puis **Aperçu des modifications** : le modèle par défaut de dsh propose les modifications, et seul **Appliquer** les enregistre. Dans Tether : menu du titre de la discussion → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Capture d’écran : Mémoire du projet"></a> |
79
80
  | **Historique des versions de la mémoire** | <a id="feature-memoryhistory"></a>Activé par défaut tant que **Mémoire du projet** est activée. Avant chaque enregistrement de la mémoire (l’agent, la revue après un tour, **Ouvrir la mémoire**), une copie des notes telles qu’elles étaient est gardée. Dans **Ouvrir la mémoire**, sélectionnez un projet ou **Mémoire globale**, puis **Historique** : les versions par date et qui a modifié la mémoire après chacune. Sélectionnez une version pour voir sous forme de diff ce que change une restauration, puis **Restaurer**. Les notes d’avant une restauration sont aussi gardées : vous pouvez donc l’annuler. Les 50 versions les plus récentes de chaque mémoire restent. Dans Tether : menu du titre de la discussion → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Capture d’écran : Historique des versions de la mémoire"></a> |
80
81
  | **Exporter la mémoire vers AGENTS.md** | <a id="feature-memoryexport"></a>Dans **Ouvrir la mémoire**, sélectionnez un projet, puis **Exporter vers AGENTS.md** : les notes de ce projet vont dans une section balisée de `AGENTS.md` dans son dossier, pour que vous puissiez les committer et les partager avec votre équipe et d’autres outils d’agents. Vous voyez d’abord la modification sous forme de diff ; seul **Écrire AGENTS.md** l’enregistre. L’export suivant remplace seulement cette section. La mémoire globale, les sources et les dates restent dehors. Dans Tether : menu du titre de la discussion → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Capture d’écran : Exporter la mémoire vers AGENTS.md"></a> |
@@ -103,7 +104,7 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
103
104
  | **Boutons d’options** | <a id="feature-optionpicks"></a>Quand une réponse se termine par une liste d’options (une liste numérotée de 1 à 9 éléments sous un titre « Options » ou une ligne en gras « Options », aussi « Prochaines étapes » et les mêmes mots dans les langues de l’application), un bouton apparaît sous la réponse pour chaque option. Un clic envoie « Option N: … » avec toute l’option comme votre message, comme si vous l’aviez tapé. L’option marquée « (recommandée) » est mise en avant. Les boutons n’apparaissent que sous la réponse la plus récente, quand la discussion est inactive et que la zone de message est vide ; une réponse déjà choisie et une réponse retirée par un retour en arrière n’en ont pas. Tant qu’ils sont affichés, la prédiction du message suivant ne propose rien. Sur une carte de question de l’agent, les touches 1 à 9 choisissent cette option, comme un clic (pas dans le champ de réponse, ni pendant les 0,8 premières secondes après l’affichage de la question). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Capture d’écran : Boutons d’options"></a> |
104
105
  | **Langue de l’application** | <a id="feature-language"></a>Réglages → Composer Plus → **Langue de l’application** passe toute l’interface de dsh en Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt ou हिन्दी (voir ci-dessous). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Capture d’écran : Langue de l’application"></a> |
105
106
  | **Connexion mobile (iPhone)** | <a id="feature-mobileconnect"></a>Utilisez dsh depuis votre iPhone avec l’app [Tether](tether/), sur le même réseau Wi-Fi ou via [Tailscale](https://tailscale.com). Activez-la dans **Réglages → Composer Plus** (elle est désactivée par défaut, car elle ouvre un port réseau sur ce Mac). Cliquez ensuite sur **Connexion mobile** en bas à gauche de la barre latérale : scannez le code QR avec l’app Appareil photo de l’iPhone (touchez **Open in Tether**) ou avec **Scan code** dans Tether, touchez **Connect** et cliquez sur **Approve**. Installez d’abord Tether : sans elle, l’app Appareil photo ne peut pas ouvrir le code. Le téléphone affiche vos discussions, envoie des messages (avec des photos : le **+** de la zone de saisie → Camera, Photos ou Paste image), répond aux approbations et aux questions, et change de modèle et d’agent. Appairez autant de Mac que vous voulez : le nom du Mac, en haut à gauche de l’app, permet de passer de l’un à l’autre. Le panneau **Connexion mobile** liste les iPhone appairés avec leur dernière connexion : **Remove** en déconnecte un tout de suite. « Tailscale only » refuse le réseau local (pour un Wi-Fi partagé), et le journal d’accès montre qui a essayé de se connecter. Dans Tether, « Settings → Privacy » verrouille l’app avec Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Capture d’écran : Connexion mobile (iPhone)"></a> |
106
- | **Ordinateurs distants** | <a id="feature-remotecomputers"></a>Ouvrez le dsh de vos autres Mac via [Tailscale](https://tailscale.com) et utilisez-les dans cette fenêtre de dsh. Activez la fonction dans **Réglages → Composer Plus** sur chaque Mac (elle est désactivée par défaut, car elle ouvre des ports réseau). Sur le Mac que vous voulez ouvrir, activez **Autoriser d’autres ordinateurs à ouvrir ce Mac**, cliquez sur **Créer un lien d’appairage** et copiez le lien. Sur ce Mac, choisissez **Ajouter un ordinateur…** dans le sélecteur d’ordinateurs de la barre latérale gauche (à droite du nom de la marque, au-dessus de **Nouvelle session**), collez le lien, saisissez un **Nom** (pas le nom de ce Mac ni celui d’un autre ordinateur) et cliquez sur **Connecter**. Cliquez ensuite sur **Approuver** sur l’autre Mac. Le sélecteur liste alors **Ce Mac** et vos ordinateurs : choisissez-en un, et son dsh remplit cette fenêtre, avec ses propres discussions, barre latérale, outils et fichiers, pendant que ce Mac continue de tourner derrière. L’autre Mac affiche le même sélecteur au même endroit : choisissez-y **Ce Mac** pour revenir. Le panneau des réglages renomme et supprime les ordinateurs, et liste les ordinateurs qui peuvent ouvrir ce Mac (**Supprimer** en déconnecte un tout de suite). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Capture d’écran : Ordinateurs distants"></a> |
107
+ | **Ordinateurs distants** | <a id="feature-remotecomputers"></a>Ouvrez le dsh de vos autres Mac via [Tailscale](https://tailscale.com) et utilisez-les dans cette fenêtre de dsh. Activez la fonction dans **Réglages → Composer Plus** sur chaque Mac (elle est désactivée par défaut, car elle ouvre des ports réseau). Sur le Mac que vous voulez ouvrir, activez **Autoriser d’autres ordinateurs à ouvrir ce Mac**, cliquez sur **Créer un lien d’appairage** et copiez le lien. Sur ce Mac, choisissez **Ajouter un ordinateur…** dans le sélecteur d’ordinateurs de la barre latérale gauche (à droite du nom de la marque, au-dessus de **Nouvelle session**), collez le lien, saisissez un **Nom** (pas le nom de ce Mac ni celui d’un autre ordinateur) et cliquez sur **Connecter**. Cliquez ensuite sur **Approuver** sur l’autre Mac. Le sélecteur liste alors **Ce Mac** et vos ordinateurs : choisissez-en un, et son dsh remplit cette fenêtre, avec ses propres discussions, barre latérale, outils et fichiers, pendant que ce Mac continue de tourner derrière. Le sélecteur reste au même endroit et affiche **Revenir à ce Mac** : cliquez dessus pour revenir. Avec plus d’un ordinateur, le clic ouvre le menu, où vous choisissez **Ce Mac** ou un autre ordinateur. Le panneau des réglages renomme et supprime les ordinateurs, et liste les ordinateurs qui peuvent ouvrir ce Mac (**Supprimer** en déconnecte un tout de suite). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Capture d’écran : Ordinateurs distants"></a> |
107
108
  | **Mises à jour automatiques** | <a id="feature-autoupdate"></a>Au démarrage de dsh, le plugin vérifie la [dernière version sur GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Si elle est plus récente et déjà sur npm, il installe exactement cette version avec le gestionnaire de plugins de dsh (le même chemin que Réglages → Plugins) et vous avertit. Redémarrez dsh pour la charger. **Réglages → Composer Plus → Mises à jour de Composer Plus** affiche la version et propose **Rechercher des mises à jour** / **Mettre à jour**. Au premier démarrage de dsh avec la nouvelle version, une fenêtre **Nouveautés de Composer Plus N** affiche une fois les notes de cette version dans la langue de **Langue de l’application** (elles arrivent avec la nouvelle version, sans autre appel réseau ; une langue sans notes affiche les notes en anglais) ; **Fermer** ou `Esc` la ferme. Sous les notes, une ligne demande une étoile sur GitHub, au plus une fois tous les 30 jours (sans appel réseau) ; après **Mettre une étoile sur GitHub** ou **Ne plus demander**, elle ne s’affiche plus. La fenêtre s’affiche aussi après une mise à jour par Réglages → Plugins ou par un dossier copié, une fois par nouvelle version ; pas à la première installation. **Nouveautés de cette version** dans la ligne des mises à jour la rouvre. Si le disque contient une version plus récente que celle qui tourne, la ligne demande de redémarrer dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Capture d’écran : Mises à jour automatiques"></a> |
108
109
  | **Filtre activées/désactivées** | <a id="feature-featurefilter"></a>À côté de **Rechercher des fonctionnalités** dans **Réglages → Composer Plus** : **Toutes** affiche toutes les fonctionnalités, **Activées** seulement celles dont l’interrupteur est activé et **Désactivées** seulement celles dont il est désactivé. C’est l’interrupteur de chaque ligne qui décide, y compris un interrupteur que garde l’hôte de dsh (par exemple **Connexion mobile**). Le filtre fonctionne avec la recherche : tapez un mot et choisissez **Désactivées** pour trouver une fonctionnalité que vous avez désactivée. Une ligne que vous basculez pendant que **Activées** ou **Désactivées** est choisi reste affichée jusqu’à ce que vous choisissiez de nouveau un filtre ; le focus reste donc sur son interrupteur. **Activées** et **Désactivées** masquent les lignes **Langue de l’application** et **Mises à jour de Composer Plus** (elles n’ont pas d’interrupteur). Les réglages s’ouvrent toujours sur **Toutes**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Capture d’écran : Filtre activées/désactivées"></a> |
109
110
  | **Signaler une issue** | <a id="feature-issuereport"></a>Réglages → Composer Plus → **Signaler une issue…** (sous l’introduction), ou clic droit sur une discussion dans la barre latérale (ou ouvrez son menu **…**) → **Signaler une issue Composer Plus…**. Choisissez un type : **Bug**, **Demande de fonctionnalité**, **Amélioration**, **Traduction** ou **Question**. Décrivez-le avec vos propres mots et dans votre langue, puis cliquez sur **Rédiger le brouillon** (ou `Cmd/Ctrl+Enter`). Un seul appel au modèle par défaut de dsh rédige une issue en anglais : un titre avec le préfixe du type (par exemple `[Bug]`) et les sections de ce type (pour un bug : What happened, Steps to reproduce, Expected, Actual), plus une ligne avec les versions de Composer Plus, de dsh et du système. Lisez et modifiez le titre et la description ; **Rédiger à nouveau** rédige un nouveau brouillon. **Ouvrir l’issue** l’ouvre dans le dépôt GitHub de Composer Plus avec votre connexion GitHub CLI (`gh`) et affiche son lien. L’issue est publique : un texte qui ressemble à une clé ou à un mot de passe est refusé. Quand `gh` ne peut pas l’ouvrir, **Ouvrir plutôt sur GitHub** ouvre la page de GitHub lui-même avec le brouillon déjà rempli. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Capture d’écran : Signaler une issue"></a> |
@@ -198,6 +199,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
198
199
  - **Continuer dans une nouvelle discussion :** rien ne s’exécute tant que vous ne cliquez pas. Ensuite, la partie hôte envoie la discussion (comme la Vérification de l’objectif la lit : sans raisonnement ni étapes retirées par une annulation) au modèle de la discussion elle-même et affiche la note de passation ; seul **Lancer une nouvelle discussion** crée une nouvelle discussion. Rien n’est écrit dans le projet.
199
200
  - **Répartition du contexte :** la partie hôte lit seulement le journal de la discussion ; aucun appel au modèle, aucun fichier du projet.
200
201
  - **Tableau des tâches :** le tableau montre les discussions de dsh à partir des listes de dsh dans cette fenêtre ; il n’ajoute aucune donnée de discussion à lui. **Nouvelle tâche** ouvre la nouvelle discussion de dsh lui-même, et vous écrivez le premier message dans la zone de saisie de dsh : les approbations, le sandbox et le modèle de la discussion s’appliquent donc comme d’habitude. La partie hôte garde le premier message de cette discussion comme prompt de la carte et l’envoie (ses 4 000 premiers caractères, rien d’autre) au modèle de cette discussion dans une requête de plus, sans outils, pour obtenir jusqu’à 3 étiquettes. Le prompt, les étiquettes et l’heure de lancement de chaque tâche sont gardés dans `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (fichier réservé au propriétaire, les 2 000 plus récentes), avec les identifiants des discussions que vous avez retirées du tableau avec **×** ou **Tout retirer** (les 5 000 plus récents) ; l’interrupteur se trouve à côté, dans `board-switch.json`. Rien n’est écrit dans un dossier de projet. **Répondre** envoie votre réponse à la demande en attente de dsh, de la même façon que la carte de la discussion elle-même. L’ancienne liste de tâches des versions précédentes (`board.json`) reste sur le disque telle quelle et n’est pas lue. **Progression au survol** lit le journal de la discussion sur ce Mac. Avec **Rapide (sans IA)** (par défaut), rien n’est envoyé. Avec **Résumé par IA**, tant que la fenêtre de progression d’une carte en cours est affichée (ou tant que le tableau de Tether est ouvert, pour 8 cartes en cours au plus), la partie Host envoie la partie la plus récente de cette discussion (environ 6 000 caractères au plus : vos messages, les réponses texte de l’agent, ses appels d’outils et la fin de leurs résultats ; sans raisonnement ni messages retirés par une annulation) au modèle de la discussion, en une seule requête sans outils. Elle n’envoie à nouveau qu’après une avancée de la discussion, au plus une fois toutes les 20 secondes par discussion. La note reste seulement en mémoire ; le réglage se trouve dans `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (fichier réservé au propriétaire).
202
+ - **Assistant :** la discussion de l’assistant est une discussion dsh ordinaire dans `~/Assistant` ; ses appels au modèle vont au modèle par défaut de dsh, comme dans toute discussion. Ses outils lisent les journaux de vos autres discussions sur ce Mac (titres, projets, état et, avec chat_read, leurs messages les plus récents) et ne les donnent à ce modèle que lorsqu’il appelle un outil. Envoyer, lancer, arrêter et archiver une discussion attendent chacun votre approbation. L’identifiant de la discussion est conservé dans `$DSH_HOME/storages/dsh-composer-plus/assistant.json` et l’interrupteur dans `assistant-switch.json` (fichiers réservés au propriétaire). Les rappels et les automatisations sont les tâches planifiées de dsh lui-même. Rien ne quitte ce Mac, sauf les requêtes au modèle et les recherches web que fait la discussion.
201
203
  - **Fichiers protégés :** la liste et l’interrupteur se trouvent dans `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (fichier réservé au propriétaire). La vérification lit seulement le chemin de chaque appel d’outil de fichiers (et son chemin réel), jamais le fichier.
202
204
  - **Commandes bloquées :** les règles et l’interrupteur se trouvent dans `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (fichier réservé au propriétaire). La vérification lit seulement le texte de la commande de chaque appel `bash` et `pwsh` ; elle n’exécute rien et n’envoie rien.
203
205
  - **Saisie secrète :** la valeur va de la carte (ou de Tether, par la passerelle, qui n’enregistre pas le corps des requêtes) au Host uniquement dans la requête de réponse. Le Host l’écrit dans `$DSH_HOME/storages/dsh-composer-plus/secrets/<nom aléatoire>` (dossier 0700, fichier 0600) ; rien ne va dans le projet, le journal de la discussion ou le résultat de l’outil. Le Host garde la valeur en mémoire pour la remplacer par `[secret]` dans les résultats d’outil suivants de cette discussion. Le fichier et cette copie sont supprimés à la fin du tour de la discussion et au démarrage de dsh. L’interrupteur est dans `secrets.json`, à côté. Une commande que l’agent lance avec le fichier peut envoyer la valeur là où cette commande l’envoie : c’est le but.
@@ -224,7 +226,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
224
226
  - **Pas de pastille de branche sur une ligne de discussion :** la barre latérale n’est pas en « Dans une seule liste » (dans « Espace de travail » et « Arborescence des espaces de travail », aucune ligne de discussion n’affiche de pastille), la discussion n’a eu aucun tour depuis que vous avez installé cette version, son dossier n’est pas un dépôt git, ou **Branche Git sur les lignes de discussion** est désactivée. Après une mise à jour, redémarrez dsh (la partie hôte enregistre la branche).
225
227
  - **Vérification de l’objectif indique que le test s’est terminé avec le code 127 ou « not found » :** dsh démarré depuis le Finder ou le Dock peut avoir un PATH plus court que votre terminal : il ne trouve donc pas `npm`, `pnpm` ou `cargo`. Démarrez dsh depuis un terminal, ou définissez votre propre commande de test avec le chemin complet sous **Vérification de l’objectif** → **Modifier**. **Lancer maintenant** affiche le résultat tout de suite.
226
228
  - **L’objectif ne se ferme pas et l’agent continue de travailler :** **Vérification de l’objectif** a trouvé un test en échec ou du travail manquant ; la ligne sous l’objectif indique pourquoi (survolez le résultat pour voir les détails). Corrigez la cause ou la commande de test, ou terminez l’objectif vous-même avec `/goal` ou la barre de l’objectif (ce n’est pas vérifié).
227
- - **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.23.0`) ; voir la note d’installation plus haut.
229
+ - **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.24.0`) ; voir la note d’installation plus haut.
228
230
  - **Sauvegarder maintenant indique « Une autre action de sauvegarde est en cours » :** une action tourne dans une autre fenêtre de dsh ou dans la console de secours (elles partagent un fichier de verrou, `.composer-plus.lock`, dans le dossier de sauvegarde). Attendez qu’elle se termine. Si aucune action ne tourne, le verrou d’un processus fermé est repris au clic suivant.
229
231
  - **La console de secours indique « dsh is running » :** quittez d’abord dsh. Si dsh est vraiment fermé, le fichier nommé dans le message reste d’un plantage : supprimez-le et réessayez.
230
232
  - **Après une restauration, dsh ne démarre pas ou un plugin manque :** les paquets de plugins d’un profil doivent être réinstallés. La console de secours le propose après une restauration ; sinon, exécutez `pnpm install` dans chaque dossier sous `$DSH_HOME/profiles/` qu’elle liste. Les secrets qui n’étaient pas dans le vault (autre ordinateur) doivent être saisis de nouveau : la console les liste.
@@ -258,7 +260,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
258
260
  - **Adapter la carte de question à la fenêtre** ne modifie que la carte de question de dsh, pas la carte de revue du plan. Elle trouve la carte grâce au balisage de dsh (`data-question-key`, `data-question-scroll`) ; si une mise à jour de dsh change ce balisage, la carte s’affiche comme dsh la dessine. La hauteur de la carte suit la fenêtre, pas la conversation : dans une conversation affichée dans un panneau latéral étroit, une carte haute peut encore dépasser le haut de la conversation.
259
261
  - **Adapter l’en-tête de la conversation à la fenêtre** trouve l’en-tête de la conversation de dsh par ses noms de classe générés (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), car dsh n’offre pas de point d’accroche pour sa mise en page. Si une mise à jour de dsh les renomme, l’en-tête s’affiche comme dsh le dessine. Dans une colonne de conversation très étroite, l’en-tête peut prendre deux ou trois lignes, et la zone au-dessus des messages devient plus basse.
260
262
  - **Connexion mobile** ne fonctionne que sur macOS (elle utilise `en0`, `openssl`, `swift` et `dns-sd`). Elle utilise les ports fixes 19390 et 19391 : un seul dsh par Mac peut donc l’exécuter à la fois (chaque Mac est une entrée dans la liste des Mac du téléphone). Avec une clé APNs dans `apns.json` (voir `tether/README.md`), le Mac envoie les notifications par le service push d'Apple : elles arrivent aussi quand Tether est fermé ; le Mac doit être éveillé avec dsh ouvert. Sans la clé, le téléphone ne les reçoit que lorsque Tether est ouvert ou vient de passer en arrière-plan. Tether ne les envoie qu’après que vous avez activé « Settings → Notifications → Send notifications » dans Tether. Tether garde cette option et sa plage horaire séparément pour chaque Mac appairé. Elle est désactivée par défaut sur chaque Mac, et iOS demande l’autorisation quand vous l’activez. L’app iOS n’est pas encore sur l’App Store : compilez-la depuis `tether/ios` avec Xcode. « Tailscale only » demande quand même une adresse Wi-Fi ou Ethernet sur le Mac (la passerelle ne démarre qu’avec une telle adresse). Le journal d’accès est propre à chaque Mac et ne garde que les 200 tentatives les plus récentes ; une tentative répétée en moins d’une minute augmente de un le compteur de la même ligne. Chaque notification indique le Mac et le projet du chat (`Studio Mac · recipe-box`), le titre du chat et le texte : Turn finished affiche la dernière réponse de l’agent. Avec la clé APNs, ce texte passe par le service push d’Apple. Le verrouillage de Tether ne masque pas les aperçus des notifications sur l’écran verrouillé de l’iPhone : désactivez-les dans les Réglages d’iOS. Les points verts de Tether suivent le Mac : une conversation que vous ouvrez dans dsh perd aussi son point sur le téléphone. Une conversation que vous ouvrez dans Tether perd son point seulement sur les téléphones. Le point de dsh sur le Mac reste jusqu’à ce que vous ouvriez la conversation sur le Mac.
261
- - **Ordinateurs distants** a besoin de Tailscale sur les deux Mac, et de Composer Plus avec cette fonction activée sur le Mac que vous ouvrez. Ce Mac doit être éveillé, avec dsh en cours d’exécution. Le sélecteur n’apparaît que si la barre latérale gauche est ouverte (pas quand elle n’affiche que des icônes). La page de l’autre Mac n’affiche le sélecteur que si ce Mac a cette version de Composer Plus ou une version plus récente. Avec une version plus ancienne, un bouton **Revenir à ce Mac** apparaît en haut après quelques secondes. Chaque ordinateur que vous avez ouvert garde sa page en mémoire jusqu’à ce que vous désactiviez la fonction ou redémarriez dsh. Dans l’app de bureau, la page de l’autre Mac est une page intégrée : les raccourcis clavier de dsh (par exemple une nouvelle discussion) n’y fonctionnent pas, et les téléchargements de fichiers, le microphone et les notifications n’y fonctionnent pas non plus. La fonction utilise le port 19392 (un seul dsh par Mac peut laisser entrer d’autres ordinateurs). Depuis la page d’un autre Mac, le sélecteur ne propose que les ordinateurs de ce Mac : vous ne pouvez pas ouvrir un troisième Mac à travers l’autre Mac.
263
+ - **Ordinateurs distants** a besoin de Tailscale sur les deux Mac, et de Composer Plus avec cette fonction activée sur le Mac que vous ouvrez. Ce Mac doit être éveillé, avec dsh en cours d’exécution. Le sélecteur n’apparaît que si la barre latérale gauche est ouverte (pas quand elle n’affiche que des icônes). Si la page de l’autre Mac n’a pas son propre sélecteur (une version de Composer Plus antérieure à 1.23.0 là-bas), le sélecteur de ce Mac s’affiche au même endroit, par-dessus cette page. Avec la version 1.23.0 là-bas, le sélecteur affiche le nom de l’autre Mac : choisissez **Ce Mac** dans son menu pour revenir. Chaque ordinateur que vous avez ouvert garde sa page en mémoire jusqu’à ce que vous désactiviez la fonction ou redémarriez dsh. Dans l’app de bureau, la page de l’autre Mac est une page intégrée : les raccourcis clavier de dsh (par exemple une nouvelle discussion) n’y fonctionnent pas, et les téléchargements de fichiers, le microphone et les notifications n’y fonctionnent pas non plus. La fonction utilise le port 19392 (un seul dsh par Mac peut laisser entrer d’autres ordinateurs). Depuis la page d’un autre Mac, le sélecteur ne propose que les ordinateurs de ce Mac : vous ne pouvez pas ouvrir un troisième Mac à travers l’autre Mac.
262
264
  - Un lien de session fonctionne dans les discussions ; un clic dessus n’ouvre pas la discussion. Un lien créé avec **Copier le lien du message** n’ouvre son message que sur dsh 0.2.1 et versions ultérieures, et seulement depuis un message dans une discussion (dsh 0.2.0 n’a pas de règles de texte utilisateur : le lien y est copié, mais s’affiche comme texte simple). Un message qu’une annulation a retiré, ou que la compaction a enlevé de l’historique que dsh charge, ne peut pas être affiché : le lien le dit alors. Les boutons 🔗 s’attachent aux lignes de message de dsh ; si une mise à jour de dsh change ce balisage, ils ne s’affichent pas.
263
265
  - **Tout marquer comme lu** change les points non lus de dsh lui-même par une partie de dsh qui n’est pas une API publique (la liste `completionUnread` de l’état des sessions de dsh). Si une mise à jour de dsh la renomme, l’élément ne s’affiche pas. L’élément va dans le menu « … » du projet de dsh, qui n’a pas d’emplacement pour les plugins ; si dsh change ce menu, l’élément ne s’affiche pas non plus.
264
266
  - **Modifier sur place un message en file d’attente** ne change pas un message dont l’envoi a commencé entre-temps et n’écrase pas un message modifié entre-temps (par exemple dans Tether sur l’iPhone) : un avis le signale. Une nouvelle image demande un modèle qui accepte les images (les limites d’image propres à dsh s’appliquent), et un nouveau fichier doit finir de se téléverser avant que vous puissiez enregistrer. Seuls vos propres messages en file d’attente peuvent être modifiés : pas une itération d’objectif ni une réponse à une question dans la file. Après une mise à jour du plugin, seules les modifications de texte fonctionnent tout de suite : redémarrez dsh avant d’enregistrer un message avec des images ou des fichiers (la partie hôte se charge au démarrage).
@@ -294,6 +296,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
294
296
  - **Pack de skill turc** installe un skill tiers : ses règles viennent du dépôt GitHub de son auteur, pas de Composer Plus, et une nouvelle version sert dès la vérification quotidienne suivante, sans relecture de notre part. La vérification prouve que les fichiers sont ceux que GitHub liste pour ce commit, pas que les règles sont bonnes. Le modèle décide quand charger le skill (vous pouvez aussi l’appeler par son nom) ; les règles ne s’appliquent qu’aux textes turcs. La partie hôte utilise la langue qu’un navigateur a signalée en dernier : si deux navigateurs utilisent des langues différentes, la plus récente l’emporte. GitHub autorise 60 appels d’API par heure sans connexion ; une vérification refusée garde la copie installée et affiche la raison dans les réglages.
295
297
  - **Démêler le code** contient une copie fixe de la compétence (caldoai/skills, commit f3cf477) : une modification de l’original n’arrive qu’avec une nouvelle version de Composer Plus. La compétence exécute un long objectif qui peut modifier de nombreux fichiers, et ses sous-agents et vérifications consomment beaucoup de jetons. Là où le projet n’a pas de tests, elle peut changer le comportement sans prévenir : lancez-la sur une branche et lisez le diff avant de fusionner. Une compétence du même nom dans le projet, dans un dossier de compétences personnalisé ou dans `~/.dsh/skills` la remplace. Tant que l’interrupteur est désactivé, `/untangle-codebase` part au modèle comme simple texte.
296
298
  - **Tableau des tâches** montre les discussions que dsh liste dans cette fenêtre : une discussion hors d’un projet n’apparaît que dans **Tous les projets**, et le dossier d’une branche par discussion (`<project>/.worktrees/<name>`) compte comme son projet. La colonne d’une carte est l’état en direct de la discussion, on ne peut donc pas faire glisser les cartes : une discussion passe dans **Terminé** quand son tour se termine, aussi après une erreur ou un arrêt, et revient dans **En cours** quand elle repart. Le point vert est le point « terminé » de dsh, que dsh ne garde que dans cette fenêtre : après un rechargement, les discussions terminées s’affichent sans lui. **Terminé** montre les 50 discussions les plus récentes (**Afficher N plus anciennes** montre le reste). **Rechercher des projets** trouve un projet par son nom uniquement, pas par le chemin de son dossier. **Actifs au cours des 2 dernières heures** masque un projet quand toutes ses discussions ont plus de 2 heures, sont inactives et lues ; le tableau affiche toujours le projet que vous avez choisi. **Nouvelle tâche** ne retient que la nouvelle discussion la plus récente de cette fenêtre : quand vous ouvrez une autre discussion avant le premier message, cette discussion reste en haut de **En cours** sous le nom **Nouvelle tâche** jusqu’à ce que vous y écriviez, mais le tableau ne revient de lui-même que pour la plus récente. Après un rechargement, une nouvelle discussion sans message n’est pas sur le tableau (dsh la garde comme sa Nouvelle session vide). Les étiquettes viennent d’un appel au modèle par tâche, à partir de son premier message : elles peuvent être fausses, et une discussion que vous n’avez pas lancée depuis le tableau n’en a pas. Le titre est le titre de discussion de dsh (le service de titres de dsh, avec le modèle de la discussion) ; en attendant, la carte affiche la première ligne du premier message. **×** et **Tout retirer** retirent seulement des cartes du tableau : aucune discussion n’est supprimée. **Annuler** ne s’affiche que pendant 8 secondes, dans cette fenêtre ; plus tard, **Retirées (N)** → **Remettre** fait revenir une carte, et une discussion qui s’exécute de nouveau revient d’elle-même. **Tout retirer** demande d’abord et retire les cartes terminées et lues du projet affiché (de tous les projets avec **Tous les projets**), aussi celles derrière **Afficher N plus anciennes** ; une carte non lue (verte) reste. dsh ne garde son point vert que dans cette fenêtre : après un rechargement, Tout retirer peut donc retirer une carte dont vous n’avez pas lu la réponse. La liste est gardée sur ce Mac pour toutes les fenêtres et pour Tether ; quand elle compte 5 000 discussions, les plus anciennes reviennent. **Répondre** ne répond qu’à la demande la plus récente de la discussion : quand la demande a reçu une réponse ailleurs (une autre fenêtre, Tether, la revue automatique) ou que la discussion demande autre chose, le panneau l’indique et n’envoie rien. Les versions précédentes avaient une liste de tâches avec des commentaires et des outils pour les agents ; ils n’existent plus, et l’ancien `board.json` n’est pas affiché. L’idée et l’apparence viennent de [Kanzo](https://github.com/emanuele-em/kanzo) par emanuele-em (AGPL-3.0) ; Composer Plus n’en utilise aucun code. `Cmd+Shift+K` est un raccourci dsh : dans un navigateur sous Linux, il n’a pas de touche par défaut (définissez-en une dans la page des raccourcis clavier de dsh), et une extension du navigateur ou une autre application peut la prendre avant. Une carte quitte **Terminé** quand le point vert de dsh disparaît (vous avez ouvert la discussion) ou, pour une discussion terminée derrière le tableau alors qu’elle était la discussion ouverte, quand cette discussion s’affiche sans panneau par-dessus. Cet état « lu » ne vit que dans cette fenêtre de dsh, comme les points de dsh : après un rechargement ou dans une autre fenêtre, chaque discussion terminée compte comme lue, donc elle est dans **Terminées récemment**.
299
+ - **Assistant** a une seule discussion pour toutes les fenêtres de ce Mac. Il s’exécute avec le mode d’autorisation workspace-write : il n’écrit des fichiers que dans `~/Assistant`, et une commande hors de ce dossier demande d’abord. Quand vous passez la discussion à un mode sans approbations (Accès complet), dsh refuse chaque approbation, donc l’assistant ne peut ni envoyer, ni lancer, ni arrêter, ni archiver une discussion. La carte d’approbation ne protège que les six outils : une commande shell de l’assistant peut toujours atteindre le réseau, comme dans toute discussion avec ce mode. Sur dsh 0.2.0 et 0.2.1, les outils de planification de dsh ne voient que les rappels de la discussion de l’assistant elle-même, pas les automatisations des autres discussions ; à partir de dsh 0.2.2, ils listent et modifient toutes les tâches planifiées. chats_list laisse de côté les discussions archivées, vides et de sous-agents, ainsi que la discussion de l’assistant elle-même ; « en attente de vous » signifie une approbation, une question ou une revue de plan ouverte dans une discussion en cours. chat_read donne les messages de l’utilisateur et les réponses de l’agent (sans sortie d’outil), au plus 50 messages et environ 24 000 caractères. chat_archive refuse une discussion qui tourne encore ou qui a des rappels actifs. Un texte que le modèle lit peut quand même le tromper : la carte d’approbation est la dernière vérification, alors lisez-la avant de cliquer sur **Autoriser une fois**.
297
300
  - **Priorité au message envoyé après Arrêter** n’agit qu’après l’arrêt de la discussion (ou après un tour qui a échoué, ou à l’ouverture d’une discussion qui a encore une file) : un message envoyé pendant qu’un tour s’exécute attend toujours à la fin de la file. Il ne passe que devant vos propres messages en file : si un tour d’objectif ou une réponse à une question attend dans la file, l’ordre de dsh reste. Il lit une partie de dsh qui n’est pas une API publique (si le tour arrêté est encore en train de se terminer) ; si une mise à jour de dsh la renomme, le message ne passe devant qu’une fois ce tour terminé. Les discussions de sous-agents gardent l’ordre de dsh.
298
301
  - **Mémoire du projet** appartient au premier dossier de la discussion (le dossier de projet de dsh) : une discussion qui change de dossier avec `cd` garde la mémoire de son premier projet, et le même dossier ouvert par un autre chemin vers les mêmes fichiers la partage. Une discussion fige sa section de mémoire à son début : une note enregistrée plus tard apparaît donc à partir de la discussion suivante (`memory_recall` la trouve tout de suite). La revue garde seulement ce que le modèle décide de garder : elle peut manquer un fait ou en garder un faux ; vérifiez-les dans **Ouvrir la mémoire** et modifiez-les là, ou modifiez les fichiers à la main quand dsh est fermé. **Ouvrir la mémoire** envoie les notes du projet sélectionné et les notes globales (tous les projets quand vous sélectionnez Toutes les notes ; au plus environ 60 000 caractères, le reste est seulement compté et ne peut pas changer dans cette demande) et votre texte au modèle par défaut de dsh, pas au modèle de la discussion. Un aperçu est gardé sur le Mac 30 minutes et jusqu’au redémarrage de dsh ; si une revue ou l’agent modifie les notes entre-temps, **Appliquer** refuse et vous redemandez un aperçu. **Appliquer** enregistre toutes les modifications d’un aperçu ou aucune : si une modification ne peut pas être enregistrée (par exemple, MEMORY.md est plein), les notes restent telles quelles et la raison s’affiche. Chaque tour terminé avec un message de vous coûte un appel au modèle ; un appel en échec relit les mêmes messages après le tour suivant. Les discussions de sous-agents ne sont pas revues. L’idée et le format de fichier viennent de [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0) ; Composer Plus n’utilise pas son code et ne lit ni n’écrit jamais la mémoire propre de DS Bot.
299
302
  - **Historique des versions de la mémoire** garde les 50 versions les plus récentes de chaque mémoire (chaque projet et la mémoire globale) ; les plus anciennes sont supprimées. Une version contient toute la mémoire de ce projet, pas une seule note. **Restaurer** remet tous les fichiers de cette version (sujets compris) et refuse si la mémoire a changé après l’ouverture de la version ; la mémoire d’avant la restauration devient une nouvelle version : vous pouvez donc l’annuler. Quand l’interrupteur est désactivé, aucune nouvelle version n’est gardée et **Restaurer** refuse ; les versions gardées restent. Aucune version n’existe d’avant cette fonction : l’historique commence au premier enregistrement après son installation.
@@ -347,6 +350,8 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
347
350
 
348
351
  **Puis-je voir toutes mes discussions sous forme de tableau kanban et en lancer de nouvelles depuis ce tableau ?** Oui, avec **Tableau des tâches** (activé par défaut) : ouvrez-le dans la barre latérale gauche. Chaque discussion est une carte dans **En cours**, **En revue** (elle vous attend) ou **Terminé**. **Nouvelle tâche** ouvre la nouvelle discussion de dsh dans le projet, et le tableau revient quand votre premier message part ; cliquez sur **Répondre** sur une carte orange pour y répondre sans ouvrir la discussion. **Tout retirer**, dans **Terminé**, demande d’abord et retire du tableau les cartes terminées que vous avez lues ; **Annuler** et **Retirées (N)** les font revenir, et les discussions restent dans dsh.
349
352
 
353
+ **Puis-je avoir une discussion d’assistant personnel qui me fait des rappels et gère mes autres discussions ?** Oui, avec **Assistant** (désactivé par défaut) : activez-le dans Réglages → Composer Plus, puis cliquez sur **Assistant** dans la barre latérale gauche. Il crée des rappels avec les tâches planifiées de dsh, cherche sur le web, liste et lit vos discussions, et n’envoie un message à une discussion, ou n’en lance, n’en arrête ou n’en archive une, qu’après votre approbation. Gardez votre profil dans la mémoire de son projet, sujet "profil".
354
+
350
355
  **dsh peut-il sauvegarder mes discussions et mes réglages, comme dsh-backup ?** Oui : **Réglages → Composer Plus → Sauvegarde → Sauvegarder maintenant**. Il écrit le même format d’archive dans le même dossier (`~/Desktop/dsh-backups`) : les archives de dsh-backup s’affichent donc aussi et se restaurent, et vous pouvez supprimer dsh-backup. Activez **Sauvegarde automatique** pour des sauvegardes planifiées.
351
356
 
352
357
  **dsh ne démarre plus. Comment restaurer une sauvegarde ?** Ouvrez le dossier de sauvegarde (`~/Desktop/dsh-backups`) et double-cliquez sur `Composer Plus Rescue.command` (Linux : `composer-plus-rescue.sh`, Windows : `Composer Plus Rescue.cmd`). Choisissez `3) Restore a backup`, sélectionnez-en une et tapez `RESTORE`. Cela fonctionne sans dsh.
@@ -389,7 +394,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
389
394
 
390
395
  **J’ai perdu mon iPhone. Comment l’empêcher d’accéder à mon Mac ?** Cliquez sur **Connexion mobile** en bas à gauche de la barre latérale, puis sur **Remove** à côté de cet iPhone. Sa clé cesse tout de suite de fonctionner ; il ne peut revenir qu’avec un nouvel appairage que vous approuvez sur le Mac.
391
396
 
392
- **Comment poursuivre une discussion de mon autre Mac depuis celui-ci ?** Sur l’autre Mac, activez **Réglages → Composer Plus → Ordinateurs distants** et **Autoriser d’autres ordinateurs à ouvrir ce Mac**, cliquez sur **Créer un lien d’appairage** et copiez le lien (envoyez-le-vous, par exemple avec AirDrop ou Notes). Sur ce Mac, activez aussi **Ordinateurs distants**, choisissez **Ajouter un ordinateur…** dans le sélecteur de la barre latérale gauche (à droite du nom de la marque, au-dessus de **Nouvelle session**), collez le lien, saisissez un **Nom** et cliquez sur **Connecter**. Cliquez ensuite sur **Approuver** sur l’autre Mac. Par la suite, choisissez cet ordinateur dans le même menu : il remplit cette fenêtre. Choisissez **Ce Mac** au même endroit pour revenir. Pendant ce temps, les discussions de ce Mac continuent de tourner.
397
+ **Comment poursuivre une discussion de mon autre Mac depuis celui-ci ?** Sur l’autre Mac, activez **Réglages → Composer Plus → Ordinateurs distants** et **Autoriser d’autres ordinateurs à ouvrir ce Mac**, cliquez sur **Créer un lien d’appairage** et copiez le lien (envoyez-le-vous, par exemple avec AirDrop ou Notes). Sur ce Mac, activez aussi **Ordinateurs distants**, choisissez **Ajouter un ordinateur…** dans le sélecteur de la barre latérale gauche (à droite du nom de la marque, au-dessus de **Nouvelle session**), collez le lien, saisissez un **Nom** et cliquez sur **Connecter**. Cliquez ensuite sur **Approuver** sur l’autre Mac. Par la suite, choisissez cet ordinateur dans le même menu : il remplit cette fenêtre. Cliquez sur **Revenir à ce Mac** au même endroit pour revenir. Pendant ce temps, les discussions de ce Mac continuent de tourner.
393
398
 
394
399
  **Puis-je verrouiller Tether avec Face ID ?** Oui : dans Tether, activez « Settings → Privacy → Lock with Face ID ». Tether demande alors Face ID (ou le code) à l’ouverture et quand vous y revenez.
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```sh