dsh-composer-plus 1.20.0 → 1.21.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 +71 -9
- package/README.es.md +71 -9
- package/README.fr.md +71 -9
- package/README.hi.md +71 -9
- package/README.id.md +71 -9
- package/README.ja.md +71 -9
- package/README.ko.md +71 -9
- package/README.md +71 -9
- package/README.pt-BR.md +71 -9
- package/README.ru.md +71 -9
- package/README.tr.md +71 -9
- package/README.vi.md +71 -9
- package/README.zh.md +71 -9
- package/assets/features/diffComments.webp +0 -0
- package/assets/features/memoryCopy.webp +0 -0
- package/assets/features/memoryExport.webp +0 -0
- package/assets/features/memoryHistory.webp +0 -0
- package/assets/features/memoryPerChat.webp +0 -0
- package/assets/features/memorySource.webp +0 -0
- package/assets/features/memoryStale.webp +0 -0
- package/assets/features/memorySuggest.webp +0 -0
- package/assets/features/nextWaiting.webp +0 -0
- package/assets/features/optionPicks.webp +0 -0
- package/assets/features/quoteReply.webp +0 -0
- package/assets/features/rejectNote.webp +0 -0
- package/assets/features/remoteComputers.webp +0 -0
- package/assets/features/secretInput.webp +0 -0
- package/assets/features/sideChat.webp +0 -0
- package/assets/features/taskBoard.webp +0 -0
- package/client.js +2587 -169
- package/index.js +1432 -77
- package/package.json +4 -3
- package/release-notes.json +14 -14
- package/tether/gateway/server.mjs +246 -21
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.
|
|
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.21.0`.
|
|
33
33
|
|
|
34
34
|
## Fonctionnalités
|
|
35
35
|
|
|
@@ -71,9 +71,21 @@ 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
|
|
74
|
+
| **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> |
|
|
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
|
+
| **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> |
|
|
77
|
+
| **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> |
|
|
78
|
+
| **Lien vers l’origine des notes de mémoire** | <a id="feature-memorysource"></a>Dans **Ouvrir la mémoire**, une note venue d’une discussion (l’agent l’a enregistrée, la revue après un tour l’a gardée ou vous avez accepté une suggestion) a **Origine** à côté : un clic ouvre cette discussion sur le message, pour vérifier pourquoi la note est là avant de la modifier ou de la supprimer. Une note d’une version antérieure n’ouvre que sa discussion. Dans Tether : menu du titre de la discussion → Project memory → Source. | <a href="assets/features/memorySource.webp"><img src="assets/features/memorySource.webp" width="160" alt="Capture d’écran : Lien vers l’origine des notes de mémoire"></a> |
|
|
79
|
+
| **Copier la mémoire vers un autre projet** | <a id="feature-memorycopy"></a>Dans **Ouvrir la mémoire**, sélectionnez un projet ou **Mémoire globale**, puis **Copier vers un projet** : cochez les notes, cherchez parmi les projets de dsh et cliquez sur l’un d’eux. Toutes les notes cochées vont dans la mémoire de ce projet (avec leur sujet et leur origine), ou aucune : si une note ne tient pas, rien n’est copié et la raison s’affiche. Une note que le projet a déjà est ignorée. Dans Tether : menu du titre de la discussion → Project memory → Copy to project. | <a href="assets/features/memoryCopy.webp"><img src="assets/features/memoryCopy.webp" width="160" alt="Capture d’écran : Copier la mémoire vers un autre projet"></a> |
|
|
80
|
+
| **Trouver les notes de mémoire obsolètes** | <a id="feature-memorystale"></a>Quand vous sélectionnez un projet dans **Ouvrir la mémoire**, les chemins de fichier (en `code`), les scripts npm et les noms de branche cités par ses notes sont comparés au projet actuel. Une note qui cite quelque chose que le projet n’a plus affiche ⚠ avec ce qui manque, pour que vous la corrigiez ou la supprimiez avant que le modèle ne s’en serve. Seuls des fichiers normaux du dossier du projet et une liste de branches git sont lus ; rien n’est modifié et aucun modèle n’est appelé. Dans Tether : menu du titre de la discussion → Project memory. | <a href="assets/features/memoryStale.webp"><img src="assets/features/memoryStale.webp" width="160" alt="Capture d’écran : Trouver les notes de mémoire obsolètes"></a> |
|
|
81
|
+
| **Ne pas utiliser la mémoire dans cette discussion** | <a id="feature-memoryperchat"></a>Tant que **Mémoire du projet** est activée, l’en-tête de la discussion affiche **Mémoire activée** : cliquez pour désactiver la mémoire dans cette discussion seulement (**Mémoire désactivée**). Le modèle de cette discussion ne reçoit alors ni la section mémoire ni les outils de mémoire, et la revue après chaque tour ne la lit pas. Avec dsh 0.2.1 et suivants, le même bouton est sur l’écran de nouvelle discussion : une discussion de test commence donc sans mémoire. Les autres discussions ne changent pas. Dans Tether : menu du titre de la discussion → Use project memory. | <a href="assets/features/memoryPerChat.webp"><img src="assets/features/memoryPerChat.webp" width="160" alt="Capture d’écran : Ne pas utiliser la mémoire dans cette discussion"></a> |
|
|
82
|
+
| **Suggérer des notes de mémoire depuis une discussion** | <a id="feature-memorysuggest"></a>Tant que **Mémoire du projet** est activée, l’en-tête de la discussion a **Suggérer pour la mémoire** : un clic demande au modèle de la discussion quelles règles et décisions de cette discussion valent la peine d’être gardées pour les suivantes. Chaque suggestion indique pourquoi ; **Accepter** l’enregistre avec un lien vers la discussion et le message d’où elle vient, **Refuser** l’écarte. Rien n’est enregistré avant d’accepter, et le modèle n’est appelé que lorsque vous cliquez. Les messages retirés par un retour arrière ne sont pas envoyés. Dans Tether : menu du titre de la discussion → Suggest for memory. | <a href="assets/features/memorySuggest.webp"><img src="assets/features/memorySuggest.webp" width="160" alt="Capture d’écran : Suggérer des notes de mémoire depuis une discussion"></a> |
|
|
76
83
|
| **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> |
|
|
84
|
+
| **Refuser avec une note** | <a id="feature-rejectnote"></a>La carte d’approbation affiche **Refuser avec une note…** à côté de **Refuser**. Cliquez dessus, écrivez la raison ou ce qu’il faut faire à la place, puis cliquez sur **Refuser** (ou appuyez sur `Enter` ; `Shift+Enter` ajoute une ligne, `Esc` ferme le champ). La note part d’abord vers l’agent, comme un message dans le tour en attente, puis la demande est refusée : le modèle lit le refus et votre note dans le même tour, sans message de plus de votre part. Si la note ne peut pas être envoyée, rien n’est refusé et le champ reste ouvert. Dans Tether : feuille d’approbation → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="Capture d’écran : Refuser avec une note"></a> |
|
|
85
|
+
| **Saisie secrète** | <a id="feature-secretinput"></a>L’agent reçoit l’outil `request_secret`. Quand il a besoin d’un mot de passe, d’un jeton ou d’une clé d’API, il le demande avec cet outil au lieu de le demander dans la discussion : une carte s’affiche sur la ligne de l’outil avec le nom, la raison, un champ de mot de passe, **Enregistrer** et **Refuser**. **Enregistrer** écrit la valeur dans un fichier de ce Mac que vous seul pouvez lire, et l’agent reçoit seulement le chemin du fichier, qu’il utilise comme entrée d’une commande (par exemple `"$(cat <path>)"`). Si un résultat d’outil ultérieur montre la valeur, `[secret]` la remplace avant que le modèle la voie. Le fichier est supprimé à la fin du tour. **Refuser** indique à l’agent que vous ne l’avez pas donnée. Désactivez-la dans **Réglages → Composer Plus** pour retirer l’outil. Dans Tether : la barre « Secret: … » au-dessus du champ de saisie → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="Capture d’écran : Saisie secrète"></a> |
|
|
86
|
+
| **Citer dans la réponse** | <a id="feature-quotereply"></a>Sélectionnez une partie d’une réponse : un bouton **Citer** s’affiche au-dessus de la sélection. Cliquez dessus : cette partie va dans le champ de saisie, à la position du curseur, comme citation Markdown (`> …`), suivie d’une ligne vide, et le champ de saisie reçoit le focus pour que vous écriviez votre réponse en dessous. Seul le texte de la réponse compte, pas le raisonnement, les lignes d’outil ou vos propres messages. Une citation fait au plus 2 000 caractères. `Cmd+Z` (`Ctrl+Z`) la retire. Dans Tether : touchez longuement une réponse → Quote (la réponse entière). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="Capture d’écran : Citer dans la réponse"></a> |
|
|
87
|
+
| **Discussion annexe** | <a id="feature-sidechat"></a>Écrivez une question annexe dans le champ de saisie et cliquez sur le bouton bulles (**Demander dans une discussion annexe**) : une copie de la discussion s’ouvre et y répond dans le mode lecture seule de dsh, pendant que la discussion continue. La copie connaît la discussion jusqu’ici, sauf les messages qui attendent encore dans la file, et garde son modèle. Une barre au-dessus de son champ de saisie a **Rapporter** : la discussion s’ouvre et son champ de saisie reçoit vos questions (en citations `> `) et les réponses. **Retour à la discussion** ouvre seulement la discussion. La discussion annexe reste dans la barre latérale sous le nom « ↳ <question> » ; archivez-la là. Dans Tether : menu du titre de la discussion → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="Capture d’écran : Discussion annexe"></a> |
|
|
88
|
+
| **Notes de diff** | <a id="feature-diffcomments"></a>Dans **Panneau des modifications**, ouvrez le diff d’un fichier et cliquez sur **+** à une ligne (Maj+clic sur une deuxième ligne du même bloc pour une plage), écrivez une note et cliquez sur **Enregistrer la note**. Les notes de la discussion attendent dans une barre en haut du panneau ; **Envoyer au champ de saisie** les met à la position du curseur en Markdown : `path:12-14`, les lignes en bloc `diff` et votre note. **Effacer** les supprime. Les notes restent dans ce navigateur jusqu’à ce que vous les envoyiez ou les effaciez. Nécessite **Panneau des modifications**. Dans Tether : le diff d’un fichier → appui long sur une ligne → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="Capture d’écran : Notes de diff"></a> |
|
|
77
89
|
| **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
90
|
| **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
91
|
| **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> |
|
|
@@ -83,8 +95,11 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
83
95
|
| **Trier par état** | <a id="feature-statusorder"></a>Barre latérale → options d’affichage → **Trier par** → **Par état** (avec **Dans une seule liste**). Les discussions terminées viennent en premier (le point « terminé » de dsh, qu’un tour terminé par une erreur reçoit aussi), puis les discussions en cours ou en attente, puis celles qui ont une automatisation active (Schedule), puis les autres dans l’ordre de dsh. Quand vous ouvrez une discussion terminée, elle descend. Seul l’affichage change : sélectionnez **Ordre manuel** ou **Dernière mise à jour** pour revenir en arrière. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Capture d’écran : Trier par état"></a> |
|
|
84
96
|
| **Notifications en arrière-plan** | <a id="feature-notifications"></a>Quand dsh est en arrière-plan, vous recevez une notification quand un tour se termine (première ligne de la réponse) ou quand une discussion vous attend vraiment : une approbation (nom de l’outil), une réponse (la question) ou une revue de plan. Une demande doit être encore ouverte 1,5 s plus tard : les approbations données automatiquement (autorisations de la revue automatique, autres plugins) restent donc silencieuses, et une notification est retirée dès que sa demande reçoit une réponse. La pastille du Dock / de la barre des tâches compte les discussions en attente. Un clic sur la notification ouvre cette discussion. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Capture d’écran : Notifications en arrière-plan"></a> |
|
|
85
97
|
| **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> |
|
|
98
|
+
| **Discussion en attente suivante** | <a id="feature-nextwaiting"></a>Un bouton dans l’en-tête de la barre latérale indique combien d’autres discussions vous attendent, avec un point de la couleur de la suivante : orange quand elle pose une question ou attend une approbation ou une revue du plan, vert quand elle a terminé un tour que vous n’avez pas encore lu. Cliquez dessus, ou appuyez sur Cmd+Shift+E (Ctrl+Shift+E sous Windows et Linux), pour ouvrir cette discussion. Les discussions orange passent avant les vertes ; dans chaque groupe, celle qui attend depuis le plus longtemps passe en premier. La discussion à l’écran ne compte pas. Quand aucune autre discussion n’attend, le bouton n’apparaît pas et la touche ne fait rien. Vous pouvez changer la touche dans la page des raccourcis clavier de dsh (Discussion en attente suivante). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Capture d’écran : Discussion en attente suivante"></a> |
|
|
99
|
+
| **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> |
|
|
86
100
|
| **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
101
|
| **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> |
|
|
102
|
+
| **Ordinateurs distants** | <a id="feature-remotecomputers"></a>Ouvrez le dsh de vos autres Mac via [Tailscale](https://tailscale.com) et poursuivez leurs discussions ici. 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, à gauche du titre de la discussion, collez le lien 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 s’ouvre dans l’onglet Navigateur de la barre latérale droite (ou dans une fenêtre du navigateur), avec ses propres discussions, outils et fichiers. 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> |
|
|
88
103
|
| **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
104
|
| **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
105
|
| **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> |
|
|
@@ -137,6 +152,9 @@ Chaque pack contient 3 280 textes : tous les textes d’interface de dsh `0.2.0-
|
|
|
137
152
|
| `Cmd+F` sur un Mac, `Ctrl+F` sous Windows et Linux | discussion ouverte | ouvrir **Rechercher dans la discussion** |
|
|
138
153
|
| `Enter` / `Shift+Enter`, `↓` / `↑` | champ **Rechercher dans la discussion** | résultat suivant / précédent |
|
|
139
154
|
| `Esc` | champ **Rechercher dans la discussion** | fermer le champ |
|
|
155
|
+
| `Cmd+Shift+E` sur Mac, `Ctrl+Shift+E` sous Windows et Linux | partout dans dsh | ouvrir la **Discussion en attente suivante** (à changer dans la page des raccourcis clavier de dsh) |
|
|
156
|
+
| `Cmd+Shift+K` sur Mac, `Ctrl+Shift+K` sous Windows et Linux | partout dans dsh | ouvrir le **Tableau des tâches** (à changer dans la page des raccourcis clavier de dsh) |
|
|
157
|
+
| `1`–`9` | carte de question de dsh, hors de son champ de réponse | choisir cette option (**Boutons d’options**) |
|
|
140
158
|
|
|
141
159
|
Quand un menu `/` ou `@` est ouvert, il garde ces touches pour lui.
|
|
142
160
|
|
|
@@ -162,17 +180,20 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
162
180
|
- **Autoriser pour cette discussion :** les autorisations sont enregistrées, avec l’heure à laquelle elles ont été accordées, dans `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (accès réservé au propriétaire). Une autorisation couvre un seul outil précis dans une seule discussion, jusqu’à la fin de la limite de temps (1 heure par défaut). Si cet outil peut écrire, l’autorisation couvre aussi toute écriture. Révoquez-la depuis la pastille de l’en-tête.
|
|
163
181
|
- La revue automatique s’exécute toujours à chaque appel ; les échecs de revue ne sont jamais autorisés automatiquement.
|
|
164
182
|
- **Connexion mobile :** désactivée tant que vous ne l’activez pas. Quand elle est activée, la partie hôte exécute la passerelle Tether : HTTPS sur le port 19390, qui n’accepte que votre sous-réseau Wi-Fi et votre tailnet (100.64.0.0/10), et une page d’appairage sur `127.0.0.1:19391` (ce Mac uniquement). Un téléphone a besoin d’un code à usage unique tiré du code QR (valable 5 minutes) et d’un clic sur **Approve** sur le Mac. Le téléphone épingle le certificat de la passerelle. Le Mac ne garde qu’un hachage du jeton de chaque téléphone (30 jours, renouvelé tant qu’il sert) ; **Remove** ferme tout de suite les connexions de ce téléphone. Les téléphones ne peuvent appeler qu’une liste autorisée de méthodes dsh (discussions, prompts, pièces jointes, commandes slash, approbations, questions, modèles, agents, objectifs), et pas les réglages, les identifiants, l’explorateur de fichiers ni le terminal. « Tailscale only » refuse toute connexion venant du réseau local, y compris celles déjà ouvertes. Le journal d’accès garde les 200 tentatives de connexion les plus récentes (heure, adresse IP, nom de l’appareil, autorisée ou refusée, et pourquoi) dans `access.json` ; il ne contient jamais de jeton ni de code d’appairage. Données : `$DSH_HOME/storages/dsh-composer-plus/mobile/` (fichiers réservés au propriétaire). Détails : [tether/README.md](tether/README.md).
|
|
183
|
+
- **Ordinateurs distants :** la fonction est désactivée tant que vous ne l’activez pas, sur chaque Mac. **Autoriser d’autres ordinateurs à ouvrir ce Mac** ouvre un second port HTTPS (19392), seulement sur l’adresse Tailscale de ce Mac (pas sur le Wi-Fi, et sans annonce Bonjour). Un autre Mac a besoin d’un lien d’appairage à usage unique (valable 5 minutes), du certificat correspondant (épinglé) et d’un clic de votre part sur **Approuver**. Ce Mac ne garde qu’un hachage de son jeton. Un ordinateur appairé a le contrôle total de dsh sur ce Mac, comme si vous l’utilisiez ici : ses discussions, modèles, outils, fichiers et terminal. Supprimez-le dans le panneau des réglages, et ses connexions se ferment tout de suite. Le Mac qui en ouvre un autre garde le jeton de cet ordinateur dans `$DSH_HOME/storages/dsh-composer-plus/computers.json` (réservé au propriétaire). Il ouvre un relais sur `127.0.0.1` pour chaque ordinateur que vous choisissez. La page reçoit un lien à usage unique (valable 60 secondes), et le relais n’accepte que sa propre page (son adresse, aucun autre site). Une page qu’un autre Mac a ouverte n’affiche pas de sélecteur d’ordinateurs et ne peut pas modifier les ordinateurs de ce Mac.
|
|
165
184
|
- **Mises à jour :** la partie hôte demande la dernière version à `api.github.com`, puis cette version précise à `registry.npmjs.org` ; rien sur vous ni sur vos discussions n’est envoyé. L’installation passe par le gestionnaire de plugins de dsh (`pnpm add dsh-composer-plus@<version>` ; quand dsh 0.2.1 le refuse pour un plugin déjà installé, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, et le profil indique ensuite cette URL comme source du plugin) : le registre, les scripts et les vérifications de compatibilité de version de dsh s’appliquent donc. Les tags de préversion et les versions plus anciennes ne sont jamais installés.
|
|
185
|
+
- **Comptage d’utilisation :** une fois par jour, la partie hôte demande à GitHub le petit fichier `active.txt` de la version publiée installée (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/active.txt`). GitHub compte ces requêtes par fichier : l’auteur voit donc seulement combien de copies de chaque version l’ont demandé ce jour-là. La requête ne contient aucun identifiant, aucun cookie et aucune donnée sur vous ou vos conversations ; GitHub voit votre adresse IP, comme à chaque vérification des mises à jour. Le jour de la dernière requête est gardé dans `$DSH_HOME/storages/dsh-composer-plus/active.json`. Une copie git de ce dépôt et une copie renommée n’envoient rien. Aucun interrupteur ne le désactive.
|
|
166
186
|
- **Prédiction du message suivant :** activée par défaut ; désactivez-la dans **Réglages → Composer Plus** pour arrêter ces appels au modèle. Après chaque tour terminé, la partie hôte envoie vos propres messages de la discussion et les réponses texte de l’agent (sans sortie d’outil, sans contexte caché ni raisonnement), environ 6 000 caractères au plus (la partie la plus récente), au modèle choisi (celui par défaut de dsh, sauf si vous en choisissez un autre). L’envoi passe par les réglages de fournisseur de dsh, en une seule requête. Rien n’est enregistré dans la discussion : la prédiction n’est pas ajoutée à l’historique. L’interrupteur et le modèle choisi sont dans `$DSH_HOME/storages/dsh-composer-plus/predict.json` (fichier réservé au propriétaire).
|
|
167
187
|
- **Compléter pendant la saisie :** désactivé tant que vous ne l’activez pas. Quand il est activé, à chaque pause pendant la saisie, la partie hôte envoie le texte déjà saisi, ainsi que vos propres messages de la discussion et les réponses texte de l’agent (sans sortie d’outil, sans contexte caché ni raisonnement), environ 3 000 caractères de discussion au plus, au modèle choisi sous **Compléter pendant la saisie** (par défaut, le modèle de **Prédiction du message suivant**). Une pause plus récente arrête la requête précédente. Rien n’est enregistré dans la discussion. L’interrupteur est dans `$DSH_HOME/storages/dsh-composer-plus/complete.json` (fichier réservé au propriétaire).
|
|
168
188
|
- **Améliorer le prompt :** rien ne s’exécute tant que vous ne cliquez pas sur la baguette magique. La partie hôte envoie alors votre brouillon, vos propres messages de la discussion et les réponses texte de l’agent (sans sortie d’outil, sans contexte caché, sans raisonnement ni messages retirés par une annulation ; environ 6 000 caractères au plus, la partie la plus récente), le même résumé du projet que pour **Idées de fonctionnalités** (avec les mêmes règles de fichiers : ni `.env*` ni fichiers de clés, aucun lien symbolique hors du dossier, aucune FIFO), les chemins que `git status` liste comme modifiés et jusqu’à 30 chemins suivis ou non suivis (non ignorés) dont le nom partage des mots avec votre brouillon, au modèle choisi sous **Améliorer le prompt** (par défaut, le modèle de la discussion), en une seule requête. Aucun autre contenu de fichier que ce résumé n’est envoyé. Rien n’est écrit dans la discussion ni dans le projet : la réponse remplace seulement votre brouillon dans la zone de saisie, et vous décidez de l’envoyer ou non. Le modèle choisi est dans `$DSH_HOME/storages/dsh-composer-plus/improve.json` (fichier réservé au propriétaire).
|
|
169
189
|
- **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
190
|
- **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
191
|
- **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 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) ; 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).
|
|
192
|
+
- **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).
|
|
173
193
|
- **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
194
|
- **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
|
-
- **
|
|
195
|
+
- **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.
|
|
196
|
+
- **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. **Historique des versions de la mémoire** (activé par défaut) garde une copie des fichiers de la mémoire avant chaque enregistrement dans `memory/history/`, à côté d’eux (fichiers réservés au propriétaire, les 50 plus récentes par mémoire) ; il n’envoie rien à aucun modèle. **Exporter la mémoire vers AGENTS.md** n’envoie rien à aucun modèle et n’écrit que lorsque vous cliquez sur **Écrire AGENTS.md** : il lit et écrit `AGENTS.md` dans le dossier du projet de cette mémoire (seulement un fichier normal à l’intérieur, jamais par un lien symbolique qui en sort) et ne change que sa section balisée. **Trouver les notes de mémoire obsolètes** n’envoie rien à aucun modèle et n’écrit rien : il vérifie les chemins dans le dossier du projet avec realpath (aucun fichier n’est lu), lit `package.json` seulement comme fichier normal dans le dossier et y lance un `git for-each-ref`. **Ne pas utiliser la mémoire dans cette discussion** garde chaque discussion que vous désactivez dans `memory-chats.json`, à côté (fichier réservé au propriétaire, les 500 plus récentes) ; une telle discussion n’envoie aucune mémoire à son modèle. **Suggérer des notes de mémoire depuis une discussion** n’envoie rien tant que vous ne cliquez pas sur **Suggérer pour la mémoire** ; il envoie alors les notes enregistrées du projet de la discussion et les notes globales, ainsi que les messages et réponses texte de la discussion elle-même (sans sortie d’outils ni messages annulés ; la copie du parent dans un fork est exclue ; au plus environ 24 000 caractères), au modèle de la discussion, en une requête sans outils. Une suggestion n’est enregistrée qu’avec **Accepter**.
|
|
176
197
|
- **Sauvegarde :** rien ne quitte votre machine. Les archives vont dans `~/Desktop/dsh-backups` (fichiers réservés au propriétaire). Les secrets ne sont pas dans une archive : les fichiers d’identifiants (`.credentials.yaml`, `.env`), les fichiers de clés (`.pem`, `.key`, `.p12`, `.pfx`) et les valeurs des réglages token, secret, password et clé d’API des fichiers yml sont masqués ; leurs vraies copies restent dans `composer-plus-vault/<archive>/`, dans le même dossier (réservé au propriétaire), sur cet ordinateur uniquement. **Pour un autre ordinateur** ne copie aucun vault : saisissez de nouveau ces secrets là-bas. Vos journaux de discussion, vos réglages et le reste du dossier personnel de dsh sont dans l’archive tels quels : gardez le dossier privé, comme `$DSH_HOME` lui-même. La sauvegarde lit les fichiers avec `O_NOFOLLOW | O_NONBLOCK` ; un lien symbolique est enregistré comme lien (jamais suivi) et une FIFO ou un périphérique est ignoré. L’interrupteur et les réglages de la sauvegarde automatique sont dans `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, l’interrupteur de la console de secours dans `rescue-console.json`, et pendant que dsh tourne, `running/host-<pid>.json` désigne chaque processus dsh (la console de secours les lit pour refuser une restauration).
|
|
177
198
|
- **Console de secours :** un menu dans un terminal ; elle n’ouvre aucun port réseau. Une restauration écrit uniquement dans un nouveau dossier à côté du dossier personnel de dsh (fichiers avec `O_EXCL | O_NOFOLLOW`, liens symboliques en dernier et jamais suivis) et refuse une archive qui contient un nom dangereux (`..`, un chemin absolu), un périphérique ou une FIFO, plus d’un dossier de premier niveau ou une entrée sous un lien.
|
|
178
199
|
|
|
@@ -194,7 +215,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
194
215
|
- **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
216
|
- **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
217
|
- **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.
|
|
218
|
+
- **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.21.0`) ; voir la note d’installation plus haut.
|
|
198
219
|
- **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
220
|
- **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
221
|
- **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.
|
|
@@ -215,11 +236,17 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
215
236
|
- 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
237
|
- 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
238
|
- **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.
|
|
239
|
+
- **Refuser avec une note** envoie la note comme un message dans le tour en attente, puis refuse la demande ; dsh affiche la note dans la discussion comme votre message. Tant que le champ de la note est ouvert, la carte n’affiche que **Annuler** et **Refuser** : un clic ne peut donc pas autoriser la demande par erreur ; `Esc` ou **Annuler** fait revenir les boutons de dsh. Une note vide n’envoie rien (utilisez le propre bouton **Refuser** de dsh). Si le refus échoue après l’envoi de la note (par exemple, la demande a reçu une réponse ailleurs entre-temps), la note reste dans la discussion et le modèle la lit à sa prochaine étape. Le bouton va dans le balisage de la carte d’approbation de dsh (`data-approval-key`), car dsh n’a pas d’emplacement pour les actions de la carte ; si une mise à jour de dsh change ce balisage, le bouton ne s’affiche pas et le propre bouton **Refuser** de dsh fonctionne comme avant. Une note peut avoir au plus 4 000 caractères.
|
|
240
|
+
- **Saisie secrète** masque seulement le texte exact d’une valeur : `[secret]` la remplace dans les résultats d’outil suivants de la même discussion. L’agent peut quand même lire le fichier avec une commande shell et afficher la valeur sous une autre forme (base64, une partie, avec des espaces), et cette forme atteint le modèle. Les outils de fichiers de l’agent (read, grep, write, edit) ne peuvent pas ouvrir le dossier des secrets. Si la valeur est aussi un mot courant, d’autres résultats de cette discussion affichent aussi `[secret]`. Le fichier reste jusqu’à la fin du tour ; si dsh se ferme pendant le tour, le démarrage suivant le supprime. Une discussion peut avoir une seule demande ouverte à la fois. L’outil ajoute environ 870 caractères (environ 220 jetons, estimation) à chaque requête au modèle : désactivez-le quand vous ne l’utilisez pas.
|
|
241
|
+
- **Citer dans la réponse** cite le texte tel que la page l’affiche : un bloc de code, un tableau ou une liste arrivent en lignes simples, sans leurs marques Markdown. Une sélection qui commence dans une réponse et finit dans une autre, ou qui touche le raisonnement, une ligne d’outil ou votre propre message, n’affiche pas le bouton : sélectionnez dans une seule réponse. Le bouton trouve la réponse par la structure de discussion de dsh, car dsh n’a pas de slot pour une sélection de texte ; si une mise à jour de dsh change cette structure, le bouton ne s’affiche pas. Quand la citation termine le champ, une ligne vide de plus suit pour que la ligne suivante commence en dessous ; dsh retire les lignes vides de la fin à l’envoi.
|
|
242
|
+
- **Discussion annexe** est en lecture seule grâce au mode lecture seule de dsh : les outils de fichiers ne peuvent pas écrire et les commandes shell s’exécutent dans le bac à sable de dsh sans écriture (ou ne s’exécutent pas quand le bac à sable ne peut pas démarrer). L’agent peut quand même demander plus d’accès avec la carte d’approbation de dsh, et un appel réseau (par exemple une requête à une API) peut quand même changer quelque chose hors de l’ordinateur. La copie est faite au moment le plus récent où aucun message n’attendait dans la file : une question posée pendant que des messages attendent ne voit pas ce qui s’est passé après eux. Une étape en cours de la discussion est fermée dans la copie : la discussion annexe connaît le début de cette étape, mais pas son résultat. La discussion annexe est une discussion normale : elle reste dans la barre latérale et compte dans votre utilisation du modèle ; archivez-la là. Rapporter prend seulement les messages propres de la discussion annexe (12 000 caractères au plus) et seulement la dernière réponse de chaque question ; les notes de l’agent entre ses appels d’outil restent dehors. dsh n’offre pas aux plugins d’emplacement pour une discussion dans la barre latérale droite : la discussion annexe s’ouvre donc dans la vue principale.
|
|
243
|
+
- **Notes de diff** fonctionne seulement dans le panneau des modifications, pas dans la vue Dernier tour de dsh. Une plage doit rester dans un seul bloc du diff (une partie `@@`). Les notes sont gardées dans le stockage de ce navigateur : un autre navigateur ou dsh sur un autre ordinateur ne les voit pas ; Tether garde ses propres notes en mémoire. Une note garde les lignes telles qu’elles étaient au clic : si l’agent change le fichier ensuite, la note montre encore les anciennes lignes et les anciens numéros. Au plus 50 notes par discussion, 2 000 caractères par note et 40 lignes par note (puis une ligne `…`).
|
|
218
244
|
- **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.
|
|
219
245
|
- **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.
|
|
220
246
|
- **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.
|
|
221
247
|
- **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.
|
|
222
|
-
- **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). Le téléphone ne reçoit des notifications que lorsque Tether est ouvert ou vient de passer en arrière-plan (pas de service push). Tether ne les envoie qu’après que vous avez activé « Settings → Notifications → Send notifications » dans Tether.
|
|
248
|
+
- **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). Le téléphone ne reçoit des notifications que lorsque Tether est ouvert ou vient de passer en arrière-plan (pas de service push). 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. 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.
|
|
249
|
+
- **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. L’autre ordinateur s’ouvre dans l’onglet Navigateur de la barre latérale droite de la discussion à l’écran. L’onglet appartient à cette discussion : une autre discussion affiche donc sa propre barre latérale. Sans discussion (ou dans dsh web sans son onglet Navigateur), l’ordinateur s’ouvre dans une fenêtre du navigateur. Le sélecteur n’apparaît que si une discussion ou l’écran de nouvelle discussion occupe la zone principale, pas sur le Tableau des tâches. La fonction utilise le port 19392 (un seul dsh par Mac peut laisser entrer d’autres ordinateurs). Un ordinateur que vous avez ouvert dans la page d’un autre ordinateur n’a pas de sélecteur : vous ne pouvez donc pas ouvrir un troisième Mac depuis cette page.
|
|
223
250
|
- 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.
|
|
224
251
|
- **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.
|
|
225
252
|
- **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).
|
|
@@ -234,6 +261,8 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
234
261
|
- **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.
|
|
235
262
|
- **Rechercher dans la discussion** ne cherche que dans ce que la page affiche : les messages et les réponses chargés (faites défiler vers le haut ou cliquez sur **Charger les précédents** pour les plus anciens), ni dans les étapes d’outil fermées, ni dans le texte replié de la sortie d’un outil. La recherche compte au plus 2 000 résultats (puis « 2000+ »). Elle utilise l’API de surlignage du navigateur (Chromium 105 et plus récent ; l’app de bureau l’a) : dans un navigateur plus ancien, le compteur et les déplacements fonctionnent sans la couleur. `Cmd+F` sur un Mac (`Ctrl+F` sous Windows et Linux) ne l’ouvre que lorsqu’une discussion est à l’écran ; ailleurs, la recherche du navigateur fonctionne comme avant. Sur un Mac, `Ctrl+F` garde son rôle macOS dans les champs de texte (le curseur avance d’un caractère).
|
|
236
263
|
- **Ouvrir la discussion en attente en cas d’inactivité** ne connaît que ce que voit la fenêtre de dsh : le travail dans une autre app ne compte pas, donc quand dsh est en arrière-plan, elle peut ouvrir une discussion en attente au bout de 30 secondes. Elle ne fait pas passer dsh au premier plan. Lire sans toucher une touche, cliquer ni bouger la souris compte comme de l’inactivité. Elle ne regarde que les discussions avec le point orange de dsh (une question, une approbation ou une revue du plan) ou avec son point vert (un tour terminé que vous n’avez pas encore ouvert) ; la demande d’un sous-agent s’affiche dans sa discussion parente. Les discussions orange s’ouvrent d’abord. Ouvrir une discussion verte retire son point, donc les 30 secondes de la discussion verte suivante ne commencent qu’après votre prochaine touche, clic, mouvement de souris, molette ou toucher : quand vous revenez, les autres points verts sont toujours là. Tant qu’une discussion en attente est à l’écran, aucune autre ne s’ouvre ; une discussion quittée sans réponse peut se rouvrir après les 30 secondes suivantes sans utilisation. Les 30 secondes ne sont pas modifiables.
|
|
264
|
+
- **Discussion en attente suivante** compte les mêmes discussions que **Ouvrir la discussion en attente en cas d’inactivité** : le point orange de dsh (une question, une approbation ou une revue du plan à laquelle vous pouvez répondre ici) et le point vert (un tour terminé que vous n’avez pas encore ouvert) ; la demande d’un sous-agent apparaît dans sa discussion parente. dsh n’enregistre pas le moment où une discussion a commencé à attendre : l’ordre compte donc à partir du moment où cette fenêtre l’a vue. Après un rechargement, les discussions qui attendaient déjà gardent l’ordre de dsh. La touche est un raccourci dsh : dans un navigateur sous Linux, elle n’a pas de touche tant que vous n’en définissez pas une dans la page des raccourcis clavier de dsh, et une extension du navigateur ou une autre application peut prendre `Cmd+Shift+E` avant. dsh n’a pas d’emplacement pour extensions dans l’en-tête de la barre latérale : le bouton va donc dans la structure de cet en-tête. Si une mise à jour de dsh la change, le bouton n’apparaît pas et la touche fonctionne toujours. Le bouton n’est pas dans la barre latérale étroite.
|
|
265
|
+
- **Boutons d’options** ne lit que les réponses qui se terminent par une liste d’options : une liste numérotée de 1 à 9 éléments, numérotée à partir de 1, en dernière partie de la réponse, juste sous un titre ou une ligne en gras « Options », « Choix » ou « Prochaines étapes » (ou les mots anglais « Choices » et « Next steps », et les mêmes mots dans les autres langues de l’application). Une liste au milieu d’une réponse, dans un bloc de code ou sous un autre titre n’a pas de boutons. Composer Plus ne demande pas à l’agent d’écrire une telle liste. 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, et seulement quand Composer Plus sait quelles réponses un retour en arrière a retirées. Sur la carte de question de dsh, les touches 1 à 9 ne font rien pendant les 0,8 premières secondes après l’affichage d’une question : ainsi, une touche destinée à autre chose ne choisit pas une option que vous n’avez pas lue. dsh n’a pas d’API de touches pour sa carte de question : les touches trouvent donc les boutons de la carte dans le balisage de dsh. Si une mise à jour de dsh change ce balisage, les touches ne font rien.
|
|
237
266
|
- Une notification envoyée avant un redémarrage ne fait que ramener dsh au premier plan quand vous cliquez dessus.
|
|
238
267
|
- Les projets actifs sont déplacés avec l’ordre des projets enregistré par dsh : le nouvel ordre est donc conservé après un redémarrage. Les discussions hors de tout projet (« Sans groupe ») ne peuvent pas être déplacées ; dsh les liste toujours en dernier.
|
|
239
268
|
- dsh n’a pas de point d’extension dans le menu des options d’affichage de la barre latérale : l’option des projets récents est donc ajoutée au menu de dsh lui-même. Si une mise à jour de dsh change ce menu, l’option n’apparaît pas et tous les projets restent visibles. Le filtre agit sur les lignes de projet : **Dans une seule liste** n’est donc pas filtré. Dans **Arborescence des espaces de travail**, un dossier parent reste affiché tant qu’un projet qu’il contient est actif, et les lignes de discussion qui n’ont pas été actives au cours des 2 dernières heures sont masquées aussi ; dans **Espace de travail**, seules les lignes de projet sont filtrées. Le filtre lit la vue que dsh affiche dans le réglage de vue enregistré par dsh (pas une API publique) ; si une mise à jour de dsh le renomme, **Arborescence des espaces de travail** est filtrée comme **Espace de travail**. La fonction Statut du projet lit le même réglage : dans **Arborescence des espaces de travail**, la ligne d’un dossier parent compte aussi les discussions des projets qu’il contient ; si dsh renomme ce réglage, chaque ligne n’affiche que ses propres discussions. **Par état** a le même type de limite : dsh n’a pas d’emplacement pour l’ordre, donc l’élément de menu et l’ordre des lignes s’attachent au balisage du menu et de la liste de dsh.
|
|
@@ -249,9 +278,16 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
249
278
|
- **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.
|
|
250
279
|
- **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.
|
|
251
280
|
- **É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.
|
|
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). **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
|
|
281
|
+
- **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**.
|
|
253
282
|
- **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.
|
|
254
283
|
- **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.
|
|
284
|
+
- **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.
|
|
285
|
+
- **Exporter la mémoire vers AGENTS.md** n’écrit que les notes de la mémoire d’un projet ; les notes globales, les sources et les dates restent dehors. L’export suivant remplace toute la section balisée : une modification faite à la main à l’intérieur est perdue (le diff la montre d’abord) ; le texte hors des balises reste. Si les balises sont cassées (l’une manque ou elles sont là deux fois), l’export refuse tant que vous ne les corrigez pas. Un AGENTS.md de plus de 512 kB, un lien symbolique qui sort du dossier du projet et tout ce qui n’est pas un fichier normal sont refusés. Si AGENTS.md ou les notes changent après l’aperçu, **Écrire AGENTS.md** refuse et vous exportez de nouveau.
|
|
286
|
+
- **Lien vers l’origine des notes de mémoire** fonctionne pour les notes enregistrées après l’installation de cette version : une note plus ancienne n’indique que sa discussion (ou rien), donc **Origine** n’ouvre que la discussion ou ne s’affiche pas. Si le message n’existe plus (un retour arrière l’a retiré ou la discussion a été supprimée), la discussion s’ouvre et un avis indique que le message n’y est plus.
|
|
287
|
+
- **Copier la mémoire vers un autre projet** copie au plus 100 notes à la fois, et seulement vers un projet que dsh liste (il lit la liste de projets de dsh ; aucun chemin ne vient de la fenêtre). Chaque copie est indépendante : modifier plus tard une note dans un projet ne change pas la copie. Si une note cochée ne tient pas (le MEMORY.md ou le sujet de destination est plein, ou il a déjà 40 sujets), rien n’est copié. Une note dont le texte et le sujet sont déjà dans la destination est ignorée, et le compte indique combien.
|
|
288
|
+
- **Trouver les notes de mémoire obsolètes** ne trouve que ce qu’une note écrit sous une forme qu’il connaît : un chemin dans un bloc de code (`src/cart.ts`), un script npm après `npm run` (ou `npm test`, `pnpm lint`), un nom de branche dans un bloc de code près du mot « branche ». Un chemin qui sort du dossier du projet n’est pas signalé ; un script n’est vérifié que si le projet a un `package.json`, une branche que dans un dépôt git. Au plus 200 éléments sont vérifiés à la fois. Un avertissement veut dire « introuvable maintenant », pas « faux » : un fichier qu’une compilation crée plus tard est aussi signalé.
|
|
289
|
+
- **Ne pas utiliser la mémoire dans cette discussion** agit à partir de la prochaine requête au modèle de cette discussion : une requête déjà en cours garde ce qu’elle a. Le changer dans une discussion en cours modifie une fois son prompt système : cette requête ne peut donc pas utiliser le cache du fournisseur du modèle. Un sous-agent suit sa discussion racine. La revue ne lit pas les messages qu’une discussion reçoit pendant que sa mémoire est désactivée, même si vous la réactivez plus tard. Avec dsh 0.2.0, l’écran de nouvelle discussion n’a pas de place pour le bouton : il apparaît dans l’en-tête de la discussion après le premier message.
|
|
290
|
+
- **Suggérer des notes de mémoire depuis une discussion** affiche au plus 10 suggestions et les garde 30 minutes et jusqu’au redémarrage de dsh ; ensuite, accepter vous demande de suggérer de nouveau. Une longue discussion envoie ses messages les plus récents : les plus anciennes réponses de l’agent partent en premier. Une suggestion peut être fausse : lisez-la avant de l’accepter, et utilisez **Ouvrir la mémoire** pour modifier une note plus tard. Une suggestion refusée peut revenir au clic suivant.
|
|
255
291
|
- **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.
|
|
256
292
|
- **Restaurer** ne fonctionne que dans la console de secours, quand dsh est fermé : cela remplace tout le dossier personnel de dsh. L’ancien reste à côté sous le nom `.dsh.pre-restore-<time>` jusqu’à ce que vous le supprimiez : le disque doit donc avoir de la place pour les deux. Les discussions gardent les chemins de leurs projets : sur un autre ordinateur, un projet situé à un autre chemin apparaît comme manquant jusqu’à ce que vous l’ajoutiez de nouveau. Les liens symboliques qui pointent hors du dossier personnel de dsh (par exemple des compétences liées depuis un autre dossier) reviennent comme liens ; leurs cibles doivent exister sur cet ordinateur.
|
|
257
293
|
- **Vérification des journaux de session** lit le journal le plus récent de chaque discussion avec les propres règles de dsh sur ce qui s’ouvre : une ligne qui n’est pas du JSON ou qui n’est pas dans l’ordre ne compte comme un dommage que si une fin de tour vient après elle (sinon dsh ouvre la discussion sans les lignes à partir de là, donc elle n’est pas listée). Elle ne vérifie pas les événements d’un journal par rapport aux règles d’événements de dsh lui-même : un journal qu’elle juge sain peut donc quand même ne pas s’ouvrir après une mise à niveau de dsh. Une réparation prend la copie d’une sauvegarde : les messages postérieurs à cette sauvegarde sont perdus pour cette discussion (le fichier endommagé reste à côté). Une discussion ouverte dans ce dsh n’est pas réparée dans les Réglages : dsh la détient.
|
|
@@ -286,7 +322,13 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
286
322
|
|
|
287
323
|
**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.
|
|
288
324
|
|
|
289
|
-
**
|
|
325
|
+
**L’IA ou moi avons fait une mauvaise modification dans la mémoire. Puis-je récupérer les anciennes notes ?** Oui, avec **Historique des versions de la mémoire** (activé par défaut) : dans **Ouvrir la mémoire**, sélectionnez le projet, puis **Historique**. Sélectionnez la version d’avant la modification pour voir ce qui revient, puis **Restaurer**.
|
|
326
|
+
|
|
327
|
+
**Puis-je partager la mémoire du projet avec mon équipe ou un autre outil d’agents ?** Oui, avec **Exporter la mémoire vers AGENTS.md** (activé par défaut) : dans **Ouvrir la mémoire**, sélectionnez le projet, puis **Exporter vers AGENTS.md**. Vérifiez le diff, puis **Écrire AGENTS.md**, et committez le fichier.
|
|
328
|
+
|
|
329
|
+
**L’IA peut-elle suggérer quoi garder d’une longue discussion ?** Oui, avec **Suggérer des notes de mémoire depuis une discussion** (activé par défaut tant que **Mémoire du projet** est activée) : cliquez sur **Suggérer pour la mémoire** dans l’en-tête de la discussion, puis **Accepter** les notes qui valent la peine d’être gardées.
|
|
330
|
+
|
|
331
|
+
**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.
|
|
290
332
|
|
|
291
333
|
**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.
|
|
292
334
|
|
|
@@ -314,10 +356,22 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
314
356
|
|
|
315
357
|
**Comment empêcher l’agent d’exécuter `npm publish` ou `git push --force` ?** **Réglages → Composer Plus → Commandes bloquées** : tapez `npm publish`, choisissez **bloquer** ou **demander d’abord**, puis cliquez sur **Ajouter**. **bloquer** refuse la commande et l’agent vous consulte ; **demander d’abord** affiche la carte d’approbation à chaque fois. Fichiers protégés couvre les outils de fichiers de l’agent ; Commandes bloquées couvre ses commandes shell.
|
|
316
358
|
|
|
359
|
+
**Puis-je dire à l’agent pourquoi j’ai refusé un appel d’outil ?** Oui, avec **Refuser avec une note** (activé par défaut) : cliquez sur **Refuser avec une note…** sur la carte d’approbation, écrivez la raison ou ce qu’il faut faire à la place, puis cliquez sur **Refuser**. L’agent lit le refus et votre note dans le même tour.
|
|
360
|
+
|
|
361
|
+
**Comment donner un mot de passe ou un jeton à l’agent sans l’écrire dans la discussion ?** Avec **Saisie secrète** (activée par défaut) : demandez à l’agent d’utiliser `request_secret`, ou attendez qu’il le demande. Tapez la valeur dans la carte sur la ligne de l’outil et cliquez sur **Enregistrer**. L’agent reçoit seulement le chemin d’un fichier qui contient la valeur, et le fichier est supprimé à la fin du tour.
|
|
362
|
+
|
|
363
|
+
**Comment répondre à une seule partie d’une longue réponse ?** Sélectionnez cette partie et cliquez sur **Citer** au-dessus de la sélection (**Citer dans la réponse**, activée par défaut). La partie va dans le champ de saisie comme citation `> …`, et vous écrivez votre réponse en dessous.
|
|
364
|
+
|
|
365
|
+
**Puis-je poser une question pendant que l’agent travaille, sans l’arrêter ?** Écrivez la question et cliquez sur **Demander dans une discussion annexe** dans le champ de saisie (**Discussion annexe**, activée par défaut). Une copie en lecture seule de la discussion y répond pendant que la discussion continue. Dans la discussion annexe, **Rapporter** met la réponse dans le champ de saisie de la discussion.
|
|
366
|
+
|
|
367
|
+
**Comment dire à l’agent quoi changer dans son diff ?** Dans **Panneau des modifications**, ouvrez le diff du fichier, cliquez sur **+** à une ligne et écrivez une note (**Notes de diff**, activé par défaut). Puis cliquez sur **Envoyer au champ de saisie** : les notes vont dans le champ de saisie avec le fichier, les numéros de ligne et les lignes.
|
|
368
|
+
|
|
317
369
|
**Comment empêcher la revue automatique de redemander pour le même outil dans une discussion ?** Cliquez sur **Autoriser pour cette discussion** sur la carte d’approbation. Cela couvre cet outil précis dans cette discussion seulement, pendant 1 heure par défaut ; révoquez l’autorisation depuis la pastille de l’en-tête. Changez la durée dans **Réglages → Composer Plus → Autoriser pour cette discussion**.
|
|
318
370
|
|
|
319
371
|
**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.
|
|
320
372
|
|
|
373
|
+
**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…** à gauche du titre de la discussion, collez le lien et cliquez sur **Connecter**. Cliquez ensuite sur **Approuver** sur l’autre Mac. Par la suite, choisissez cet ordinateur dans le même menu.
|
|
374
|
+
|
|
321
375
|
**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.
|
|
322
376
|
|
|
323
377
|
**Comment n’afficher que les projets utilisés aujourd’hui dans la barre latérale de dsh ?** Barre latérale → options d’affichage (icône de curseurs) → **Actifs au cours des 2 dernières heures**. Sélectionnez de nouveau l’option pour afficher tous les projets.
|
|
@@ -330,6 +384,10 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
330
384
|
|
|
331
385
|
**dsh peut-il ouvrir tout seul la discussion qui me pose une question ?** Oui, avec **Ouvrir la discussion en attente en cas d’inactivité** (activé par défaut) : quand une discussion attend une réponse, une approbation ou une revue du plan et que vous n’utilisez pas dsh pendant 30 secondes, dsh l’ouvre. Une discussion qui a terminé un tour que vous n’avez pas encore lu (le point vert) s’ouvre de la même façon, après les orange. Pendant que vous tapez, faites défiler ou bougez la souris, il attend.
|
|
332
386
|
|
|
387
|
+
**Puis-je aller directement à la prochaine discussion qui m’attend ?** Oui, avec **Discussion en attente suivante** (activée par défaut) : appuyez sur `Cmd+Shift+E` (`Ctrl+Shift+E` sous Windows et Linux) ou cliquez sur le bouton avec le nombre dans l’en-tête de la barre latérale. Les discussions qui posent une question ou attendent une approbation passent d’abord, puis celles qui ont terminé un tour que vous n’avez pas lu.
|
|
388
|
+
|
|
389
|
+
**Puis-je répondre aux options d’un agent en un clic ?** Oui, avec **Boutons d’options** (activé par défaut) : quand une réponse se termine par une liste « Options », cliquez sur un bouton sous la réponse. Il envoie « Option N: … » comme votre message. Sur une carte de question de l’agent, appuyez sur 1 à 9.
|
|
390
|
+
|
|
333
391
|
**Comment passer l’interface de DeepSeek Harness en turc, en espagnol, en japonais… ?** Réglages → Composer Plus → **Langue de l’application**.
|
|
334
392
|
|
|
335
393
|
**Comment utiliser dsh depuis mon iPhone ?** Compilez l’app Tether depuis `tether/ios` (Xcode), activez **Réglages → Composer Plus → Connexion mobile (iPhone)**, cliquez sur **Connexion mobile** en bas à gauche, scannez le code QR (avec l’app Appareil photo de l’iPhone ou avec **Scan code** dans Tether), touchez **Connect** et cliquez sur **Approve**. Hors de chez vous, utilisez Tailscale sur les deux appareils.
|
|
@@ -359,6 +417,10 @@ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/ds
|
|
|
359
417
|
PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
|
|
360
418
|
# Order by status (fake model + Schedule): real-app test + its thumbnail
|
|
361
419
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
|
|
420
|
+
# Next waiting chat and Option buttons (fake model): the sidebar button and Cmd+Shift+E open the waiting chats in order, the Keyboard shortcuts row, the option buttons and the question card keys, switch off + their thumbnails
|
|
421
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
|
|
422
|
+
# Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
|
|
423
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
|
|
362
424
|
# every Settings feature row shows a loading screenshot and a ? link to its README row
|
|
363
425
|
PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
|
|
364
426
|
# What's new after an update: the release notes show once, Esc and Close close them
|
|
@@ -408,7 +470,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
408
470
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
409
471
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
410
472
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
411
|
-
# Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board,
|
|
473
|
+
# 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
|
|
412
474
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
413
475
|
```
|
|
414
476
|
|