dsh-composer-plus 1.22.0 → 1.23.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 +39 -11
- package/README.es.md +39 -11
- package/README.fr.md +39 -11
- package/README.hi.md +39 -11
- package/README.id.md +39 -11
- package/README.ja.md +39 -11
- package/README.ko.md +39 -11
- package/README.md +39 -11
- package/README.pt-BR.md +39 -11
- package/README.ru.md +39 -11
- package/README.tr.md +39 -11
- package/README.vi.md +39 -11
- package/README.zh.md +39 -11
- package/assets/features/featureFilter.webp +0 -0
- package/assets/features/issueReport.webp +0 -0
- package/assets/features/previewQuote.webp +0 -0
- package/assets/features/remoteComputers.webp +0 -0
- package/assets/features/turkishSkill.webp +0 -0
- package/assets/features/untangleCodebase.webp +0 -0
- package/assets/features/windowSize.webp +0 -0
- package/assets/skills/untangle-codebase/LICENSE +21 -0
- package/assets/skills/untangle-codebase/SKILL.md +142 -0
- package/client.js +941 -161
- package/index.js +467 -39
- package/package.json +4 -3
- package/release-notes.json +14 -14
- package/tether/gateway/server.mjs +24 -5
package/README.fr.md
CHANGED
|
@@ -14,7 +14,7 @@ Des fonctions pratiques dans le style de Codex pour l’interface de bureau et w
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness avec Composer Plus : le projet en cours affiche un indicateur de chargement dans la barre latérale et le panneau des modifications affiche un diff git"></p>
|
|
16
16
|
|
|
17
|
-
Plugin communautaire non officiel.
|
|
17
|
+
Plugin communautaire non officiel. La recherche de mises à jour fait des appels réseau (versions GitHub et registre npm) ; désactivez **Mises à jour automatiques** pour les arrêter au démarrage. **Pack de skill turc** (activé par défaut) télécharge turkish-anti-ai-skill depuis GitHub et cherche une nouvelle version une fois par jour, uniquement quand **Langue de l’application** est Türkçe ; désactivez-le dans **Réglages → Composer Plus** pour arrêter ces appels. **Idées de fonctionnalités** n’appelle le modèle de votre discussion que lorsque vous cliquez sur **Suggérer des fonctionnalités**. **Prédiction du message suivant** (activée par défaut) appelle le modèle choisi dans les Réglages (celui par défaut de dsh, sauf si vous en choisissez un autre) une fois après chaque tour terminé, sans clic. Désactivez-la dans **Réglages → Composer Plus** pour arrêter ces appels. **Compléter pendant la saisie** (désactivé par défaut) appelle le modèle choisi pour cette fonctionnalité (par défaut, celui de la prédiction) à chaque pause pendant la saisie, une fois que vous l’avez activé. **Améliorer le prompt** n’appelle un modèle que lorsque vous cliquez sur sa baguette magique. **Tableau des tâches** appelle le modèle de la nouvelle discussion une fois pour les étiquettes de chaque tâche que vous lancez depuis le tableau. Avec son réglage **Résumé par IA** (par défaut **Rapide (sans IA)**), il appelle aussi le modèle d’une discussion en cours pour une courte note de progression pendant que vous regardez la progression de cette tâche sur le tableau ou dans Tether. **Vérification de l’objectif** (activée par défaut) appelle un modèle une fois chaque fois que l’agent marque un `/goal` comme terminé lors d’une itération automatique. **Connexion mobile** (désactivée par défaut) accepte les connexions d’iPhone depuis votre réseau local ou votre tailnet, et seulement après que vous l’avez activée.
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau ; c’est l’app qui le gère.)
|
|
31
31
|
|
|
32
|
-
> Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.
|
|
32
|
+
> Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.23.0`.
|
|
33
33
|
|
|
34
34
|
## Fonctionnalités
|
|
35
35
|
|
|
@@ -48,6 +48,7 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
48
48
|
| **Garder le focus dans la zone de saisie** | <a id="feature-keepfocus"></a>Après l’envoi d’une commande `/` ou d’une compétence, le curseur reste dans la zone de saisie et vous pouvez taper de nouveau tout de suite. Cela fonctionne aussi pour les macros clavier qui tapent une commande et appuient sur `Enter`. dsh met la zone de saisie en lecture seule pendant qu’il résout la commande, et le navigateur retire alors le focus. Cette fonctionnalité remet le focus, sauf si un menu, une boîte de dialogue ou un autre champ l’a. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Capture d’écran : Garder le focus dans la zone de saisie"></a> |
|
|
49
49
|
| **Adapter la carte de question à la fenêtre** | <a id="feature-questionfit"></a>Quand l’agent vous pose une question, la question et ses réponses défilent ensemble dans la carte, et **Ignorer** et **Envoyer** restent visibles en bas. La carte utilise la hauteur de la fenêtre (moins 200 px pour l’en-tête de la conversation et une bande de la conversation) : elle grandit et rétrécit avec la fenêtre. Sans cette fonctionnalité, dsh limite la carte à 60 % de la fenêtre (520 px au plus) et seules les réponses défilent : une longue question peut pousser sa propre fin, les réponses et les boutons hors de la carte. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Capture d’écran : Adapter la carte de question à la fenêtre"></a> |
|
|
50
50
|
| **Adapter l’en-tête de la conversation à la fenêtre** | <a id="feature-headerfit"></a>Dans une fenêtre étroite, les boutons de l’en-tête de la conversation de dsh (le mode, les sous-agents, les tâches en arrière-plan, Ouvrir dans, l’étiquette de branche et l’étiquette d’autorisations) ne se chevauchent plus. Le titre garde au moins 120 px ; les boutons qui ne tiennent pas passent sur une deuxième ligne à droite, et chacun reste cliquable. Quand tout tient sur une ligne (fenêtre large), l’en-tête est exactement celui de dsh. Sans cette fonction, dsh ne réduit que le titre : avec un sous-agent et des tâches en arrière-plan, ses boutons se chevauchent dans une colonne de conversation étroite. L’étiquette de branche (**Une branche par discussion**) et celle d’autorisations (**Autoriser pour cette discussion**) s’adaptent aussi à l’en-tête quand cet interrupteur est désactivé. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Capture d’écran : Adapter l’en-tête de la conversation à la fenêtre"></a> |
|
|
51
|
+
| **Mémoriser la taille de la fenêtre** | <a id="feature-windowsize"></a>L’application de bureau de dsh ouvre sa fenêtre en 1280 × 820 à chaque démarrage. Avec cette fonction, elle s’ouvre avec la taille et la position de la fenêtre lors de la dernière utilisation. La taille est enregistrée chaque fois que vous redimensionnez ou déplacez la fenêtre, et revient quand le plugin se charge au démarrage suivant. Une fenêtre en plein écran ou réduite n’est pas enregistrée ; une position sur un écran qui n’est plus connecté revient sur l’écran principal. Uniquement dans l’application de bureau : un onglet de navigateur ne peut pas changer la taille de sa fenêtre. | <a href="assets/features/windowSize.webp"><img src="assets/features/windowSize.webp" width="160" alt="Capture d’écran : Mémoriser la taille de la fenêtre"></a> |
|
|
51
52
|
| **Continuer en un clic** | <a id="feature-continuebutton"></a>Après un tour arrêté, en échec ou interrompu, une zone de saisie vide affiche **▶**. Un clic reprend la conversation existante, sans écrire dans le champ de saisie ni ajouter de message visible à la discussion (le modèle reçoit une courte note cachée « continue là où tu t’es arrêté », car certains fournisseurs, comme Claude, refusent une requête qui se termine par une réponse de l’assistant). Les messages de la file y restent : ▶ reprend seulement la tâche arrêtée, puis la file s’exécute. Un tour terminé garde le bouton Envoyer habituel. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Capture d’écran : Continuer en un clic"></a> |
|
|
52
53
|
| **Reprendre après redémarrage** | <a id="feature-resumeafterrestart"></a>Désactivée par défaut : activez-la dans **Réglages → Composer Plus**. Si vous quittez dsh (ou s’il se ferme) pendant qu’une discussion travaille, cette discussion reprend d’elle-même quand vous rouvrez dsh, avec la même note cachée que Continuer en un clic. Si une itération d’objectif (`/goal`) était en cours, l’objectif passe à l’itération suivante (dsh suspend les objectifs à chaque démarrage jusqu’à ce que vous les repreniez). Les discussions que vous avez arrêtées, terminées ou en échec ne reprennent pas. dsh lui-même n’a pas de réglage pour cela : il marque seulement ce tour comme interrompu. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Capture d’écran : Reprendre après redémarrage"></a> |
|
|
53
54
|
| **Glisser-déposer dans la file** | <a id="feature-queuereorder"></a>Les messages en file d’attente reçoivent une poignée (⠿). Faites-la glisser pour réordonner, ou placez le focus sur la poignée et appuyez sur `↑` / `↓`. `Esc` annule. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Capture d’écran : Glisser-déposer dans la file"></a> |
|
|
@@ -69,6 +70,8 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
69
70
|
| **Continuer dans une nouvelle discussion** | <a id="feature-handoffchat"></a>Clic droit sur une discussion dans la barre latérale (ou ouvrez son menu **…**) → **Continuer dans une nouvelle discussion…**. Un seul appel au modèle de la discussion rédige une note de passation à partir de ce que montre la discussion : Tâche, Résultats, Terminé, Décisions, Problèmes ouverts et Prochaine action (les appels d’outils et leurs résultats sont les preuves ; les étapes que vous avez annulées sont exclues). La note s’ouvre dans une boîte de dialogue : lisez-la et modifiez-la. **Rédiger à nouveau** rédige une nouvelle note. **Lancer une nouvelle discussion** (ou `Cmd/Ctrl+Enter`) ouvre une nouvelle discussion dans le même projet, avec la note et un lien vers l’ancienne discussion comme premier message ; l’ancienne discussion reste telle quelle. Utilisez cette fonction quand une longue discussion est pleine ou lente, ou pour continuer demain. Rien n’est écrit dans le projet. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Capture d’écran : Continuer dans une nouvelle discussion"></a> |
|
|
70
71
|
| **Répartition du contexte** | <a id="feature-contextbreakdown"></a>Barre latérale droite → `+` → **Contexte**. La page montre ce qui remplit maintenant le contexte du modèle de la discussion ouverte et la part de la fenêtre de contexte utilisée : le prompt système, les instructions du projet (AGENTS.md), les compétences, vos messages, les réponses de l’agent et les appels d’outils, les résultats d’outils (par outil), les résultats MCP (par serveur), les définitions des outils, le résumé de compaction et les autres notes de contexte, chacun avec ses tokens et sa part. Cliquez sur une partie pour voir ses outils ou ses serveurs. Elle lit seulement le journal de la discussion, après `/compact` et les annulations, et n’appelle aucun modèle ; elle relit le journal après chaque tour et avec **Actualiser**. Utilisez-la pour voir pourquoi une discussion est lente ou pleine, par exemple à cause d’un gros résultat d’outil MCP ou de nombreuses définitions d’outils. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Capture d’écran : Répartition du contexte"></a> |
|
|
71
72
|
| **É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> |
|
|
73
|
+
| **Pack de skill turc** | <a id="feature-turkishskill"></a>Uniquement quand **Langue de l’application** est Türkçe (activé par défaut ; désactivez-le dans **Réglages → Composer Plus**). Composer Plus télécharge depuis GitHub le skill open source [turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) (MIT, par Yüce Zerey) et l’ajoute aux skills de dsh. Demandez à l’agent d’humaniser, de réécrire ou d’écrire un texte en turc : dsh charge le skill, et ses règles aident l’agent à écrire un turc naturel, sans tournures d’IA. Seuls les fichiers Markdown du pack sont gardés ; chaque fichier doit correspondre à la liste des fichiers de GitHub, et aucun script du pack ne s’exécute. Une fois par jour, le plugin demande à GitHub s’il existe une nouvelle version et l’installe. La ligne affiche la version installée, ou pourquoi elle n’est pas installée. Dans une autre langue, le skill n’est pas installé ; revenez au Türkçe et il revient. | <a href="assets/features/turkishSkill.webp"><img src="assets/features/turkishSkill.webp" width="160" alt="Capture d’écran : Pack de skill turc"></a> |
|
|
74
|
+
| **Démêler le code** | <a id="feature-untanglecodebase"></a>Activée par défaut ; désactivez-la dans **Réglages → Composer Plus**. Ajoute la compétence `/untangle-codebase` de [caldoai/skills](https://github.com/caldoai/skills) (MIT, © 2026 Maze) à la liste des compétences de dsh. Dans une discussion, tapez `/untangle-codebase` (elle apparaît dans le menu `/`), si vous voulez suivi d’une partie sur laquelle se concentrer, par exemple `/untangle-codebase src/api`, puis envoyez. L’agent demande d’abord s’il doit aussi supprimer les commentaires qui ne font que répéter le code et les tests qui ne peuvent détecter aucun vrai bug. Ensuite, il liste chaque copie, lien caché, lien inutile, enveloppe qui ne fait que transmettre l’appel, code mort et cas particulier ponctuel, planifie les corrections à partir des principes de base, les applique sous forme d’objectif et vérifie de nouveau avec des sous-agents jusqu’à ce qu’il ne reste rien qui vaille la peine d’être corrigé. Vous seul pouvez la lancer : le modèle ne la voit pas dans sa liste de compétences, elle ne consomme donc aucun jeton dans les autres discussions. Une compétence du même nom dans le projet ou dans `~/.dsh/skills` passe avant. Lancez-la dans une discussion de **Une branche par discussion** et examinez le résultat dans **Panneau des modifications**. Dans Tether : tapez `/untangle-codebase` dans le champ du message. | <a href="assets/features/untangleCodebase.webp"><img src="assets/features/untangleCodebase.webp" width="160" alt="Capture d’écran : Démêler le code"></a> |
|
|
72
75
|
| **Fichiers protégés** | <a id="feature-protectedfiles"></a>Activée par défaut. Les outils de fichiers propres à l’agent ne peuvent ni lire ni modifier les fichiers qui correspondent à vos motifs : `read`, `read_image` et `grep` sur un fichier sont refusés pour les motifs **lecture et écriture**, et `write`, `edit` et `str_replace_editor` pour les deux types. L’agent lit pourquoi et on lui demande de vous consulter. Les motifs par défaut sont `.env*`, `*.pem` et `*.key`. Réglages → Composer Plus → **Fichiers protégés** : ajoutez un motif (par exemple `published/**` ou `config/*.yml`), cliquez sur son type pour basculer entre **lecture et écriture** et **écriture seule**, supprimez-le avec ✕, ou cliquez sur **Utiliser les valeurs par défaut**. Un motif sans `/` correspond à un nom de fichier dans n’importe quel dossier. C’est un garde-fou, pas un sandbox : une commande shell (`cat .env`), un script ou un outil MCP peut encore atteindre le fichier (voir Limites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Capture d’écran : Fichiers protégés"></a> |
|
|
73
76
|
| **Commandes bloquées** | <a id="feature-blockedcommands"></a>Activée par défaut, avec une liste vide. Les commandes shell de l’agent (`bash`, `pwsh`) ne peuvent pas exécuter une commande qui correspond à vos règles : une règle **bloquer** refuse l’appel (l’agent lit pourquoi et on lui demande de vous consulter), une règle **demander d’abord** affiche la carte d’approbation de dsh, et la commande ne s’exécute que si vous l’autorisez. Réglages → Composer Plus → **Commandes bloquées** : tapez une règle (par exemple `npm publish`, `git push --force` ou `ssh *192.168.2.19`), cliquez sur son type pour basculer entre **bloquer** et **demander d’abord**, puis cliquez sur **Ajouter** ; cliquez sur le type d’une règle pour le changer, supprimez-la avec ✕. Une règle est un nom de commande et des mots qui doivent le suivre dans cet ordre ; `*` correspond à n’importe quel texte. La vérification trouve aussi la commande après `&&`, `;`, `\|`, dans `$(…)`, `bash -c "…"` ou `eval`, et après `sudo` ou `env`. C’est un garde-fou, pas un sandbox : une variable (`$CMD`), un fichier de script ou un autre programme peut encore exécuter la commande (voir Limites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Capture d’écran : Commandes bloquées"></a> |
|
|
74
77
|
| **Tableau des tâches** | <a id="feature-taskboard"></a>Barre latérale gauche → **Tableau des tâches**, ou appuyez sur `Cmd+Shift+K` (`Ctrl+Shift+K` sous Windows et Linux) partout dans dsh. Un tableau kanban de vos discussions dsh, avec l’état en direct que montre la barre latérale : une discussion qui attend votre approbation, votre réponse ou la revue d’un plan est dans **En revue** avec un point orange, une discussion en cours d’exécution est dans **En cours**, une discussion terminée que vous n’avez pas encore ouverte est dans **Terminé** (en vert). Quand vous ouvrez une discussion, sa carte quitte **Terminé** d’elle-même ; cliquez sur **Terminées récemment (N)**, sous les cartes vertes, pour voir les discussions terminées que vous avez lues (les 10 plus récentes, puis **Afficher N plus anciennes** ; ouvert ou fermé reste sur cet appareil). Une discussion qui se termine alors qu’elle est ouverte derrière le tableau (une **Nouvelle tâche**) reste verte jusqu’à ce que vous l’ouvriez. Cliquez sur le nom du projet, en haut du tableau, pour ouvrir la liste des projets, puis choisissez un projet ou **Tous les projets** ; le dossier d’une branche par discussion compte comme son projet. La liste se ferme après le choix, avec `Esc` ou avec un clic en dehors. Tapez dans **Rechercher des projets**, en haut de la liste, pour trouver un projet par son nom (la casse et les accents ne comptent pas ; `Esc` vide le champ), appuyez sur `Entrée` pour choisir le premier résultat, et cliquez sur **Actifs au cours des 2 dernières heures** pour n’afficher que les projets avec une discussion qui attend, s’exécute, s’est terminée sans être vue ou a changé au cours des 2 dernières heures (réglage gardé sur cet appareil). **Nouvelle tâche** (ou `n`) ouvre la nouvelle discussion de dsh lui-même dans le projet que montre le tableau (avec **Tous les projets**, le projet que choisit Nouvelle session de dsh) : vous pouvez donc ajouter des fichiers, utiliser des commandes et choisir le modèle comme dans toute discussion. Quand votre premier message part, le tableau revient de lui-même. D’ici là, la discussion attend en haut de **En cours** sous le nom **Nouvelle tâche** : cliquez dessus pour écrire le premier message. Un projet dont une discussion vous attend a un point orange dans la liste des projets (le nom du projet en haut en a un aussi tant qu’une discussion attend). dsh nomme la discussion et le modèle de la discussion écrit jusqu’à 3 étiquettes à partir de ce message. Cliquez sur une carte pour ouvrir sa discussion. Cliquez sur une carte orange (ou sur son **Répondre**) pour y répondre depuis le tableau ; le panneau a **Ouvrir la discussion** pour voir toute la discussion : **Refuser** ou **Autoriser une fois**, **Approuver** ou **Demander des modifications** pour un plan, ou les options et votre propre texte pour une question. Cliquez sur **×** sur une carte terminée pour la retirer du tableau, ou ouvrez **Terminées récemment** et cliquez sur **Tout retirer** en haut de **Terminé** pour retirer ces cartes du tableau : une fenêtre montre d’abord combien de cartes de quel projet partent, et les cartes non lues (vertes) restent. Pendant les 8 secondes qui suivent, **Annuler** remet les cartes ; **Retirées (N)**, sous **Terminé**, liste les cartes qui sont hors du tableau, et **Remettre** affiche de nouveau l’une d’elles dans **Terminé**. Aucune discussion n’est supprimée : les discussions restent dans la barre latérale de dsh, le tableau s’en souvient après un redémarrage (Tether affiche le même tableau), et une discussion qui s’exécute de nouveau revient sur le tableau. Pointez une carte dans **En cours** (ou placez-y le focus du clavier) pour voir sa progression : depuis combien de temps la discussion s’exécute, l’étape de sa liste de tâches, l’outil qui s’exécute en ce moment et la dernière ligne de l’agent. Dans Réglages → Composer Plus → Tableau des tâches, **Progression au survol** choisit **Rapide (sans IA)** (par défaut : lit seulement la discussion) ou **Résumé par IA** (un court appel au modèle de la discussion écrit aussi une ou deux phrases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Capture d’écran : Tableau des tâches"></a> |
|
|
@@ -84,6 +87,7 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
84
87
|
| **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
88
|
| **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
89
|
| **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> |
|
|
90
|
+
| **Citer depuis l’aperçu du fichier** | <a id="feature-previewquote"></a>Ouvrez un fichier dans la barre latérale droite (**Fichiers de l’espace de travail**, ou un fichier que la discussion a ouvert) et sélectionnez des lignes : un bouton **Citer** s’affiche au-dessus de la sélection. Cliquez dessus : le chemin du fichier, les numéros de ligne et les lignes vont dans le champ de saisie, à la position du curseur, et le champ de saisie reçoit le focus, pour que l’agent sache de quelle partie vous parlez. Les fichiers de code et de texte donnent `src/login.js:2-3` et les lignes en bloc de code ; les fichiers Markdown et PDF donnent le chemin (un PDF aussi sa page, `docs/spec.pdf#page=3`) et une citation `> …`. Un chemin dans le dossier de la discussion est relatif. Au plus 2 000 caractères. `Cmd+Z` (`Ctrl+Z`) retire le texte inséré. Pas dans Tether. | <a href="assets/features/previewQuote.webp"><img src="assets/features/previewQuote.webp" width="160" alt="Capture d’écran : Citer depuis l’aperçu du fichier"></a> |
|
|
87
91
|
| **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
92
|
| **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> |
|
|
89
93
|
| **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> |
|
|
@@ -95,12 +99,14 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
95
99
|
| **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> |
|
|
96
100
|
| **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> |
|
|
97
101
|
| **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> |
|
|
102
|
+
| **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. Un clic sur le bouton retrouve aussi la discussion dans la barre latérale : un projet replié s’ouvre, la liste défile jusqu’à la discussion et la discussion clignote pendant 5 secondes. 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
103
|
| **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> |
|
|
100
104
|
| **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> |
|
|
101
105
|
| **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
|
|
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. La fenêtre s’affiche aussi après une mise à jour par Réglages → Plugins ou par un dossier copié, une fois par nouvelle version ; pas à la première installation. **Nouveautés de cette version** dans la ligne des mises à jour la rouvre. Si le disque contient une version plus récente que celle qui tourne, la ligne demande de redémarrer dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Capture d’écran : Mises à jour automatiques"></a> |
|
|
106
|
+
| **Ordinateurs distants** | <a id="feature-remotecomputers"></a>Ouvrez le dsh de vos autres Mac via [Tailscale](https://tailscale.com) et utilisez-les dans cette fenêtre de dsh. Activez la fonction dans **Réglages → Composer Plus** sur chaque Mac (elle est désactivée par défaut, car elle ouvre des ports réseau). Sur le Mac que vous voulez ouvrir, activez **Autoriser d’autres ordinateurs à ouvrir ce Mac**, cliquez sur **Créer un lien d’appairage** et copiez le lien. Sur ce Mac, choisissez **Ajouter un ordinateur…** dans le sélecteur d’ordinateurs de la barre latérale gauche (à droite du nom de la marque, au-dessus de **Nouvelle session**), collez le lien, saisissez un **Nom** (pas le nom de ce Mac ni celui d’un autre ordinateur) et cliquez sur **Connecter**. Cliquez ensuite sur **Approuver** sur l’autre Mac. Le sélecteur liste alors **Ce Mac** et vos ordinateurs : choisissez-en un, et son dsh remplit cette fenêtre, avec ses propres discussions, barre latérale, outils et fichiers, pendant que ce Mac continue de tourner derrière. L’autre Mac affiche le même sélecteur au même endroit : choisissez-y **Ce Mac** pour revenir. Le panneau des réglages renomme et supprime les ordinateurs, et liste les ordinateurs qui peuvent ouvrir ce Mac (**Supprimer** en déconnecte un tout de suite). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Capture d’écran : Ordinateurs distants"></a> |
|
|
107
|
+
| **Mises à jour automatiques** | <a id="feature-autoupdate"></a>Au démarrage de dsh, le plugin vérifie la [dernière version sur GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Si elle est plus récente et déjà sur npm, il installe exactement cette version avec le gestionnaire de plugins de dsh (le même chemin que Réglages → Plugins) et vous avertit. Redémarrez dsh pour la charger. **Réglages → Composer Plus → Mises à jour de Composer Plus** affiche la version et propose **Rechercher des mises à jour** / **Mettre à jour**. Au premier démarrage de dsh avec la nouvelle version, une fenêtre **Nouveautés de Composer Plus N** affiche une fois les notes de cette version dans la langue de **Langue de l’application** (elles arrivent avec la nouvelle version, sans autre appel réseau ; une langue sans notes affiche les notes en anglais) ; **Fermer** ou `Esc` la ferme. Sous les notes, une ligne demande une étoile sur GitHub, au plus une fois tous les 30 jours (sans appel réseau) ; après **Mettre une étoile sur GitHub** ou **Ne plus demander**, elle ne s’affiche plus. La fenêtre s’affiche aussi après une mise à jour par Réglages → Plugins ou par un dossier copié, une fois par nouvelle version ; pas à la première installation. **Nouveautés de cette version** dans la ligne des mises à jour la rouvre. Si le disque contient une version plus récente que celle qui tourne, la ligne demande de redémarrer dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Capture d’écran : Mises à jour automatiques"></a> |
|
|
108
|
+
| **Filtre activées/désactivées** | <a id="feature-featurefilter"></a>À côté de **Rechercher des fonctionnalités** dans **Réglages → Composer Plus** : **Toutes** affiche toutes les fonctionnalités, **Activées** seulement celles dont l’interrupteur est activé et **Désactivées** seulement celles dont il est désactivé. C’est l’interrupteur de chaque ligne qui décide, y compris un interrupteur que garde l’hôte de dsh (par exemple **Connexion mobile**). Le filtre fonctionne avec la recherche : tapez un mot et choisissez **Désactivées** pour trouver une fonctionnalité que vous avez désactivée. Une ligne que vous basculez pendant que **Activées** ou **Désactivées** est choisi reste affichée jusqu’à ce que vous choisissiez de nouveau un filtre ; le focus reste donc sur son interrupteur. **Activées** et **Désactivées** masquent les lignes **Langue de l’application** et **Mises à jour de Composer Plus** (elles n’ont pas d’interrupteur). Les réglages s’ouvrent toujours sur **Toutes**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Capture d’écran : Filtre activées/désactivées"></a> |
|
|
109
|
+
| **Signaler une issue** | <a id="feature-issuereport"></a>Réglages → Composer Plus → **Signaler une issue…** (sous l’introduction), ou clic droit sur une discussion dans la barre latérale (ou ouvrez son menu **…**) → **Signaler une issue Composer Plus…**. Choisissez un type : **Bug**, **Demande de fonctionnalité**, **Amélioration**, **Traduction** ou **Question**. Décrivez-le avec vos propres mots et dans votre langue, puis cliquez sur **Rédiger le brouillon** (ou `Cmd/Ctrl+Enter`). Un seul appel au modèle par défaut de dsh rédige une issue en anglais : un titre avec le préfixe du type (par exemple `[Bug]`) et les sections de ce type (pour un bug : What happened, Steps to reproduce, Expected, Actual), plus une ligne avec les versions de Composer Plus, de dsh et du système. Lisez et modifiez le titre et la description ; **Rédiger à nouveau** rédige un nouveau brouillon. **Ouvrir l’issue** l’ouvre dans le dépôt GitHub de Composer Plus avec votre connexion GitHub CLI (`gh`) et affiche son lien. L’issue est publique : un texte qui ressemble à une clé ou à un mot de passe est refusé. Quand `gh` ne peut pas l’ouvrir, **Ouvrir plutôt sur GitHub** ouvre la page de GitHub lui-même avec le brouillon déjà rempli. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Capture d’écran : Signaler une issue"></a> |
|
|
104
110
|
| **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> |
|
|
105
111
|
| **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> |
|
|
106
112
|
| **Vérification des journaux de session** | <a id="feature-sessiondoctor"></a>**Vérifier les journaux de session** lit le journal de chaque discussion et liste ceux que dsh ne peut pas ouvrir (une trame cassée, un enregistrement coupé, un mauvais numéro de séquence). Une fin incomplète n’est pas listée : dsh la répare lui-même. **Réparer depuis les sauvegardes** remet la copie de la sauvegarde la plus récente qui en contient une saine et garde le fichier endommagé à côté (`.corrupt-<heure>`). Les messages écrits après cette sauvegarde ne sont pas dans la copie. Une discussion ouverte dans ce dsh n’est pas réparée ici : quittez dsh et réparez-la dans la console de secours. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Capture d’écran : Vérification des journaux de session"></a> |
|
|
@@ -112,7 +118,7 @@ Les boutons, info-bulles, messages et notifications suivent la langue choisie da
|
|
|
112
118
|
|
|
113
119
|
## Réglages
|
|
114
120
|
|
|
115
|
-
Chaque fonctionnalité peut être activée ou désactivée séparément : dsh **Réglages → Composer Plus**. Chaque ligne a une petite capture d’écran : survolez-la pour un aperçu plus grand, cliquez dessus pour l’ouvrir en taille réelle (`Esc` la ferme). La zone **Rechercher des fonctionnalités**, en haut, filtre la page par nom ou par description (dans toutes les langues, sans tenir compte de la casse ni des accents) ; `Esc` la vide. Chaque ligne a un interrupteur et une courte description ; les changements s’appliquent tout de suite, sans redémarrage, et sont mémorisés sur cet appareil. Le petit **?** après le nom d’une ligne ouvre la partie de ce README qui décrit cette fonctionnalité, dans le README de la langue de l’interface de dsh. Tout est activé par défaut, sauf **Connexion mobile**, **Reprendre après redémarrage** et **Compléter pendant la saisie**. L’hôte de dsh garde les interrupteurs de ces trois fonctionnalités, ainsi que ceux de **Recherche dans le contenu**, d’**Annulation de tour**, de **Prédiction du message suivant** et de **Vérification de l’objectif** : ils s’appliquent donc à toutes les fenêtres et restent valables après un redémarrage. L’hôte garde aussi le **Modèle** choisi pour **Prédiction du message suivant**, celui de **Compléter pendant la saisie** (par défaut **Comme la prédiction du message suivant**), celui d’**Améliorer le prompt**, celui de **Vérification de l’objectif** (tous deux par défaut **Comme le modèle de la discussion**) et la **Limite de temps** d’**Autoriser pour cette discussion** (1 heure par défaut). **Recherche dans le contenu** ne change qu’après un redémarrage de dsh (dsh lit ce réglage au démarrage) ; d’ici là, sa ligne indique **Redémarrez dsh pour appliquer ce changement.**
|
|
121
|
+
Chaque fonctionnalité peut être activée ou désactivée séparément : dsh **Réglages → Composer Plus**. Chaque ligne a une petite capture d’écran : survolez-la pour un aperçu plus grand, cliquez dessus pour l’ouvrir en taille réelle (`Esc` la ferme). La zone **Rechercher des fonctionnalités**, en haut, filtre la page par nom ou par description (dans toutes les langues, sans tenir compte de la casse ni des accents) ; `Esc` la vide. À côté, **Toutes**, **Activées** et **Désactivées** affichent toutes les fonctionnalités, seulement celles qui sont activées ou seulement celles qui sont désactivées (désactivez **Filtre activées/désactivées** pour les masquer). Chaque ligne a un interrupteur et une courte description ; les changements s’appliquent tout de suite, sans redémarrage, et sont mémorisés sur cet appareil. Le petit **?** après le nom d’une ligne ouvre la partie de ce README qui décrit cette fonctionnalité, dans le README de la langue de l’interface de dsh. Tout est activé par défaut, sauf **Connexion mobile**, **Reprendre après redémarrage** et **Compléter pendant la saisie**. L’hôte de dsh garde les interrupteurs de ces trois fonctionnalités, ainsi que ceux de **Recherche dans le contenu**, d’**Annulation de tour**, de **Prédiction du message suivant** et de **Vérification de l’objectif** : ils s’appliquent donc à toutes les fenêtres et restent valables après un redémarrage. L’hôte garde aussi le **Modèle** choisi pour **Prédiction du message suivant**, celui de **Compléter pendant la saisie** (par défaut **Comme la prédiction du message suivant**), celui d’**Améliorer le prompt**, celui de **Vérification de l’objectif** (tous deux par défaut **Comme le modèle de la discussion**) et la **Limite de temps** d’**Autoriser pour cette discussion** (1 heure par défaut). **Recherche dans le contenu** ne change qu’après un redémarrage de dsh (dsh lit ce réglage au démarrage) ; d’ici là, sa ligne indique **Redémarrez dsh pour appliquer ce changement.**
|
|
116
122
|
|
|
117
123
|
<p align="center"><img src="docs/images/settings.webp" width="720" alt="Réglages → Composer Plus : recherche de fonctionnalités, sélecteur de langue, ligne des mises à jour et un interrupteur par fonctionnalité, avec un aperçu de la capture d’écran au survol"></p>
|
|
118
124
|
|
|
@@ -172,6 +178,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
172
178
|
- **Recherche dans le contenu :** aucun nouveau code ne cherche dans vos discussions. Le plugin active seulement l’index des messages de dsh lui-même (SQLite FTS5, `dsh-session-query-sqlite`) et lui donne un fichier, `$DSH_HOME/cache/composer-plus/session-search.db` (fichier et dossier réservés au propriétaire). Ce fichier contient le texte de vos messages et de ceux de l’assistant : il est donc aussi privé que les journaux de discussion dans `$DSH_HOME/sessions`. Rien ne quitte votre machine. C’est une copie que dsh peut recréer : vous pouvez la supprimer quand dsh est fermé. L’interrupteur se trouve dans `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
|
|
173
179
|
- **Annulation de tour :** avant chacun de vos messages, l’hôte prend un instantané git du dossier de la discussion dans son propre stockage, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (dossier réservé au propriétaire). Ce stockage contient des copies des fichiers de ce dossier que git voit (pas les fichiers ignorés) : il est donc aussi privé que le projet. Il lit les objets de votre dépôt (sans copier ce que git a déjà) et n’écrit jamais l’index, `HEAD`, les branches, les tags, le stash ni la config de votre dépôt ; le seul changement que git y fait est une date plus récente sur les fichiers d’objets qu’il réutilise (cela retarde leur nettoyage par `git gc`). Une annulation avec fichiers n’écrit que des fichiers ordinaires dans le dossier de la discussion ; elle ignore les liens symboliques, les pipes et tout ce qui est hors du dossier. Rien ne quitte votre machine. Vous pouvez supprimer ce stockage quand dsh est fermé (l’annulation ne fonctionne alors que pour la discussion, jusqu’aux nouveaux messages). **Supprimer la discussion** supprime aussi le stockage d’une discussion. L’interrupteur se trouve dans `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Une annulation avec fichiers garde aussi les fichiers tels qu’ils étaient juste avant elle (`refs/r/…` dans le même stockage), pour **Refaire** ; les annulations refaites sont listées dans `$DSH_HOME/storages/dsh-composer-plus/redone.json` (réservé au propriétaire).
|
|
174
180
|
- **Ouvrir une issue GitHub** (Idées de fonctionnalités → liste **Plus tard**) : ne s’exécute que lorsque vous cliquez dessus. La partie hôte exécute votre propre GitHub CLI (`gh issue create`) dans le dossier de la discussion, avec le titre et le résumé enregistrés de l’idée (et pourquoi elle compte) ; `gh` utilise sa propre connexion et le dépôt distant GitHub du dossier, donc l’issue va dans ce dépôt avec votre compte, et GitHub la montre à tous ceux qui peuvent voir ce dépôt. dsh retire des commandes qu’il lance les variables dont le nom ressemble à un jeton ; si vous avez donné un jeton à `gh` avec `GH_TOKEN` ou `GITHUB_TOKEN`, le plugin ne transmet que celles-ci à `gh`. Le lien de l’issue est conservé avec l’idée dans `later.json`.
|
|
181
|
+
- **Signaler une issue** (Réglages → Composer Plus → **Signaler une issue…**, ou menu **…** d’une discussion → **Signaler une issue Composer Plus…**) : rien ne s’exécute tant que vous ne cliquez pas. **Rédiger le brouillon** envoie seulement le type et le texte que vous avez tapé (pas la discussion, pas le projet) au modèle par défaut de dsh, en une seule requête. La partie hôte ajoute une ligne avec les versions de Composer Plus, de dsh et du système d’exploitation, et remplace le chemin de votre dossier personnel par `~`. **Ouvrir l’issue** exécute votre propre GitHub CLI (`gh issue create --repo furkancak1r/dsh-composer-plus`) avec votre connexion `gh` : l’issue est donc publique et affiche votre compte GitHub. Un texte qui ressemble à une clé, à un jeton ou à un mot de passe est refusé et ne quitte pas votre Mac.
|
|
175
182
|
- **Discussions qui ont modifié ce fichier** (Modifications, menu « … » d’un fichier) : la partie hôte lit les journaux des discussions dont le dossier se trouve dans le même dépôt, tels que dsh les conserve, et renvoie le titre de chaque discussion, l’heure et la première ligne de la demande ; elle n’ouvre jamais le fichier lui-même.
|
|
176
183
|
- **Branche Git sur les lignes de discussion :** la partie hôte exécute `git branch --show-current` (en lecture seule) dans le dossier de la discussion au début et à la fin de chaque tour, et ne conserve que l’identifiant de la discussion, le nom de la branche et l’heure dans `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` (fichier réservé au propriétaire, les 2000 discussions les plus récentes). L’interrupteur se trouve dans `branches.json`, à côté.
|
|
177
184
|
- **Rechercher dans la discussion** ne s’exécute que dans la page : la fonctionnalité lit le texte que la page affiche et n’envoie rien.
|
|
@@ -180,9 +187,10 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
180
187
|
- **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.
|
|
181
188
|
- La revue automatique s’exécute toujours à chaque appel ; les échecs de revue ne sont jamais autorisés automatiquement.
|
|
182
189
|
- **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).
|
|
190
|
+
- **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). La page de l’autre Mac dans cette fenêtre peut lire les noms et les états des ordinateurs de ce Mac (pas leur adresse ni leur jeton) et peut faire passer cette fenêtre de l’un à l’autre. Elle ne peut pas ajouter, renommer ni supprimer un ordinateur, ni modifier les réglages de ce Mac.
|
|
184
191
|
- **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
|
-
- **
|
|
192
|
+
- **Pack de skill turc :** activé par défaut, et il ne fonctionne que si la langue de l’application est Türkçe : le navigateur indique à la partie hôte la langue de l’interface de dsh. Ensuite, au plus une fois par jour, la partie hôte demande à `api.github.com` le dernier commit de `yucezerey/turkish-anti-ai-skill` et sa liste de fichiers, puis télécharge depuis `raw.githubusercontent.com` les fichiers Markdown qui ont changé. GitHub voit votre adresse IP, comme à chaque recherche de mises à jour ; rien sur vous ni sur vos discussions n’est envoyé. Seuls les fichiers `.md` ordinaires du dossier `skills/turkish-anti-ai-skill/` sont gardés (au plus 20 fichiers et 1 Mo), et chaque fichier doit correspondre à son identifiant dans la liste de fichiers de GitHub. La copie est dans `$DSH_HOME/cache/composer-plus/turkish-skill/<commit>` (accès réservé au propriétaire) et entre dans la liste des skills de dsh ; aucun script du pack ne s’exécute. L’interrupteur et la dernière langue signalée sont dans `$DSH_HOME/storages/dsh-composer-plus/turkish-skill.json`. Le désactiver retire le skill et supprime la copie.
|
|
193
|
+
- **Comptage d’utilisation :** la partie hôte demande à GitHub deux petits fichiers de la version publiée installée (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/<file>`) : `active.txt` une fois par jour, et `installed.txt` une seule fois pour chaque dossier personnel de dsh. GitHub compte ces requêtes par fichier : l’auteur voit donc seulement combien de copies de chaque version ont demandé `active.txt` ce jour-là, et combien de copies ont demandé `installed.txt` au total (le nombre de copies). 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 de `active.txt` est gardé dans `$DSH_HOME/storages/dsh-composer-plus/active.json`, et la marque indiquant que `installed.txt` a été compté, dans `$DSH_HOME/storages/dsh-composer-plus/installed.json`. Une copie git de ce dépôt et une copie renommée n’envoient rien. Aucun interrupteur ne le désactive.
|
|
186
194
|
- **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).
|
|
187
195
|
- **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).
|
|
188
196
|
- **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).
|
|
@@ -212,10 +220,11 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
212
220
|
- **Une discussion n’a pas repris après un redémarrage :** Reprendre après redémarrage était désactivée quand dsh s’est fermé, vous avez arrêté ce tour vous-même, le tour était fini (terminé ou en échec), la discussion était archivée, ou plus de 20 discussions étaient en cours (les 20 plus récentes reprennent).
|
|
213
221
|
- **La file d’attente est vide après un redémarrage :** dsh vide lui-même la file d’attente quand il se ferme. Reprendre après redémarrage ne la remet que dans une discussion qu’il reprend ; dans les autres, renvoyez les messages. Un message supprimé juste avant la fermeture peut revenir : supprimez-le de nouveau.
|
|
214
222
|
- **Ouvrir une issue GitHub indique « gh could not open the issue » :** le message est la première ligne de `gh` lui-même. Exécutez `gh auth status` dans un terminal et connectez-vous avec `gh auth login` ; le dossier de la discussion doit avoir un dépôt distant GitHub (`git remote -v`). « not installed or not on the PATH of dsh » signifie que dsh n’a pas trouvé `gh` : installez-le, ou démarrez dsh depuis un terminal où `gh` fonctionne.
|
|
223
|
+
- **Signaler une issue indique « gh could not open the issue » :** le message est la première ligne de `gh` lui-même. Exécutez `gh auth status` dans un terminal et connectez-vous avec `gh auth login`. Ou cliquez sur **Ouvrir plutôt sur GitHub** : la page de nouvelle issue de GitHub lui-même s’ouvre avec le brouillon déjà rempli, et vous l’envoyez depuis cette page.
|
|
215
224
|
- **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).
|
|
216
225
|
- **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.
|
|
217
226
|
- **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é).
|
|
218
|
-
- **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.
|
|
227
|
+
- **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.23.0`) ; voir la note d’installation plus haut.
|
|
219
228
|
- **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.
|
|
220
229
|
- **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.
|
|
221
230
|
- **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.
|
|
@@ -237,9 +246,11 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
237
246
|
- 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.
|
|
238
247
|
- **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
248
|
- Une version installée pendant que dsh tourne (une mise à jour par Réglages → Plugins ou par un dossier copié) ne se charge qu’après un redémarrage de dsh : jusque-là, **Mises à jour de Composer Plus** affiche la version en cours et demande un redémarrage. Sa fenêtre **Nouveautés de Composer Plus N** s’affiche une fois au premier démarrage de cette version. Le premier démarrage après l’installation de ce plugin n’affiche aucune fenêtre ; **Nouveautés de cette version** ouvre les notes de la version en cours.
|
|
249
|
+
- La ligne de l’étoile GitHub sous les notes ne peut pas savoir si vous avez déjà mis une étoile au dépôt : le plugin ne fait aucun appel réseau pour cela. Chaque navigateur (et l’app de bureau) garde son propre enregistrement, donc la ligne peut s’afficher une fois de plus dans un autre.
|
|
240
250
|
- **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.
|
|
241
251
|
- **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.
|
|
242
252
|
- **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.
|
|
253
|
+
- **Citer depuis l’aperçu du fichier** lit l’aperçu de fichier de dsh lui-même : les numéros de ligne viennent de ses lignes, donc ils sont justes pour les fichiers de code et de texte. Un fichier Markdown s’affiche comme une page mise en forme, donc sa citation contient le texte sans ses marques Markdown et sans numéros de ligne ; une citation de PDF contient la page, pas une ligne. Une sélection dans l’en-tête du chemin, dans une autre visionneuse (une feuille de calcul, un fichier Office, une image) ou sur deux fichiers ouverts n’affiche pas le bouton, pas plus que la barre latérale droite en plein écran (le champ de saisie n’est alors pas à l’écran). Le bouton trouve l’aperçu par la structure de la page de dsh, car dsh n’a pas de slot pour une sélection à cet endroit ; si une mise à jour de dsh change cette structure, le bouton ne s’affiche pas. Seul le texte sélectionné va dans le champ de saisie : si le fichier change ensuite, la citation ne change pas.
|
|
243
254
|
- **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.
|
|
244
255
|
- **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 `…`).
|
|
245
256
|
- **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.
|
|
@@ -247,7 +258,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
247
258
|
- **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.
|
|
248
259
|
- **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.
|
|
249
260
|
- **Connexion mobile** ne fonctionne que sur macOS (elle utilise `en0`, `openssl`, `swift` et `dns-sd`). Elle utilise les ports fixes 19390 et 19391 : un seul dsh par Mac peut donc l’exécuter à la fois (chaque Mac est une entrée dans la liste des Mac du téléphone). Avec une clé APNs dans `apns.json` (voir `tether/README.md`), le Mac envoie les notifications par le service push d'Apple : elles arrivent aussi quand Tether est fermé ; le Mac doit être éveillé avec dsh ouvert. Sans la clé, le téléphone ne les reçoit que lorsque Tether est ouvert ou vient de passer en arrière-plan. Tether ne les envoie qu’après que vous avez activé « Settings → Notifications → Send notifications » dans Tether. Tether garde cette option et sa plage horaire séparément pour chaque Mac appairé. Elle est désactivée par défaut sur chaque Mac, et iOS demande l’autorisation quand vous l’activez. L’app iOS n’est pas encore sur l’App Store : compilez-la depuis `tether/ios` avec Xcode. « Tailscale only » demande quand même une adresse Wi-Fi ou Ethernet sur le Mac (la passerelle ne démarre qu’avec une telle adresse). Le journal d’accès est propre à chaque Mac et ne garde que les 200 tentatives les plus récentes ; une tentative répétée en moins d’une minute augmente de un le compteur de la même ligne. Chaque notification indique le Mac et le projet du chat (`Studio Mac · recipe-box`), le titre du chat et le texte : Turn finished affiche la dernière réponse de l’agent. Avec la clé APNs, ce texte passe par le service push d’Apple. Le verrouillage de Tether ne masque pas les aperçus des notifications sur l’écran verrouillé de l’iPhone : désactivez-les dans les Réglages d’iOS. Les points verts de Tether suivent le Mac : une conversation que vous ouvrez dans dsh perd aussi son point sur le téléphone. Une conversation que vous ouvrez dans Tether perd son point seulement sur les téléphones. Le point de dsh sur le Mac reste jusqu’à ce que vous ouvriez la conversation sur le Mac.
|
|
250
|
-
- **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.
|
|
261
|
+
- **Ordinateurs distants** a besoin de Tailscale sur les deux Mac, et de Composer Plus avec cette fonction activée sur le Mac que vous ouvrez. Ce Mac doit être éveillé, avec dsh en cours d’exécution. Le sélecteur n’apparaît que si la barre latérale gauche est ouverte (pas quand elle n’affiche que des icônes). La page de l’autre Mac n’affiche le sélecteur que si ce Mac a cette version de Composer Plus ou une version plus récente. Avec une version plus ancienne, un bouton **Revenir à ce Mac** apparaît en haut après quelques secondes. Chaque ordinateur que vous avez ouvert garde sa page en mémoire jusqu’à ce que vous désactiviez la fonction ou redémarriez dsh. Dans l’app de bureau, la page de l’autre Mac est une page intégrée : les raccourcis clavier de dsh (par exemple une nouvelle discussion) n’y fonctionnent pas, et les téléchargements de fichiers, le microphone et les notifications n’y fonctionnent pas non plus. La fonction utilise le port 19392 (un seul dsh par Mac peut laisser entrer d’autres ordinateurs). Depuis la page d’un autre Mac, le sélecteur ne propose que les ordinateurs de ce Mac : vous ne pouvez pas ouvrir un troisième Mac à travers l’autre Mac.
|
|
251
262
|
- 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.
|
|
252
263
|
- **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.
|
|
253
264
|
- **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).
|
|
@@ -255,6 +266,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
255
266
|
- La carte des branches de la vue **Arbre** devine où va chaque flèche, car git n’enregistre pas la branche dans laquelle une branche est fusionnée. Une branche fusionnée pointe vers la branche dont le commit de fusion l’a intégrée en premier. Une branche en attente pointe vers la branche la plus proche dont elle est partie (la branche principale d’abord) ; quand deux branches sont parties du même commit, la carte peut choisir la mauvaise. Une branche qui a avancé par fast-forward n’a pas de commit de fusion, donc son libellé **Fusionnée** n’ouvre rien. La branche principale est la branche par défaut de `origin`, sinon `main` ou `master`, sinon la branche ouverte. La carte lit les 20 000 commits les plus récents et affiche au plus 60 branches ; dans un historique plus long, elle signale que certaines flèches peuvent être fausses. Une branche fusionnée par squash ou rebase (par exemple sur GitHub) apparaît comme **En attente** : git ne garde aucun lien avec ses commits.
|
|
256
267
|
- **Cette discussion** ne compte que les fichiers écrits par les outils de fichiers de dsh (`write`, `edit`, `str_replace_editor`). Les fichiers modifiés par une commande (`bash`) ne sont pas dans cette vue ; ils apparaissent sous **Non validées**. Sans instantané de l’Annulation de tour pour la discussion (Annulation de tour désactivée, dsh-rewind-plugin installé, ou discussion plus ancienne que le plugin), la vue compare avec le dernier commit et l’indique. L’Annulation de tour garde les 50 instantanés les plus récents d’une discussion : dans une discussion plus longue, la vue compare avec le plus ancien gardé, indique à partir de quel message et ne compte pas les modifications antérieures. **Masquer les modifications d’espaces** correspond à `git diff -w` : une ligne qui n’a changé que par des espaces à l’intérieur est aussi masquée.
|
|
257
268
|
- **Ouvrir une issue GitHub** a besoin de GitHub CLI (`gh`) dans le PATH de dsh et d’un dépôt distant GitHub dans le dossier de la discussion. L’action dure au plus 60 s ; si `gh` met plus longtemps, l’issue peut exister sur GitHub sans son lien dans la liste (avant de cliquer à nouveau, regardez sur GitHub : la liste ne lit le lien que d’une exécution terminée, donc un nouveau clic peut ouvrir une deuxième issue). Un dossier avec plus d’un dépôt distant GitHub utilise la valeur par défaut de `gh` lui-même (`gh repo set-default`).
|
|
269
|
+
- **Signaler une issue** n’ouvre des issues que dans le dépôt de Composer Plus (`furkancak1r/dsh-composer-plus`), pas dans votre projet (pour cela, utilisez **Ouvrir une issue GitHub** dans la liste **Plus tard** des Idées de fonctionnalités). Il faut un modèle par défaut dans dsh pour le brouillon, et GitHub CLI (`gh`) avec une connexion pour ouvrir l’issue. Le brouillon est toujours en anglais. Le modèle peut se tromper sur un détail : lisez le brouillon avant de cliquer sur **Ouvrir l’issue**. L’ouverture dure au plus 60 s ; si le même titre et le même texte reviennent dans l’heure, l’issue précédente s’affiche au lieu d’une copie. **Ouvrir plutôt sur GitHub** coupe une description très longue pour garder le lien court.
|
|
258
270
|
- **Discussions qui ont modifié ce fichier** ne connaît que les outils de fichiers de dsh (`write`, `edit`, `str_replace_editor`), comme **Cette discussion** : une modification faite par une commande (`bash`) n’est pas listée. La liste lit les 300 discussions les plus récentes du dépôt (selon leur date de création) et le signale quand il y en a plus ; elle affiche au plus 100 lignes. Un fichier renommé est listé sous le nom que l’outil a écrit. Une discussion dont le dossier est hors du dépôt (y compris par un autre chemin vers les mêmes fichiers) n’est pas comptée. La première ouverture après le démarrage de dsh lit tous les journaux de discussion du dépôt (environ 4 s pour 275 discussions) ; les ouvertures suivantes ne lisent que les discussions modifiées depuis.
|
|
259
271
|
- **Branche Git sur les lignes de discussion** affiche la branche du dossier de la discussion au début ou à la fin de son dernier tour, pas la branche actuelle : un changement de branche hors d’un tour s’affiche après le tour suivant. Les discussions antérieures à cette version n’affichent pas de pastille avant leur prochain tour. La pastille se place dans le balisage des lignes de discussion de dsh (dsh n’a pas d’emplacement prévu à cet endroit) ; si une mise à jour de dsh change ce balisage, aucune pastille ne s’affiche. La pastille ne s’affiche que dans « Dans une seule liste ».
|
|
260
272
|
- **Une branche par discussion** en mode plan : dsh envoie `/plan <message>` comme une commande, pas comme un message, donc Composer Plus intercepte l’envoi de la commande dans la zone de saisie de dsh (pas une API publique). Si une mise à jour de dsh change cela, `/plan <message>` avec **Nouvelle branche** choisie s’exécute dans la Nouvelle discussion ouverte comme commande propre à dsh. Quand l’hôte ne peut pas activer le mode plan dans la nouvelle discussion, le dossier de la branche reste et le message n’est pas envoyé : la nouvelle discussion ne modifie donc pas de fichiers dans le mode par défaut.
|
|
@@ -279,6 +291,8 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
279
291
|
- **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.
|
|
280
292
|
- **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.
|
|
281
293
|
- **É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.
|
|
294
|
+
- **Pack de skill turc** installe un skill tiers : ses règles viennent du dépôt GitHub de son auteur, pas de Composer Plus, et une nouvelle version sert dès la vérification quotidienne suivante, sans relecture de notre part. La vérification prouve que les fichiers sont ceux que GitHub liste pour ce commit, pas que les règles sont bonnes. Le modèle décide quand charger le skill (vous pouvez aussi l’appeler par son nom) ; les règles ne s’appliquent qu’aux textes turcs. La partie hôte utilise la langue qu’un navigateur a signalée en dernier : si deux navigateurs utilisent des langues différentes, la plus récente l’emporte. GitHub autorise 60 appels d’API par heure sans connexion ; une vérification refusée garde la copie installée et affiche la raison dans les réglages.
|
|
295
|
+
- **Démêler le code** contient une copie fixe de la compétence (caldoai/skills, commit f3cf477) : une modification de l’original n’arrive qu’avec une nouvelle version de Composer Plus. La compétence exécute un long objectif qui peut modifier de nombreux fichiers, et ses sous-agents et vérifications consomment beaucoup de jetons. Là où le projet n’a pas de tests, elle peut changer le comportement sans prévenir : lancez-la sur une branche et lisez le diff avant de fusionner. Une compétence du même nom dans le projet, dans un dossier de compétences personnalisé ou dans `~/.dsh/skills` la remplace. Tant que l’interrupteur est désactivé, `/untangle-codebase` part au modèle comme simple texte.
|
|
282
296
|
- **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**.
|
|
283
297
|
- **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.
|
|
284
298
|
- **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.
|
|
@@ -293,6 +307,8 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
293
307
|
- **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.
|
|
294
308
|
- **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.
|
|
295
309
|
- **Sauvegarde automatique** ne tourne que pendant que dsh tourne : une sauvegarde prévue pendant que dsh était fermé s’exécute environ 45 s après le démarrage suivant. L’instantané d’une nouvelle version est pris après ce démarrage, pas avant la mise à jour.
|
|
310
|
+
- **Mémoriser la taille de la fenêtre** ne fonctionne que dans l’application de bureau. À chaque démarrage, dsh affiche d’abord sa fenêtre en 1280 × 820 ; la fenêtre prend la taille enregistrée quand le plugin se charge. Une page n’a pas d’événement pour le déplacement de la fenêtre, donc le plugin lit la fenêtre une fois par seconde : un changement dans les 2 dernières secondes avant la fermeture de dsh n’est pas enregistré. La taille est gardée par ordinateur, dans le stockage propre de l’application.
|
|
311
|
+
- **Comptage d’utilisation :** il compte des copies, pas des personnes : chaque dossier personnel de dsh est une copie. Le comptage des copies uniques (`installed.txt`) ne compte que les copies qui passent à la première version qui a ce fichier ou à une version plus récente ; une copie qui reste sur une version plus ancienne n’est pas comptée. Une copie dont le dossier `storages` est supprimé est comptée de nouveau. GitHub peut compter comme une seule les requêtes venues de la même adresse IP (par exemple plusieurs ordinateurs derrière un même routeur NAT) en 10 minutes environ.
|
|
296
312
|
- Une prise en charge intégrée est demandée en amont : `move` pour la file dans [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), un état Continuer dans [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
|
|
297
313
|
|
|
298
314
|
## FAQ
|
|
@@ -363,6 +379,8 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
363
379
|
|
|
364
380
|
**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.
|
|
365
381
|
|
|
382
|
+
**Comment montrer à l’agent les lignes exactes d’un fichier ?** Ouvrez le fichier dans la barre latérale droite (**Fichiers de l’espace de travail**), sélectionnez les lignes et cliquez sur **Citer** au-dessus de la sélection (**Citer depuis l’aperçu du fichier**, activée par défaut). Le champ de saisie reçoit le chemin et les numéros de ligne (par exemple `src/login.js:2-3`) et les lignes en bloc de code ; écrivez votre question en dessous.
|
|
383
|
+
|
|
366
384
|
**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.
|
|
367
385
|
|
|
368
386
|
**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.
|
|
@@ -371,7 +389,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
371
389
|
|
|
372
390
|
**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.
|
|
373
391
|
|
|
374
|
-
**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…**
|
|
392
|
+
**Comment poursuivre une discussion de mon autre Mac depuis celui-ci ?** Sur l’autre Mac, activez **Réglages → Composer Plus → Ordinateurs distants** et **Autoriser d’autres ordinateurs à ouvrir ce Mac**, cliquez sur **Créer un lien d’appairage** et copiez le lien (envoyez-le-vous, par exemple avec AirDrop ou Notes). Sur ce Mac, activez aussi **Ordinateurs distants**, choisissez **Ajouter un ordinateur…** dans le sélecteur de la barre latérale gauche (à droite du nom de la marque, au-dessus de **Nouvelle session**), collez le lien, saisissez un **Nom** et cliquez sur **Connecter**. Cliquez ensuite sur **Approuver** sur l’autre Mac. Par la suite, choisissez cet ordinateur dans le même menu : il remplit cette fenêtre. Choisissez **Ce Mac** au même endroit pour revenir. Pendant ce temps, les discussions de ce Mac continuent de tourner.
|
|
375
393
|
|
|
376
394
|
**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.
|
|
377
395
|
|
|
@@ -403,6 +421,12 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
403
421
|
|
|
404
422
|
**dsh peut-il lancer la commande suivante sans redemander au modèle ?** Oui, avec **Étapes planifiées** (désactivée par défaut) : activez-la dans Réglages → Composer Plus. Le modèle peut alors planifier ses prochaines commandes avec une condition, par exemple « lance les tests quand la compilation réussit », et Composer Plus exécute une étape sans nouvel appel au modèle quand le résultat remplit la condition. Les approbations et le sandbox ne changent pas.
|
|
405
423
|
|
|
424
|
+
**D’où vient le skill turc, et puis-je le retirer ?** De [yucezerey/turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) sur GitHub (MIT). Composer Plus ne l’installe que si **Langue de l’application** est Türkçe, ne garde que ses fichiers Markdown et n’exécute aucun de ses scripts. Pour le retirer, désactivez **Pack de skill turc** dans Réglages → Composer Plus : le skill et la copie téléchargée sont supprimés aussitôt.
|
|
425
|
+
|
|
426
|
+
**Comment signaler un bug ou demander une fonctionnalité dans Composer Plus ?** Réglages → Composer Plus → **Signaler une issue…** (ou menu **…** d’une discussion → **Signaler une issue Composer Plus…**). Choisissez un type, décrivez-le dans votre propre langue et cliquez sur **Rédiger le brouillon**. Vérifiez le brouillon en anglais, puis cliquez sur **Ouvrir l’issue**.
|
|
427
|
+
|
|
428
|
+
**Comment l’agent peut-il remettre de l’ordre dans un code désordonné ?** Tapez `/untangle-codebase` dans une discussion (**Démêler le code**, activée par défaut), si vous voulez avec une partie, par exemple `/untangle-codebase src/api`. L’agent liste d’abord les copies, les liens cachés, les enveloppes inutiles, le code mort et les cas particuliers, puis les corrige sous forme d’objectif et vérifie de nouveau avec des sous-agents. Lancez-la dans une discussion de **Une branche par discussion** pour que le travail reste sur sa propre branche.
|
|
429
|
+
|
|
406
430
|
**Est-ce que cela fonctionne avec l’app de bureau ?** Oui : Réglages → Plugins → **Ajouter un plugin** → `dsh-composer-plus`. Testé sur dsh 0.2.0-rc.2 (bureau et web) et 0.2.1-rc.2 (web).
|
|
407
431
|
|
|
408
432
|
## Développement
|
|
@@ -422,6 +446,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/t
|
|
|
422
446
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
|
|
423
447
|
# Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
|
|
424
448
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
|
|
449
|
+
# Quote from file preview (fake model): lines of a code, text, Markdown and PDF file in the right sidebar → Quote → the path, the line numbers and the lines in the sent message; no button for the path header; switch off + its thumbnail
|
|
450
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-preview-quote.mjs /path/to/dsh/lib/bin.js
|
|
425
451
|
# every Settings feature row shows a loading screenshot and a ? link to its README row
|
|
426
452
|
PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
|
|
427
453
|
# What's new after an update: the release notes show once (also after an install through another path), Esc and Close close them; Settings → What’s new in this version opens them again
|
|
@@ -494,3 +520,5 @@ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/b
|
|
|
494
520
|
## License
|
|
495
521
|
|
|
496
522
|
MIT
|
|
523
|
+
|
|
524
|
+
`assets/skills/untangle-codebase/SKILL.md` est la compétence `untangle-codebase` de [caldoai/skills](https://github.com/caldoai/skills), © 2026 Maze, sous licence MIT ([sa licence](assets/skills/untangle-codebase/LICENSE)).
|