dsh-composer-plus 1.18.0 → 1.19.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 +13 -12
- package/README.es.md +13 -12
- package/README.fr.md +13 -12
- package/README.hi.md +13 -12
- package/README.id.md +13 -12
- package/README.ja.md +13 -12
- package/README.ko.md +13 -12
- package/README.md +13 -12
- package/README.pt-BR.md +13 -12
- package/README.ru.md +13 -12
- package/README.tr.md +13 -12
- package/README.vi.md +13 -12
- package/README.zh.md +13 -12
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/taskBoard.webp +0 -0
- package/client.js +424 -620
- package/index.js +167 -506
- package/package.json +3 -2
- package/release-notes.json +18 -0
- package/tether/gateway/server.mjs +1 -1
package/README.fr.md
CHANGED
|
@@ -14,7 +14,7 @@ Des fonctions pratiques dans le style de Codex pour l’interface de bureau et w
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness avec Composer Plus : le projet en cours affiche un indicateur de chargement dans la barre latérale et le panneau des modifications affiche un diff git"></p>
|
|
16
16
|
|
|
17
|
-
Plugin communautaire non officiel. Les seuls appels réseau servent à la recherche de mises à jour (versions GitHub et registre npm) ; désactivez **Mises à jour automatiques** pour les arrêter au démarrage. **Idées de fonctionnalités** n’appelle le modèle de votre discussion que lorsque vous cliquez sur **Suggérer des fonctionnalités**. **Prédiction du message suivant** (activée par défaut) appelle le modèle choisi dans les Réglages (celui par défaut de dsh, sauf si vous en choisissez un autre) une fois après chaque tour terminé, sans clic. Désactivez-la dans **Réglages → Composer Plus** pour arrêter ces appels. **Compléter pendant la saisie** (désactivé par défaut) appelle le modèle choisi pour cette fonctionnalité (par défaut, celui de la prédiction) à chaque pause pendant la saisie, une fois que vous l’avez activé. **Améliorer le prompt** n’appelle un modèle que lorsque vous cliquez sur sa baguette magique. **Vérification de l’objectif** (activée par défaut) appelle un modèle une fois chaque fois que l’agent marque un `/goal` comme terminé lors d’une itération automatique. **Connexion mobile** (désactivée par défaut) accepte les connexions d’iPhone depuis votre réseau local ou votre tailnet, et seulement après que vous l’avez activée.
|
|
17
|
+
Plugin communautaire non officiel. Les seuls appels réseau servent à la recherche de mises à jour (versions GitHub et registre npm) ; désactivez **Mises à jour automatiques** pour les arrêter au démarrage. **Idées de fonctionnalités** n’appelle le modèle de votre discussion que lorsque vous cliquez sur **Suggérer des fonctionnalités**. **Prédiction du message suivant** (activée par défaut) appelle le modèle choisi dans les Réglages (celui par défaut de dsh, sauf si vous en choisissez un autre) une fois après chaque tour terminé, sans clic. Désactivez-la dans **Réglages → Composer Plus** pour arrêter ces appels. **Compléter pendant la saisie** (désactivé par défaut) appelle le modèle choisi pour cette fonctionnalité (par défaut, celui de la prédiction) à chaque pause pendant la saisie, une fois que vous l’avez activé. **Améliorer le prompt** n’appelle un modèle que lorsque vous cliquez sur sa baguette magique. **Tableau des tâches** appelle le modèle de la nouvelle discussion une fois pour les étiquettes de chaque tâche que vous lancez depuis le tableau. **Vérification de l’objectif** (activée par défaut) appelle un modèle une fois chaque fois que l’agent marque un `/goal` comme terminé lors d’une itération automatique. **Connexion mobile** (désactivée par défaut) accepte les connexions d’iPhone depuis votre réseau local ou votre tailnet, et seulement après que vous l’avez activée.
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
@@ -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.
|
|
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.19.0`.
|
|
33
33
|
|
|
34
34
|
## Fonctionnalités
|
|
35
35
|
|
|
@@ -71,11 +71,11 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
71
71
|
| **Étapes planifiées** | <a id="feature-plannedsteps"></a>Désactivée par défaut : activez-la dans **Réglages → Composer Plus**. L’agent reçoit l’outil `plan_next_steps` : dans le même message qu’une commande, il peut planifier les commandes suivantes avec leurs arguments exacts et une condition, par exemple « lance `npm test` quand la compilation réussit ». Quand le résultat remplit la condition, Composer Plus exécute lui-même l’étape suivante, sans nouvel appel au modèle, et une longue discussion consomme moins de jetons. L’étape apparaît dans la discussion sous forme d’une courte ligne, « Composer Plus · Planned steps: ran `test` … without a model call », suivie de son appel d’outil et de son résultat. Uniquement des étapes `bash`, `read`, `grep` et `glob` ; les approbations, le sandbox et Fichiers protégés s’appliquent à chaque étape comme d’habitude. Le modèle répond de nouveau quand une condition échoue, quand deux étapes sont prêtes en même temps, après la dernière étape et quand vous envoyez un message. L’idée vient de HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Capture d’écran : Étapes planifiées"></a> |
|
|
72
72
|
| **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> |
|
|
73
73
|
| **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> |
|
|
74
|
-
| **Tableau des tâches** | <a id="feature-taskboard"></a>Barre latérale gauche → **Tableau des tâches**. Un tableau kanban de vos
|
|
74
|
+
| **Tableau des tâches** | <a id="feature-taskboard"></a>Barre latérale gauche → **Tableau des tâches**. 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 est dans **Terminé** (en vert jusqu’à ce que vous l’ouvriez). Choisissez un projet ou **Tous les projets** à gauche ; le dossier d’une branche par discussion compte comme son projet. **Nouvelle tâche** (ou `n`) ne demande qu’un prompt : `Enter` lance une nouvelle discussion dans le projet, la carte s’affiche dans **À faire**, dsh nomme la discussion et le modèle de la discussion écrit jusqu’à 3 étiquettes. Cliquez sur une carte pour ouvrir sa discussion. Sur une carte orange, cliquez sur **Répondre** pour y répondre depuis le tableau : **Refuser** ou **Autoriser une fois**, **Approuver** ou **Demander des modifications** pour un plan, ou les options et votre propre texte pour une question. **Masquer les terminées** masque **Terminé** sur cet appareil. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Capture d’écran : Tableau des tâches"></a> |
|
|
75
75
|
| **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> |
|
|
76
76
|
| **Autoriser pour cette discussion** | <a id="feature-allowforchat"></a>Quand la revue automatique vous demande votre avis, la carte d’approbation propose **Autoriser pour cette discussion** : le même outil dans la même discussion est ensuite autorisé, quels que soient les arguments, jusqu’à la fin de la limite de temps (1 heure par défaut ; choisissez-la dans **Réglages → Composer Plus → Autoriser pour cette discussion**). Ensuite, l’agent demande à nouveau. Une pastille dans l’en-tête liste les autorisations avec leur heure de fin et permet de les révoquer. Les autorisations restent valables après un redémarrage. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Capture d’écran : Autoriser pour cette discussion"></a> |
|
|
77
77
|
| **Statut du projet** | <a id="feature-projectstatus"></a>La ligne d’un projet dans la barre latérale affiche le même indicateur en cours / en attente / terminé que ses discussions : même replié, un projet vous indique donc qu’une discussion travaille ou a besoin de vous. Une discussion qui vous attend s’affiche en premier, puis une discussion terminée que vous n’avez pas encore ouverte (le point vert, même pendant qu’une autre discussion est encore en cours), puis l’indicateur en cours. Survolez-le pour voir les détails. Dans **Arborescence des espaces de travail**, la ligne d’un dossier parent affiche aussi les discussions de chaque projet qu’il contient (par exemple chaque dossier de branche dans `.worktrees/`), même quand il est replié. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Capture d’écran : Statut du projet"></a> |
|
|
78
|
-
| **Branche Git sur les lignes de discussion** | <a id="feature-sessionbranch"></a>
|
|
78
|
+
| **Branche Git sur les lignes de discussion** | <a id="feature-sessionbranch"></a>Dans la vue « Dans une seule liste » de la barre latérale, chaque ligne de discussion affiche une petite pastille grise avec la branche git sur laquelle se trouvait le dossier du projet de la discussion lors de son dernier tour (par exemple `main` ou `feature/login` ; un HEAD détaché n’a pas de branche et n’affiche pas de pastille). Deux discussions d’un même projet sur des branches différentes ne se ressemblent plus, et vous voyez tout de suite quand vous allez continuer une discussion sur la mauvaise branche. Survolez la pastille pour voir le nom complet. La partie hôte lit la branche (`git branch --show-current`, en lecture seule) au début et à la fin de chaque tour ; une discussion sans tour depuis que vous avez installé cette fonctionnalité, ou un dossier qui n’est pas un dépôt git, n’affiche pas de pastille. Dans « Espace de travail » et « Arborescence des espaces de travail », aucune ligne de discussion n’affiche la pastille, car la discussion est déjà sous la ligne de son projet. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Capture d’écran : Branche Git sur les lignes de discussion"></a> |
|
|
79
79
|
| **Tout marquer comme lu** | <a id="feature-markprojectread"></a>Dans la barre latérale, cliquez sur le bouton **…** d’un projet → **Tout marquer comme lu**. Le point vert non lu disparaît d’un coup de toutes les discussions de ce projet ; les autres projets gardent le leur. L’élément est grisé (**Aucune discussion non lue**) quand le projet n’en a aucune. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Capture d’écran : Tout marquer comme lu"></a> |
|
|
80
80
|
| **Projets actifs en premier** | <a id="feature-activeprojectsfirst"></a>Quand une discussion commence à s’exécuter ou a besoin de vous, son projet monte en haut de la barre latérale avec l’animation de ligne de dsh (le même mouvement que si vous l’y faisiez glisser). Les projets terminés restent à leur place ; faites-les glisser où vous voulez, comme d’habitude. Les déplacements sont enregistrés dans l’ordre des projets de dsh : si vous désactivez cette fonctionnalité, l’ordre actuel reste. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Capture d’écran : Projets actifs en premier"></a> |
|
|
81
81
|
| **Filtre des projets récents** | <a id="feature-recentprojects"></a>Barre latérale → options d’affichage (icône de curseurs) → **Actifs au cours des 2 dernières heures**. Tant que cette option est sélectionnée, la barre latérale n’affiche que les projets qui ont une discussion active au cours des 2 dernières heures : une discussion mise à jour pendant ce temps, une discussion en cours ou en attente, la discussion ouverte, ou une discussion terminée que vous n’avez pas encore ouverte (le point vert « terminé » de dsh), même après les 2 heures. Les projets sans une telle discussion sont masqués, y compris les projets nouveaux et vides. Dans **Arborescence des espaces de travail**, un dossier parent reste affiché tant qu’un projet qu’il contient est actif, et les discussions qui n’ont pas été actives au cours des 2 dernières heures sont aussi masquées, si bien que seules les discussions récentes sont affichées. Sélectionnez de nouveau l’option pour afficher tous les projets. Le choix est conservé sur cet appareil. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Capture d’écran : Filtre des projets récents"></a> |
|
|
@@ -85,7 +85,7 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
85
85
|
| **Ouvrir la discussion en attente en cas d’inactivité** | <a id="feature-idleswitch"></a>Quand une discussion pose une question, attend une approbation ou une revue du plan (le point orange) ou termine un tour que vous n’avez pas encore lu (le point vert), et que vous n’utilisez pas dsh pendant 30 secondes, dsh ouvre cette discussion. Les discussions orange s’ouvrent avant les vertes. Dans chaque groupe, celle qui attend depuis le plus longtemps s’ouvre en premier ; la suivante s’ouvre après 30 autres secondes sans utilisation. Une touche, un clic, un mouvement de souris, la molette ou un toucher relancent les 30 secondes. Du texte dans le champ qui a le focus, du texte sélectionné, ou un menu ou une boîte de dialogue ouverts empêchent aussi le changement. Tant qu’une discussion en attente est à l’écran, rien ne change. Si vous quittez une discussion en attente sans répondre, elle peut se rouvrir après les 30 secondes suivantes sans utilisation. Quand une discussion verte s’ouvre, son point disparaît ; la discussion verte suivante ne s’ouvre qu’après que vous avez de nouveau utilisé dsh, puis 30 secondes sans utilisation. Cela fonctionne aussi quand dsh est en arrière-plan, mais dsh ne passe pas au premier plan. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Capture d’écran : Ouvrir la discussion en attente en cas d’inactivité"></a> |
|
|
86
86
|
| **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> |
|
|
87
87
|
| **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> |
|
|
88
|
-
| **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
|
|
88
|
+
| **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. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Capture d’écran : Mises à jour automatiques"></a> |
|
|
89
89
|
| **Sauvegarde** | <a id="feature-backup"></a>Réglages → Composer Plus → **Sauvegarde** → **Sauvegarder maintenant** écrit tout votre dossier personnel de dsh (discussions, réglages, plugins, MCP, compétences) dans une seule archive dans `~/Desktop/dsh-backups`, avec une somme de contrôle. Les secrets sont masqués dans l’archive : les fichiers d’identifiants, les fichiers de clés (`.pem`, `.key`) et les valeurs token, secret et password des réglages yml restent uniquement sur cet ordinateur, dans le `vault` du dossier. `cache/`, `dsh-runtimes/` et `node_modules` ne vont pas dans l’archive (dsh les recrée). Chaque sauvegarde de la liste a **Vérifier** (la lit entièrement), **Pour un autre ordinateur** (un dossier à copier sur le nouvel ordinateur, avec la console de secours) et **Supprimer**. Les archives de dsh-backup dans le même dossier s’affichent et fonctionnent aussi. Pour restaurer, quittez dsh et utilisez la console de secours. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Capture d’écran : Sauvegarde"></a> |
|
|
90
90
|
| **Sauvegarde automatique** | <a id="feature-autobackup"></a>Activez **Sauvegarde automatique** (désactivée par défaut : chaque copie est à peu près aussi grande que votre dossier personnel de dsh sans son cache). Choisissez la fréquence (**Toutes les** : de 6 heures à 7 jours, 24 heures par défaut) et le nombre de sauvegardes conservées (**Conserver** : de 3 à 14, 7 par défaut). L’heure de la prochaine sauvegarde s’affiche sous l’interrupteur ; une sauvegarde qui a échoué s’y affiche aussi et est relancée 30 minutes plus tard. Quand dsh ou Composer Plus démarre avec une nouvelle version, un instantané est pris peu après le démarrage, avant que la nouvelle version ait longtemps utilisé vos données (les deux plus récents restent, marqués **Avant une mise à niveau**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Capture d’écran : Sauvegarde automatique"></a> |
|
|
91
91
|
| **Vérification des journaux de session** | <a id="feature-sessiondoctor"></a>**Vérifier les journaux de session** lit le journal de chaque discussion et liste ceux que dsh ne peut pas ouvrir (une trame cassée, un enregistrement coupé, un mauvais numéro de séquence). Une fin incomplète n’est pas listée : dsh la répare lui-même. **Réparer depuis les sauvegardes** remet la copie de la sauvegarde la plus récente qui en contient une saine et garde le fichier endommagé à côté (`.corrupt-<heure>`). Les messages écrits après cette sauvegarde ne sont pas dans la copie. Une discussion ouverte dans ce dsh n’est pas réparée ici : quittez dsh et réparez-la dans la console de secours. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Capture d’écran : Vérification des journaux de session"></a> |
|
|
@@ -169,7 +169,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
169
169
|
- **Vérification de l’objectif :** elle ne s’exécute que quand l’agent marque un `/goal` comme terminé lors d’une itération automatique (ou quand vous cliquez sur **Lancer maintenant**). La partie hôte exécute la commande de test dans le dossier de la discussion avec le mode sandbox de la discussion (comme l’outil `bash` de dsh lui-même : la même politique d’accès aux fichiers ; quand ce sandbox ne peut pas démarrer, le test ne s’exécute pas et la vérification échoue). Pour trouver la commande, elle ne lit que `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` et `pytest.ini`, comme fichiers ordinaires dans le dossier (aucun lien symbolique hors du dossier, aucune FIFO). Elle envoie ensuite l’objectif, la discussion depuis le début de l’objectif (vos messages, les réponses de l’agent, les appels d’outils coupés à 1 000 caractères et les 2 000 derniers caractères de chaque résultat d’outil ; sans raisonnement ni étapes retirées par une annulation ; environ 60 000 caractères au plus, la partie la plus récente), `git status --short` et la fin de la sortie du test au modèle choisi sous **Vérification de l’objectif** (par défaut, le modèle de la discussion), en une seule requête sans outils. La sortie des outils peut contenir ce que l’agent a lu : cette requête peut donc contenir des parties de vos fichiers, comme la discussion elle-même. Rien n’est écrit dans la discussion ni dans le projet. Votre commande de test, les limites, le dernier résultat (avec la fin de sa sortie) et le modèle choisi sont dans `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (fichier réservé au propriétaire, les 500 discussions les plus récentes).
|
|
170
170
|
- **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.
|
|
171
171
|
- **Répartition du contexte :** la partie hôte lit seulement le journal de la discussion ; aucun appel au modèle, aucun fichier du projet.
|
|
172
|
-
- **Tableau des tâches :** le tableau
|
|
172
|
+
- **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. Quand vous lancez une tâche, la partie hôte crée une nouvelle discussion dans le projet choisi et lui envoie votre prompt comme premier message, comme si vous l’aviez tapé dans la discussion : les approbations, le sandbox et le modèle de la discussion s’appliquent donc comme d’habitude. Ensuite, elle envoie le prompt (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) ; 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.
|
|
173
173
|
- **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.
|
|
174
174
|
- **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.
|
|
175
175
|
- **Mémoire du projet :** désactivée tant que vous ne l’activez pas. Quand elle est activée, après chaque tour terminé d’une discussion de premier niveau, la partie Host envoie les nouveaux messages de la discussion depuis la dernière revue (vos messages et les réponses texte de l’agent ; pas de sortie d’outils, pas de raisonnement, pas de contexte caché, pas de messages annulés ; la copie de la discussion parente dans une discussion dérivée est laissée de côté ; au plus environ 16 000 caractères) et les notes enregistrées au modèle de la discussion, en une seule requête sans outils. Les notes sont des fichiers Markdown dans `$DSH_HOME/storages/dsh-composer-plus/memory/` (fichiers réservés au propriétaire) : `projects/<id>/` pour chaque dossier de projet (`<id>` est un hash du chemin réel du dossier ; `project.json` indique le dossier), `global/`, `journal.jsonl` (chaque modification avec la ligne avant et après) et `reviewed.json` (jusqu’où chaque discussion a été lue). Rien n’est écrit dans le dossier du projet. Les notes qui ressemblent à une clé, un jeton, un mot de passe ou un numéro d’identité sont refusées. Les notes d’un projet entrent dans le prompt système de chaque nouvelle discussion de ce dossier : elles vont donc au modèle avec chaque requête de cette discussion. L’interrupteur est dans `memory.json`, au même endroit. **Ouvrir la mémoire** n’envoie rien tant que vous ne cliquez pas sur **Aperçu des modifications** ; ensuite, il envoie les notes affichées et votre texte au modèle par défaut de dsh, en une seule requête sans outils. Les modifications ne sont écrites qu’avec **Appliquer**, avec `editor` dans le journal. Tether lit et modifie les notes par la même route.
|
|
@@ -191,10 +191,10 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
191
191
|
- **Une discussion n’a pas repris après un redémarrage :** Reprendre après redémarrage était désactivée quand dsh s’est fermé, vous avez arrêté ce tour vous-même, le tour était fini (terminé ou en échec), la discussion était archivée, ou plus de 20 discussions étaient en cours (les 20 plus récentes reprennent).
|
|
192
192
|
- **La file d’attente est vide après un redémarrage :** dsh vide lui-même la file d’attente quand il se ferme. Reprendre après redémarrage ne la remet que dans une discussion qu’il reprend ; dans les autres, renvoyez les messages. Un message supprimé juste avant la fermeture peut revenir : supprimez-le de nouveau.
|
|
193
193
|
- **Ouvrir une issue GitHub indique « gh could not open the issue » :** le message est la première ligne de `gh` lui-même. Exécutez `gh auth status` dans un terminal et connectez-vous avec `gh auth login` ; le dossier de la discussion doit avoir un dépôt distant GitHub (`git remote -v`). « not installed or not on the PATH of dsh » signifie que dsh n’a pas trouvé `gh` : installez-le, ou démarrez dsh depuis un terminal où `gh` fonctionne.
|
|
194
|
-
- **Pas de pastille de branche sur une ligne de discussion :** 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).
|
|
194
|
+
- **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).
|
|
195
195
|
- **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.
|
|
196
196
|
- **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é).
|
|
197
|
-
- **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.
|
|
197
|
+
- **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.19.0`) ; voir la note d’installation plus haut.
|
|
198
198
|
- **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.
|
|
199
199
|
- **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.
|
|
200
200
|
- **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.
|
|
@@ -214,6 +214,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
214
214
|
- **Supprimer la discussion** a besoin de l’archivage de dsh (dsh 0.2.0 et versions ultérieures). Une discussion (ou une des discussions de ses sous-agents) qui ne s’arrête pas dans les 15 s, ou qu’un autre dsh détient, reste archivée et rien n’est déplacé. Sur les systèmes autres que macOS, le dossier de corbeille doit être sur le même disque que l’historique des discussions. Une discussion ouverte que vous supprimez reste dans la mémoire de dsh, archivée et masquée, jusqu’au redémarrage de dsh. Videz la Corbeille vous-même ; dsh ne le fait pas.
|
|
215
215
|
- La file d’attente de dsh n’a pas d’action `move` : la partie hôte du plugin déplace donc le message lui-même dans la file d’attente de dsh (une seule modification, le même message). Les messages avec des images ou des fichiers se déplacent aussi. Seuls vos propres messages se déplacent : une itération d’objectif ou une réponse à une question dans la file reste à sa place. Si l’envoi d’un message commence pendant que vous faites glisser, rien n’est déplacé et un avis le signale.
|
|
216
216
|
- dsh 0.2.1 charge une mise à jour immédiatement quand la nouvelle version ne modifie aucun réglage de dsh ; sinon, et sur dsh 0.2.0, redémarrez dsh pour la charger. Le plugin ne redémarre jamais dsh à votre place. Les profils web/CLI sans le gestionnaire de plugins de dsh signalent seulement qu’une nouvelle version existe.
|
|
217
|
+
- **Nouveautés de Composer Plus N** affiche les notes dans la langue de **Langue de l’application**. Une langue d’interface avec une autre région reçoit les notes de sa langue de base (`en-GB` reçoit les notes en anglais, `zh-TW` les notes en chinois de `zh`). Une langue sans notes (ajoutée par un autre pack de langue, ou `pt-PT`, qui n’est pas `pt-BR`) affiche les notes en anglais. Les notes arrivent avec la nouvelle version. Si la copie en cours n’a pas de fichier de notes lisible (`release-notes.json`), la fenêtre affiche les notes en anglais de GitHub.
|
|
217
218
|
- **Autoriser pour cette discussion** compte la limite de temps à partir du moment de l’autorisation. Une nouvelle limite de temps s’applique tout de suite aux autorisations en cours : une limite plus courte peut donc y mettre fin tout de suite. Les autorisations des versions 1.12 et antérieures n’ont pas d’heure : après la mise à jour, l’agent redemande une fois pour ces outils.
|
|
218
219
|
- **Garder le focus dans la zone de saisie** ne rend le focus qu’après une commande `/` ou une compétence. Pendant que dsh résout la commande, la zone de saisie reste en lecture seule pendant quelques millisecondes : les touches tapées pendant ce temps sont perdues. Si le menu `/` de dsh est encore ouvert, `Enter` choisit la ligne en surbrillance et n’envoie pas le message.
|
|
219
220
|
- **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.
|
|
@@ -227,7 +228,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
227
228
|
- **Cette discussion** ne compte que les fichiers écrits par les outils de fichiers de dsh (`write`, `edit`, `str_replace_editor`). Les fichiers modifiés par une commande (`bash`) ne sont pas dans cette vue ; ils apparaissent sous **Non validées**. Sans instantané de l’Annulation de tour pour la discussion (Annulation de tour désactivée, dsh-rewind-plugin installé, ou discussion plus ancienne que le plugin), la vue compare avec le dernier commit et l’indique. L’Annulation de tour garde les 50 instantanés les plus récents d’une discussion : dans une discussion plus longue, la vue compare avec le plus ancien gardé, indique à partir de quel message et ne compte pas les modifications antérieures. **Masquer les modifications d’espaces** correspond à `git diff -w` : une ligne qui n’a changé que par des espaces à l’intérieur est aussi masquée.
|
|
228
229
|
- **Ouvrir une issue GitHub** a besoin de GitHub CLI (`gh`) dans le PATH de dsh et d’un dépôt distant GitHub dans le dossier de la discussion. L’action dure au plus 60 s ; si `gh` met plus longtemps, l’issue peut exister sur GitHub sans son lien dans la liste (avant de cliquer à nouveau, regardez sur GitHub : la liste ne lit le lien que d’une exécution terminée, donc un nouveau clic peut ouvrir une deuxième issue). Un dossier avec plus d’un dépôt distant GitHub utilise la valeur par défaut de `gh` lui-même (`gh repo set-default`).
|
|
229
230
|
- **Discussions qui ont modifié ce fichier** ne connaît que les outils de fichiers de dsh (`write`, `edit`, `str_replace_editor`), comme **Cette discussion** : une modification faite par une commande (`bash`) n’est pas listée. La liste lit les 300 discussions les plus récentes du dépôt (selon leur date de création) et le signale quand il y en a plus ; elle affiche au plus 100 lignes. Un fichier renommé est listé sous le nom que l’outil a écrit. Une discussion dont le dossier est hors du dépôt (y compris par un autre chemin vers les mêmes fichiers) n’est pas comptée. La première ouverture après le démarrage de dsh lit tous les journaux de discussion du dépôt (environ 4 s pour 275 discussions) ; les ouvertures suivantes ne lisent que les discussions modifiées depuis.
|
|
230
|
-
- **Branche Git sur les lignes de discussion** affiche la branche du dossier de la discussion au début ou à la fin de son dernier tour, pas la branche actuelle : un changement de branche hors d’un tour s’affiche après le tour suivant. Les discussions antérieures à cette version n’affichent pas de pastille avant leur prochain tour. La pastille se place dans le balisage des lignes de discussion de dsh (dsh n’a pas d’emplacement prévu à cet endroit) ; si une mise à jour de dsh change ce balisage, aucune pastille ne s’affiche.
|
|
231
|
+
- **Branche Git sur les lignes de discussion** affiche la branche du dossier de la discussion au début ou à la fin de son dernier tour, pas la branche actuelle : un changement de branche hors d’un tour s’affiche après le tour suivant. Les discussions antérieures à cette version n’affichent pas de pastille avant leur prochain tour. La pastille se place dans le balisage des lignes de discussion de dsh (dsh n’a pas d’emplacement prévu à cet endroit) ; si une mise à jour de dsh change ce balisage, aucune pastille ne s’affiche. La pastille ne s’affiche que dans « Dans une seule liste ».
|
|
231
232
|
- **Une branche par discussion** en mode plan : dsh envoie `/plan <message>` comme une commande, pas comme un message, donc Composer Plus intercepte l’envoi de la commande dans la zone de saisie de dsh (pas une API publique). Si une mise à jour de dsh change cela, `/plan <message>` avec **Nouvelle branche** choisie s’exécute dans la Nouvelle discussion ouverte comme commande propre à dsh. Quand l’hôte ne peut pas activer le mode plan dans la nouvelle discussion, le dossier de la branche reste et le message n’est pas envoyé : la nouvelle discussion ne modifie donc pas de fichiers dans le mode par défaut.
|
|
232
233
|
- **Une branche par discussion** : quand le dossier de branche d'une discussion (`<project>/.worktrees/<name>`) est supprimé, par exemple quand l'agent de la discussion retire le worktree et supprime la branche, l'étape suivante de la discussion la sort de ce dossier. Le projet du dossier de branche disparaît de la barre latérale, et la discussion apparaît sous Sans groupe et reste ouverte. Avec dsh 0.2.1 et plus, la discussion continue dans le dossier principal du projet, et le modèle reçoit une note sur le nouveau dossier. Avec dsh 0.2.0, la discussion garde le dossier supprimé : une commande y échoue jusqu'à ce que vous commenciez une nouvelle discussion. Le projet d'une branche supprimée qu'aucune discussion n'utilise disparaît aussi de la barre latérale : Composer Plus vérifie les dossiers de branche au démarrage et toutes les 30 secondes, aussi sans filtre de la barre latérale. Pendant qu'une discussion se déplace, **Nouvelle branche** dans le même dépôt répond « réessayez ». Interrupteur désactivé, l'erreur de dsh revient (« working-directory: directory does not exist »).
|
|
233
234
|
- **Branches dans l’arborescence des espaces de travail** écrit dans git sans clic : quand il déplace une discussion, il remet le dossier du projet sur sa branche précédente (`git switch`) et ajoute un worktree (`git worktree add`). Il ne supprime jamais une branche, un worktree ni un fichier. dsh ne peut pas changer le dossier d’une discussion : une discussion déplacée est donc une copie (le fork propre à dsh, avec un nouvel id) et l’ancienne discussion est archivée. La copie reprend la tâche arrêtée ; un appel d’outil en cours quand la branche est apparue se termine par un refus, et l’agent le relance dans le nouveau dossier. Un objectif de l’ancienne discussion ne suit pas. Seule une discussion dont le dossier est le dossier principal du dépôt est déplacée, et seulement pour une branche qu’elle a créée et sur laquelle elle est passée pendant ce tour (`git switch -c`, `git checkout -b`) : une branche créée avec `git branch` seul, un dossier avec des modifications non validées, un worktree lié ou un sous-dossier ne déplacent rien. Seuls les worktrees placés directement dans `<project>/.worktrees/` et liés à une branche apparaissent dans l’arborescence ; un worktree détaché ou placé ailleurs n’apparaît pas. La copie ne s’ouvre d’elle-même que si sa discussion était celle qui était ouverte (le plugin le lit dans la ligne de la barre latérale de dsh) ; sinon, elle est dans le projet de la branche.
|
|
@@ -248,7 +249,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
248
249
|
- **Continuer dans une nouvelle discussion** envoie la discussion (messages, appels d’outils et la fin de chaque résultat d’outil, environ 60 000 caractères au plus, la partie la plus récente) au modèle de la discussion elle-même. La note de passation peut manquer une décision ou un fichier : relisez-la avant de lancer. La nouvelle discussion ne connaît que la note et la discussion liée (dsh joint l’ancienne discussion comme contexte en lecture seule) ; son contexte du modèle commence petit, et l’ancienne discussion reste telle quelle. Une seule note ou un seul lancement par discussion à la fois.
|
|
249
250
|
- **Répartition du contexte** affiche des estimations avec la règle de dsh lui-même (environ 4 caractères par token), la même règle que l’anneau de contexte de dsh ; le décompte du modèle lui-même peut être différent. Les définitions des outils sont celles de la requête la plus récente. Elle affiche le contexte tel que le journal de la discussion le contient ; un tour en cours apparaît après sa prochaine étape.
|
|
250
251
|
- **Étapes planifiées** n’économise des jetons que si le modèle planifie : tant qu’elle est activée, chaque requête porte l’outil `plan_next_steps` et une courte consigne (environ 500 jetons), aussi dans les discussions où le modèle ne planifie jamais. Une condition prouve seulement ce qu’elle dit (par exemple : le code de sortie de la compilation était 0), pas que le travail est juste. `ok` lit les marques de résultat propres à dsh (`[exit code: N]`, délais dépassés, refus du sandbox) ; une commande qui échoue sans code de sortie non nul passe. Les étapes s’exécutent une à la fois ; deux étapes prêtes en même temps reviennent au modèle. Le message de l’étape est enregistré comme un message d’assistant du modèle de la discussion (dsh n’a pas de marque pour un message écrit par un plugin), donc son texte indique que Composer Plus l’a exécutée. Pas dans Tether.
|
|
251
|
-
- **Tableau des tâches**
|
|
252
|
+
- **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). Les étiquettes viennent d’un appel au modèle par tâche lancée : 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 prompt. Un prompt qui commence par une commande `/` que dsh connaît (`/plan`, `/goal`) s’exécute comme cette commande. **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.
|
|
252
253
|
- **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.
|
|
253
254
|
- **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.
|
|
254
255
|
- **Sauvegarde** utilise un seul dossier fixe, `~/Desktop/dsh-backups` (celui de dsh-backup par défaut, pour que ses archives restent utilisables) ; aucun réglage ne permet un autre dossier. Une archive est à peu près aussi grande que le dossier personnel de dsh sans `cache/` ni `dsh-runtimes/` (mesuré : 1,6 Go de fichiers ont donné une archive de 830 Mo en environ 30 s sur Apple Silicon ; dsh est resté réactif). Un fichier qui change pendant sa lecture est enregistré tel qu’il était quand la sauvegarde l’a ouvert : le journal d’une discussion ouverte peut donc se terminer par un enregistrement coupé, que dsh répare à sa prochaine écriture. Le masquage trouve un secret dans un fichier yml par le nom de sa clé sur une ligne (`token:`, `apiKey:`, …) ; un secret dans une map de flux (`{token: x}`), dans une liste sous une telle clé, dans un fichier JSON (par exemple l’`apiKey` d’un serveur MCP dans un fichier `.json`) ou sous un autre nom reste dans l’archive. Les archives par type de dsh-backup (`dsh-t-…`) ne sont pas listées. **Pour un autre ordinateur** copie l’archive (un clone sur APFS : aucun espace en plus) ; le vault ne la suit pas. **Sauvegarder maintenant** ne supprime aucune sauvegarde. Une sauvegarde automatique conserve les sauvegardes les plus récentes faites par Composer Plus (le réglage **Conserver** de **Sauvegarde automatique**) et supprime ses sauvegardes plus anciennes ; les instantanés d’avant une mise à niveau sont comptés à part (les 2 plus récents restent). Les archives de dsh-backup ne sont jamais supprimées : retirez-les avec **Supprimer**. Tant que dsh-backup est encore installé, il compte les archives de Composer Plus dans son propre nombre de copies conservées et peut les supprimer.
|
|
@@ -285,7 +286,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
285
286
|
|
|
286
287
|
**L’agent peut-il retenir mes préférences d’une discussion à l’autre, comme la mémoire de DS Bot ?** Oui, avec **Mémoire du projet** (désactivée par défaut) : activez-la dans **Réglages → Composer Plus**. Après chaque tour, vos préférences et décisions durables sont gardées sous forme de notes courtes pour le projet de la discussion, et chaque nouvelle discussion de ce projet les lit. Demandez à l’agent de retenir quelque chose : il l’enregistre tout de suite. Pour voir ou modifier les notes, cliquez sur **Ouvrir la mémoire** sur la même ligne et écrivez ce qu’il faut changer.
|
|
287
288
|
|
|
288
|
-
**
|
|
289
|
+
**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** ne demande qu’un prompt et lance une nouvelle discussion avec lui ; cliquez sur **Répondre** sur une carte orange pour y répondre sans ouvrir la discussion.
|
|
289
290
|
|
|
290
291
|
**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.
|
|
291
292
|
|
|
@@ -407,7 +408,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
407
408
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
408
409
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
409
410
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
410
|
-
# Task board:
|
|
411
|
+
# Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
|
|
411
412
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
412
413
|
```
|
|
413
414
|
|