dsh-composer-plus 1.11.3 → 1.13.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.fr.md CHANGED
@@ -14,7 +14,7 @@ Des fonctions pratiques dans le style de Codex pour l’interface de bureau et w
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness avec Composer Plus : le projet en cours affiche un indicateur de chargement dans la barre latérale et le panneau des modifications affiche un diff git"></p>
16
16
 
17
- Plugin communautaire non officiel. Les seuls appels réseau servent à la recherche de mises à jour (versions GitHub et registre npm) ; désactivez **Mises à jour automatiques** pour les arrêter au démarrage. **Idées de fonctionnalités** n’appelle le modèle de votre discussion que lorsque vous cliquez sur **Suggérer des fonctionnalités**. **Prédiction du message suivant** (activée par défaut) appelle le modèle choisi dans les Réglages (celui par défaut de dsh, sauf si vous en choisissez un autre) une fois après chaque tour terminé, sans clic. Désactivez-la dans **Réglages → Composer Plus** pour arrêter ces appels. **Compléter pendant la saisie** (désactivé par défaut) appelle le modèle choisi pour cette fonctionnalité (par défaut, celui de la prédiction) à chaque pause pendant la saisie, une fois que vous l’avez activé. **Connexion mobile** (désactivée par défaut) accepte les connexions d’iPhone depuis votre réseau local ou votre tailnet, et seulement après que vous l’avez activée.
17
+ Plugin communautaire non officiel. Les seuls appels réseau servent à la recherche de mises à jour (versions GitHub et registre npm) ; désactivez **Mises à jour automatiques** pour les arrêter au démarrage. **Idées de fonctionnalités** n’appelle le modèle de votre discussion que lorsque vous cliquez sur **Suggérer des fonctionnalités**. **Prédiction du message suivant** (activée par défaut) appelle le modèle choisi dans les Réglages (celui par défaut de dsh, sauf si vous en choisissez un autre) une fois après chaque tour terminé, sans clic. Désactivez-la dans **Réglages → Composer Plus** pour arrêter ces appels. **Compléter pendant la saisie** (désactivé par défaut) appelle le modèle choisi pour cette fonctionnalité (par défaut, celui de la prédiction) à chaque pause pendant la saisie, une fois que vous l’avez activé. **Améliorer le prompt** n’appelle un modèle que lorsque vous cliquez sur sa baguette magique. **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,46 +29,54 @@ 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.11.3`.
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.13.0`.
33
33
 
34
34
  ## Fonctionnalités
35
35
 
36
+ <!-- BEGIN GENERATED FEATURES: edit docs/features.json, then run npm run build:readme -->
37
+
36
38
  | Fonctionnalité | Utilisation | Capture d’écran |
37
39
  |---|---|---|
38
- | **Panneau des modifications** | Barre latérale droite → `+` → **Modifications**. Choisissez **Non validées**, **Non indexées**, **Indexées** ou **Branche** pour voir les fichiers modifiés avec leurs compteurs `+/-` ; cliquez sur un fichier pour voir son diff. **Dernier tour** ouvre la revue du dernier tour proposée par dsh lui-même. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Capture d’écran : Panneau des modifications"></a> |
39
- | **Idées de fonctionnalités** | Barre latérale droite → `+` → **Idées de fonctionnalités** → **Suggérer des fonctionnalités**. Le modèle de la discussion lit un court résumé du projet de la discussion (fichiers de premier niveau, début du README et du manifeste, 15 derniers commits) et suggère jusqu’à 8 fonctionnalités. Elles s’affichent sous forme de pile de cartes, dans la langue de l’interface de dsh. Balayez une carte vers la droite (ou cliquez sur **✓**, ou appuyez sur `→` ; dans chaque cas, la carte s’envole de son côté) pour lancer une nouvelle discussion dans le même projet : elle démarre en mode plan avec l’idée comme demande, donc rien ne change avant que vous approuviez le plan. Pour passer le plan, cliquez sur **▶ Créer maintenant** (ou appuyez sur `↑` ; la carte s’envole vers le haut) : la nouvelle discussion démarre tout de suite avec l’idée comme demande ordinaire, et le modèle fait la modification puis lance ses vérifications (les approbations s’appliquent comme d’habitude). Balayez vers la gauche (ou **✕**, ou `←`) pour ignorer la carte ; **Annuler** (ou `Z`) ramène une carte ignorée. Cliquez sur **↓** (ou appuyez sur `↓`) pour garder une bonne idée pour plus tard : elle va dans la liste **Plus tard** du projet, que chaque discussion du même dossier de projet affiche (même après un redémarrage). **Plus tard (N)** ouvre la liste ; **Planifier** lance la même discussion en mode plan pour l’idée et **Créer maintenant** la discussion sans plan, et les deux la retirent de la liste ; **Tout planifier (N)** lance une seule discussion en mode plan pour toutes les idées de la liste, donc les parties communes ne sont planifiées qu’une fois ; **Retirer de la liste** la supprime. **Copier en liste de tâches** copie toute la liste dans le presse-papiers sous forme de liste de tâches Markdown (`- [ ] Title — Summary`, une ligne par idée) pour un outil de suivi des tickets ou un fichier TODO ; aucun appel réseau n’est fait. **Plus d’idées** ajoute des cartes. Pour obtenir des idées sur un seul domaine, tapez un court **Thème ciblé** dans le champ à côté de **Suggérer des fonctionnalités** (80 caractères au plus ; `Enter` lance aussi la suggestion), ou cliquez sur un des thèmes fixes en dessous : **Performances**, **Accessibilité**, **Tests**, **Sécurité**, **Utilisabilité** ou **Documentation** (cliquez de nouveau pour l’effacer). Le modèle suggère alors seulement des fonctionnalités sur ce thème ; un champ vide signifie n’importe quelle fonctionnalité. Une idée n’est pas suggérée deux fois dans un projet : chaque idée suggérée (ignorée, gardée ou lancée) va dans l’**Historique** du projet, le modèle reçoit la consigne de ne plus les suggérer et un titre répété est écarté. **Historique** les liste avec **Lancée** ou **Proposée** ; **Oublier** (ou **Tout oublier**) permet à une idée de revenir ; une idée encore dans la liste **Plus tard** reste hors des suggestions tant que vous ne l’en retirez pas. Le modèle ne s’exécute que lorsque vous cliquez. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Capture d’écran : Idées de fonctionnalités"></a> |
40
- | **Recherche dans le contenu** | La recherche de la barre latérale de dsh (la loupe à côté d’**Espaces de travail** ; `Cmd+K` dans l’app de bureau, `Cmd+Alt+K` dans un navigateur) trouve aussi les discussions par les mots de vos messages et des réponses, et pas seulement par leur titre. Elle affiche le texte correspondant sous la discussion. dsh a déjà cette recherche, mais la livre désactivée ; cette fonctionnalité l’active avec un fichier d’index de recherche sur votre ordinateur. L’index est créé à la première recherche après un démarrage (environ 15 s pour 250 discussions, voir Limites) et il est conservé pour les démarrages suivants. Activée par défaut ; un changement s’applique après le redémarrage de dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Capture d’écran : Recherche dans le contenu"></a> |
41
- | **Annulation de tour** | Survolez un de vos messages et cliquez sur **↶** (à côté de Copier). **Discussion uniquement** retire ce message et tout ce qui suit (réponses, appels d’outils) de la discussion et du contexte du modèle, puis remet le message dans la zone de saisie : modifiez-le et envoyez-le à nouveau. **Discussion et fichiers** liste d’abord les fichiers du projet qui ont changé depuis ce message, puis les remet aussi dans l’état où ils étaient, y compris les modifications faites par des commandes (`bash`), et pas seulement par les outils d’édition de dsh. Un tour en cours s’arrête d’abord. Le journal de la discussion n’est jamais réécrit : un seul marqueur caché masque la partie retirée, de la même façon que la commande `/compact` de dsh masque les anciens messages. Si [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) est installé, c’est lui qui fait ce travail et Composer Plus n’affiche pas de second bouton. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Capture d’écran : Annulation de tour"></a> |
42
- | **Supprimer la discussion** | Barre latérale → menu **…** d’une discussion (ou clic droit) → **Supprimer…** → **Supprimer**. dsh seul ne peut qu’archiver. La discussion s’arrête (son tour, ses tâches en arrière-plan, ses sous-agents et ses rappels planifiés, comme avec l’archivage de dsh) et son historique enregistré, avec les discussions de ses sous-agents, est déplacé dans la Corbeille de macOS (sur les autres systèmes : `$DSH_HOME/trash`). Pour la récupérer, remettez le dossier à sa place et redémarrez dsh : elle apparaît dans la vue **Archivées uniquement** de la barre latérale. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Capture d’écran : Supprimer la discussion"></a> |
43
- | **Nom du projet dans la zone de saisie** | La ligne sous la zone de saisie (tours, jetons, succès de cache, contexte) commence par le nom du projet de la discussion : vous voyez donc toujours dans quel projet travaille une discussion. C’est le titre du projet dans dsh, ou le nom du dossier si le projet n’a pas de titre. Survolez-le pour voir le chemin complet du dossier. Cliquez dessus pour retrouver la discussion dans la barre latérale, en vue liste ou par projet : la barre latérale et le projet s’ouvrent (y compris un projet replié et son **Afficher plus**), la liste défile jusqu’à la discussion et la discussion clignote pendant 5 secondes. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Capture d’écran : Nom du projet dans la zone de saisie"></a> |
44
- | **Historique de saisie** | Dans une zone de saisie vide, appuyez sur `↑` / `↓` pour parcourir les messages envoyés, comme dans un terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Capture d’écran : Historique de saisie"></a> |
45
- | **Raccourci du mode plan** | `Shift+Tab` ajoute `/plan ` au début du brouillon (appuyez de nouveau pour le retirer). Si la discussion est déjà en mode plan, `Shift+Tab` quitte ce mode. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Capture d’écran : Raccourci du mode plan"></a> |
46
- | **Garder le focus dans la zone de saisie** | 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> |
47
- | **Continuer en un clic** | 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> |
48
- | **Reprendre après redémarrage** | 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> |
49
- | **Glisser-déposer dans la file** | 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> |
50
- | **Copier le lien de session** | Clic droit sur une discussion dans la barre latérale → **Copier le lien de session**. Collez le lien `dsh-session:…` dans une autre discussion pour y joindre cette discussion comme contexte en lecture seule. dsh 0.2.1 a son propre **Copier l’ID de session**, qui ne copie que l’identifiant brut ; cet élément vient juste après. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Capture d’écran : Copier le lien de session"></a> |
51
- | **Exporter la discussion en Markdown** | Clic droit sur une discussion dans la barre latérale (ou ouvrez son menu **…**) → **Exporter en Markdown…**. Une boîte de dialogue indique combien de messages la discussion contient ; **Copier dans le presse-papiers** copie la discussion en Markdown, **Enregistrer le fichier .md** l’enregistre sous `<chat title>.md` via le téléchargement du navigateur (dsh de bureau : dans votre dossier Téléchargements ou via une boîte de dialogue d’enregistrement, selon les réglages de votre système). Le fichier contient le titre de la discussion, le nom du projet et la date, puis une section `## Vous` ou `## Assistant` par message. Les blocs de code restent tels quels ; un bloc de code qu’un message laisse ouvert est fermé. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Capture d’écran : Exporter la discussion en Markdown"></a> |
52
- | **Copier le chemin du projet** | Clic droit sur un projet dans la barre latérale → **Copier le chemin** copie le chemin complet de son dossier. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Capture d’écran : Copier le chemin du projet"></a> |
53
- | **Recherche de projet dans une nouvelle discussion** | Nouvelle discussion → le bouton de projet au-dessus de la zone de saisie. Les projets s’affichent dans l’ordre A–Z, avec un champ **Rechercher des projets** en haut. Tapez une partie d’un nom (sans tenir compte de la casse ni des accents) et appuyez sur `Enter` pour choisir le premier résultat. Si rien ne correspond, **Aucun projet ne correspond** s’affiche. L’ordre des projets enregistré par dsh dans la barre latérale ne change pas. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Capture d’écran : Recherche de projet dans une nouvelle discussion"></a> |
54
- | **Prédiction du message suivant** | Activée par défaut ; vous pouvez la désactiver dans **Réglages → Composer Plus**. Quand l’agent termine un tour (pas un tour arrêté ou en échec), la zone de saisie vide affiche en gris une prédiction de votre prochain message, avec l’indication **Tab pour accepter**. `Tab` place le texte dans la zone de saisie, sans l’envoyer. `Esc` la masque pour ce tour. Taper du texte la masque aussi, et un nouveau tour la remplace. Le menu **Modèle**, sous l’interrupteur, liste les modèles de dsh (la même liste que le menu des modèles de dsh). **Défaut de dsh** est sélectionné par défaut et suit le modèle par défaut de dsh. Chaque tour terminé coûte un court appel au modèle. Dans Tether, la prédiction s’affiche au-dessus de la zone de saisie vide : touchez-la pour la placer dans le champ. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Capture d’écran : Prédiction du message suivant"></a> |
55
- | **Compléter pendant la saisie** | Désactivé par défaut ; vous pouvez l’activer dans **Réglages → Composer Plus**. Pendant que vous tapez, un texte gris juste après le curseur montre comment votre message peut continuer. `Tab` l’ajoute au message, sans l’envoyer. `Esc` le masque. Il ne propose que vos propres mots suivants : jamais une réponse qui vous est adressée, ni des textes d’erreur ou des noms inventés. Si le message semble complet ou si le modèle n’est pas sûr, rien ne s’affiche. Si vous tapez les lettres suivantes du texte gris, il reste affiché, sans nouvel appel au modèle. Cette fonctionnalité a son propre menu **Modèle** sous son interrupteur. Sa première option, **Comme la prédiction du message suivant**, utilise le modèle de **Prédiction du message suivant** (c’est l’option par défaut) ; choisissez un autre modèle pour utiliser un modèle différent pour chaque fonctionnalité, par exemple un modèle plus rapide pour les complétions. Elle fait un appel au modèle à chaque pause pendant la saisie : elle consomme donc beaucoup plus de tokens que la prédiction. Choisissez un modèle rapide et peu coûteux. Elle ne s’exécute pas pour une commande slash, un message avec une pastille de fichier, ou quand le curseur n’est pas à la fin. Dans Tether, la suite s’affiche au-dessus du champ pendant la saisie : touchez-la pour l’ajouter. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Capture d’écran : Compléter pendant la saisie"></a> |
56
- | **Autoriser pour cette discussion** | Quand la revue automatique vous demande votre avis, la carte d’approbation propose **Autoriser pour cette discussion** : le même outil dans la même discussion est ensuite autorisé, quels que soient les arguments. Une pastille dans l’en-tête liste les autorisations et permet de les révoquer. Les autorisations restent valables après un redémarrage. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Capture d’écran : Autoriser pour cette discussion"></a> |
57
- | **Statut du projet** | 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. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Capture d’écran : Statut du projet"></a> |
58
- | **Projets actifs en premier** | Quand une discussion commence à s’exécuter ou a besoin de vous, son projet monte en haut de la barre latérale avec l’animation de ligne de dsh (le même mouvement que si vous l’y faisiez glisser). Les projets terminés restent à leur place ; faites-les glisser où vous voulez, comme d’habitude. Les déplacements sont enregistrés dans l’ordre des projets de dsh : si vous désactivez cette fonctionnalité, l’ordre actuel reste. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Capture d’écran : Projets actifs en premier"></a> |
59
- | **Filtre des projets récents** | Barre latérale → options d’affichage (icône de curseurs) → **Actifs au cours des 2 dernières heures**. Tant que cette option est sélectionnée, la barre latérale n’affiche que les projets qui ont une discussion active au cours des 2 dernières heures : une discussion mise à jour pendant ce temps, une discussion en cours ou en attente, la discussion ouverte, ou une discussion terminée que vous n’avez pas encore ouverte (le point vert « terminé » de dsh), même après les 2 heures. Les projets sans une telle discussion sont masqués, y compris les projets nouveaux et vides. Sélectionnez de nouveau l’option pour afficher tous les projets. Le choix est conservé sur cet appareil. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Capture d’écran : Filtre des projets récents"></a> |
60
- | **Réduire tous les projets** | Quand un projet est ouvert dans la barre latérale, un bouton apparaît à côté des options d’affichage (icône de curseurs). Cliquez dessus pour fermer tous les projets ouverts d’un coup, par exemple 3 projets ouverts sur 5. Le bouton disparaît de nouveau quand aucun projet n’est ouvert. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Capture d’écran : Réduire tous les projets"></a> |
61
- | **Trier par état** | 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> |
62
- | **Notifications en arrière-plan** | 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> |
63
- | **11 langues d’interface supplémentaires** | 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 : 11 langues d’interface supplémentaires"></a> |
64
- | **Connexion mobile (iPhone)** | 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, 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. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Capture d’écran : Connexion mobile"></a> |
65
- | **Mises à jour automatiques** | 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**. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Capture d’écran : Mises à jour automatiques"></a> |
40
+ | **Panneau des modifications** | <a id="feature-changespanel"></a>Barre latérale droite → `+` → **Modifications**. Choisissez **Non validées**, **Non indexées**, **Indexées** ou **Branche** pour voir les fichiers modifiés avec leurs compteurs `+/-` ; cliquez sur un fichier pour voir son diff. **Dernier tour** ouvre la revue du dernier tour proposée par dsh lui-même. Cliquez sur le nom de la branche (ou choisissez **Arbre**) pour voir l’arbre des branches : cliquez sur une branche au-dessus pour y aller, et sur un commit pour voir ses fichiers et leurs diffs. **Cette discussion** liste seulement les fichiers écrits par les outils de fichiers (write, edit) de la discussion ouverte, dans tous ses tours, et leur diff total depuis son premier message. Le bouton **␣** masque les modifications d’espaces (`git diff -w`) : les lignes dont seuls l’indentation ou les fins de ligne ont changé ne s’affichent pas. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Capture d’écran : Panneau des modifications"></a> |
41
+ | **Idées de fonctionnalités** | <a id="feature-featureideas"></a>Barre latérale droite → `+` → **Idées de fonctionnalités** → **Suggérer des fonctionnalités**. Le modèle de la discussion lit un court résumé du projet de la discussion (fichiers de premier niveau, début du README et du manifeste, 15 derniers commits) et suggère jusqu’à 8 fonctionnalités. Elles s’affichent sous forme de pile de cartes, dans la langue de l’interface de dsh. Balayez une carte vers la droite (ou cliquez sur **✓**, ou appuyez sur `→` ; dans chaque cas, la carte s’envole de son côté) pour lancer une nouvelle discussion dans le même projet : elle démarre en mode plan avec l’idée comme demande, donc rien ne change avant que vous approuviez le plan. Pour passer le plan, cliquez sur **▶ Créer maintenant** (ou appuyez sur `↑` ; la carte s’envole vers le haut) : la nouvelle discussion démarre tout de suite avec l’idée comme demande ordinaire, et le modèle fait la modification puis lance ses vérifications (les approbations s’appliquent comme d’habitude). Balayez vers la gauche (ou **✕**, ou `←`) pour ignorer la carte ; **Annuler** (ou `Z`) ramène une carte ignorée. Cliquez sur **↓** (ou appuyez sur `↓`) pour garder une bonne idée pour plus tard : elle va dans la liste **Plus tard** du projet, que chaque discussion du même dossier de projet affiche (même après un redémarrage). **Plus tard (N)** ouvre la liste ; **Planifier** lance la même discussion en mode plan pour l’idée et **Créer maintenant** la discussion sans plan, et les deux la retirent de la liste ; **Tout planifier (N)** lance une seule discussion en mode plan pour toutes les idées de la liste, donc les parties communes ne sont planifiées qu’une fois ; **Retirer de la liste** la supprime. **Copier en liste de tâches** copie toute la liste dans le presse-papiers sous forme de liste de tâches Markdown (`- [ ] Title — Summary`, une ligne par idée) pour un outil de suivi des tickets ou un fichier TODO ; aucun appel réseau n’est fait. **Plus d’idées** ajoute des cartes. Pour obtenir des idées sur un seul domaine, tapez un court **Thème ciblé** dans le champ à côté de **Suggérer des fonctionnalités** (80 caractères au plus ; `Enter` lance aussi la suggestion), ou cliquez sur un des thèmes fixes en dessous : **Performances**, **Accessibilité**, **Tests**, **Sécurité**, **Utilisabilité** ou **Documentation** (cliquez de nouveau pour l’effacer). Le modèle suggère alors seulement des fonctionnalités sur ce thème ; un champ vide signifie n’importe quelle fonctionnalité. Une idée n’est pas suggérée deux fois dans un projet : chaque idée suggérée (ignorée, gardée ou lancée) va dans l’**Historique** du projet, le modèle reçoit la consigne de ne plus les suggérer et un titre répété est écarté. **Historique** les liste avec **Lancée** ou **Proposée** ; **Oublier** (ou **Tout oublier**) permet à une idée de revenir ; une idée encore dans la liste **Plus tard** reste hors des suggestions tant que vous ne l’en retirez pas. Le modèle ne s’exécute que lorsque vous cliquez. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Capture d’écran : Idées de fonctionnalités"></a> |
42
+ | **Recherche dans le contenu** | <a id="feature-contentsearch"></a>La recherche de la barre latérale de dsh (la loupe à côté d’**Espaces de travail** ; `Cmd+K` dans l’app de bureau, `Cmd+Alt+K` dans un navigateur) trouve aussi les discussions par les mots de vos messages et des réponses, et pas seulement par leur titre. Elle affiche le texte correspondant sous la discussion. dsh a déjà cette recherche, mais la livre désactivée ; cette fonctionnalité l’active avec un fichier d’index de recherche sur votre ordinateur. L’index est créé à la première recherche après un démarrage (environ 15 s pour 250 discussions, voir Limites) et il est conservé pour les démarrages suivants. Activée par défaut ; un changement s’applique après le redémarrage de dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Capture d’écran : Recherche dans le contenu"></a> |
43
+ | **Annulation de tour** | <a id="feature-turnrollback"></a>Survolez un de vos messages et cliquez sur **↶** (à côté de Copier). **Discussion uniquement** retire ce message et tout ce qui suit (réponses, appels d’outils) de la discussion et du contexte du modèle, puis remet le message dans la zone de saisie : modifiez-le et envoyez-le à nouveau. **Discussion et fichiers** liste d’abord les fichiers du projet qui ont changé depuis ce message, puis les remet aussi dans l’état où ils étaient, y compris les modifications faites par des commandes (`bash`), et pas seulement par les outils d’édition de dsh. Un tour en cours s’arrête d’abord. Le journal de la discussion n’est jamais réécrit : un seul marqueur caché masque la partie retirée, de la même façon que la commande `/compact` de dsh masque les anciens messages. Si [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) est installé, c’est lui qui fait ce travail et Composer Plus n’affiche pas de second bouton. Après une annulation, une barre **Refaire** s’affiche au-dessus de la zone de saisie : elle lance une nouvelle discussion à partir du moment juste avant l’annulation (mêmes messages et même contexte) et, avec **Discussion et fichiers**, remet aussi les fichiers en place. Un fichier que vous avez modifié après l’annulation est listé et conservé, sauf si vous cochez la case qui l’écrase. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Capture d’écran : Annulation de tour"></a> |
44
+ | **Supprimer la discussion** | <a id="feature-deletechat"></a>Barre latérale → menu **…** d’une discussion (ou clic droit) → **Supprimer…** → **Supprimer**. dsh seul ne peut qu’archiver. La discussion s’arrête (son tour, ses tâches en arrière-plan, ses sous-agents et ses rappels planifiés, comme avec l’archivage de dsh) et son historique enregistré, avec les discussions de ses sous-agents, est déplacé dans la Corbeille de macOS (sur les autres systèmes : `$DSH_HOME/trash`). Pour la récupérer, remettez le dossier à sa place et redémarrez dsh : elle apparaît dans la vue **Archivées uniquement** de la barre latérale. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Capture d’écran : Supprimer la discussion"></a> |
45
+ | **Nom du projet dans la zone de saisie** | <a id="feature-projectname"></a>La ligne sous la zone de saisie (tours, jetons, succès de cache, contexte) commence par le nom du projet de la discussion : vous voyez donc toujours dans quel projet travaille une discussion. C’est le titre du projet dans dsh, ou le nom du dossier si le projet n’a pas de titre. Survolez-le pour voir le chemin complet du dossier. Cliquez dessus pour retrouver la discussion dans la barre latérale, en vue liste ou par projet : la barre latérale et le projet s’ouvrent (y compris un projet replié et son **Afficher N sessions de plus**), la liste défile jusqu’à la discussion et la discussion clignote pendant 5 secondes. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Capture d’écran : Nom du projet dans la zone de saisie"></a> |
46
+ | **Historique de saisie** | <a id="feature-inputhistory"></a>Dans une zone de saisie vide, appuyez sur `↑` / `↓` pour parcourir les messages envoyés, comme dans un terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Capture d’écran : Historique de saisie"></a> |
47
+ | **Mode plan avec Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` ajoute `/plan ` au début du brouillon (appuyez de nouveau pour le retirer). Si la discussion est déjà en mode plan, `Shift+Tab` quitte ce mode. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Capture d’écran : Mode plan avec Shift+Tab"></a> |
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
+ | **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> |
50
+ | **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> |
51
+ | **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> |
52
+ | **Modifier sur place un message en file d’attente** | <a id="feature-queueedit"></a>Double-cliquez sur un message en file d’attente. Il devient la zone d’édition propre à dsh : modifiez le texte, puis appuyez sur `Enter` pour enregistrer ou sur `Esc` pour annuler. Le message garde sa place dans la file. Les messages avec des images ou des fichiers ne peuvent pas être modifiés ainsi (la file de dsh ne modifie que le texte). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Capture d’écran : Modifier sur place un message en file d’attente"></a> |
53
+ | **Copier le lien de session** | <a id="feature-copydeeplink"></a>Clic droit sur une discussion dans la barre latérale → **Copier le lien de session**. Collez le lien `dsh-session:…` dans une autre discussion pour y joindre cette discussion comme contexte en lecture seule. dsh 0.2.1 a son propre **Copier l’ID de session**, qui ne copie que l’identifiant brut ; cet élément vient juste après. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Capture d’écran : Copier le lien de session"></a> |
54
+ | **Copier le lien du message** | <a id="feature-copymessagelink"></a>Survolez un message et cliquez sur **🔗** (dans sa ligne d’actions ; pour une réponse, à côté de l’heure). Le lien est le lien de session suivi du numéro du message : `dsh-session:…#42`. Collez-le dans un message et envoyez-le : à partir de dsh 0.2.1, le lien s’affiche comme une pastille. Un clic ouvre cette discussion, fait défiler jusqu’au message et le met en évidence pendant 2 secondes. Comme un lien de session, il joint aussi cette discussion comme contexte en lecture seule. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Capture d’écran : Copier le lien du message"></a> |
55
+ | **Exporter la discussion en Markdown** | <a id="feature-exportmarkdown"></a>Clic droit sur une discussion dans la barre latérale (ou ouvrez son menu **…**) → **Exporter en Markdown…**. Une boîte de dialogue indique combien de messages la discussion contient ; **Copier dans le presse-papiers** copie la discussion en Markdown, **Enregistrer le fichier .md** l’enregistre sous `<chat title>.md` via le téléchargement du navigateur (dsh de bureau : dans votre dossier Téléchargements ou via une boîte de dialogue d’enregistrement, selon les réglages de votre système). Le fichier contient le titre de la discussion, le nom du projet et la date, puis une section `## Vous` ou `## Assistant` par message. Les blocs de code restent tels quels ; un bloc de code qu’un message laisse ouvert est fermé. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Capture d’écran : Exporter la discussion en Markdown"></a> |
56
+ | **Copier le chemin du projet** | <a id="feature-copyprojectpath"></a>Clic droit sur un projet dans la barre latérale → **Copier le chemin** copie le chemin complet de son dossier. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Capture d’écran : Copier le chemin du projet"></a> |
57
+ | **Recherche de projet dans une nouvelle discussion** | <a id="feature-projectpicker"></a>Nouvelle discussion → le bouton de projet au-dessus de la zone de saisie. Les projets s’affichent dans l’ordre A–Z, avec un champ **Rechercher des projets** en haut. Tapez une partie d’un nom (sans tenir compte de la casse ni des accents) et appuyez sur `Enter` pour choisir le premier résultat. Si rien ne correspond, **Aucun projet ne correspond** s’affiche. L’ordre des projets enregistré par dsh dans la barre latérale ne change pas. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Capture d’écran : Recherche de projet dans une nouvelle discussion"></a> |
58
+ | **Prédiction du message suivant** | <a id="feature-nextprediction"></a>Activée par défaut ; vous pouvez la désactiver dans **Réglages → Composer Plus**. Quand l’agent termine un tour (pas un tour arrêté ou en échec), la zone de saisie vide affiche en gris une prédiction de votre prochain message, avec l’indication **Tab pour accepter**. `Tab` place le texte dans la zone de saisie, sans l’envoyer. `Esc` la masque pour ce tour. Taper du texte la masque aussi, et un nouveau tour la remplace. Le menu **Modèle**, sous l’interrupteur, liste les modèles de dsh (la même liste que le menu des modèles de dsh). **Défaut de dsh** est sélectionné par défaut et suit le modèle par défaut de dsh. Chaque tour terminé coûte un court appel au modèle. Dans Tether, la prédiction s’affiche au-dessus de la zone de saisie vide : touchez-la pour la placer dans le champ. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Capture d’écran : Prédiction du message suivant"></a> |
59
+ | **Compléter pendant la saisie** | <a id="feature-typingcompletion"></a>Désactivé par défaut ; vous pouvez l’activer dans **Réglages → Composer Plus**. Pendant que vous tapez, un texte gris juste après le curseur montre comment votre message peut continuer. `Tab` l’ajoute au message, sans l’envoyer. `Esc` le masque. Il ne propose que vos propres mots suivants : jamais une réponse qui vous est adressée, ni des textes d’erreur ou des noms inventés. Si le message semble complet ou si le modèle n’est pas sûr, rien ne s’affiche. Si vous tapez les lettres suivantes du texte gris, il reste affiché, sans nouvel appel au modèle. Cette fonctionnalité a son propre menu **Modèle** sous son interrupteur. Sa première option, **Comme la prédiction du message suivant**, utilise le modèle de **Prédiction du message suivant** (c’est l’option par défaut) ; choisissez un autre modèle pour utiliser un modèle différent pour chaque fonctionnalité, par exemple un modèle plus rapide pour les complétions. Elle fait un appel au modèle à chaque pause pendant la saisie : elle consomme donc beaucoup plus de tokens que la prédiction. Choisissez un modèle rapide et peu coûteux. Elle ne s’exécute pas pour une commande slash, un message avec une pastille de fichier, ou quand le curseur n’est pas à la fin. Dans Tether, la suite s’affiche au-dessus du champ pendant la saisie : touchez-la pour l’ajouter. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Capture d’écran : Compléter pendant la saisie"></a> |
60
+ | **Améliorer le prompt** | <a id="feature-promptimprove"></a>Tapez une demande approximative, puis cliquez sur la baguette magique (**Améliorer le prompt**) à côté du menu des modèles. Un appel au modèle la réécrit en un prompt plus clair : l’objectif d’abord, de courtes étapes numérotées quand il y a plusieurs parties, et la vérification à lancer. Il lit cette discussion (sans les messages retirés par une annulation), le README, AGENTS.md et le manifeste du projet, les fichiers modifiés et les fichiers dont le nom correspond à vos mots, et garde votre langue. Il n’invente jamais de noms de fichiers. Le nouveau texte remplace votre brouillon, mais n’est pas envoyé : lisez-le, modifiez-le, puis appuyez sur `Enter`. `Cmd/Ctrl+Z` rétablit votre texte en une étape, tout comme le bouton (**Annuler l’amélioration**). Si vous tapez pendant qu’il travaille, votre nouveau texte reste. `Esc` ou un second clic annule. Il a son propre menu **Modèle** dans les Réglages (par défaut : **Comme le modèle de la discussion**). Pas pour les commandes slash ni pour un message avec une pastille de fichier. Dans Tether, la baguette est à côté du champ. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Capture d’écran : Améliorer le prompt"></a> |
61
+ | **Autoriser pour cette discussion** | <a id="feature-allowforchat"></a>Quand la revue automatique vous demande votre avis, la carte d’approbation propose **Autoriser pour cette discussion** : le même outil dans la même discussion est ensuite autorisé, quels que soient les arguments, jusqu’à la fin de la limite de temps (1 heure par défaut ; choisissez-la dans **Réglages → Composer Plus → Autoriser pour cette discussion**). Ensuite, l’agent demande à nouveau. Une pastille dans l’en-tête liste les autorisations avec leur heure de fin et permet de les révoquer. Les autorisations restent valables après un redémarrage. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Capture d’écran : Autoriser pour cette discussion"></a> |
62
+ | **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. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Capture d’écran : Statut du projet"></a> |
63
+ | **Tout marquer comme lu** | <a id="feature-markprojectread"></a>Dans la barre latérale, cliquez sur le bouton **…** d’un projet → **Tout marquer comme lu**. Le point vert non lu disparaît d’un coup de toutes les discussions de ce projet ; les autres projets gardent le leur. L’élément est grisé (**Aucune discussion non lue**) quand le projet n’en a aucune. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Capture d’écran : Tout marquer comme lu"></a> |
64
+ | **Projets actifs en premier** | <a id="feature-activeprojectsfirst"></a>Quand une discussion commence à s’exécuter ou a besoin de vous, son projet monte en haut de la barre latérale avec l’animation de ligne de dsh (le même mouvement que si vous l’y faisiez glisser). Les projets terminés restent à leur place ; faites-les glisser où vous voulez, comme d’habitude. Les déplacements sont enregistrés dans l’ordre des projets de dsh : si vous désactivez cette fonctionnalité, l’ordre actuel reste. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Capture d’écran : Projets actifs en premier"></a> |
65
+ | **Filtre des projets récents** | <a id="feature-recentprojects"></a>Barre latérale → options d’affichage (icône de curseurs) → **Actifs au cours des 2 dernières heures**. Tant que cette option est sélectionnée, la barre latérale n’affiche que les projets qui ont une discussion active au cours des 2 dernières heures : une discussion mise à jour pendant ce temps, une discussion en cours ou en attente, la discussion ouverte, ou une discussion terminée que vous n’avez pas encore ouverte (le point vert « terminé » de dsh), même après les 2 heures. Les projets sans une telle discussion sont masqués, y compris les projets nouveaux et vides. Sélectionnez de nouveau l’option pour afficher tous les projets. Le choix est conservé sur cet appareil. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Capture d’écran : Filtre des projets récents"></a> |
66
+ | **Réduire tous les projets** | <a id="feature-collapseprojects"></a>Quand un projet est ouvert dans la barre latérale, un bouton apparaît à côté des options d’affichage (icône de curseurs). Cliquez dessus pour fermer tous les projets ouverts d’un coup, par exemple 3 projets ouverts sur 5. Le bouton disparaît de nouveau quand aucun projet n’est ouvert. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Capture d’écran : Réduire tous les projets"></a> |
67
+ | **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> |
68
+ | **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> |
69
+ | **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> |
70
+ | **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, 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> |
71
+ | **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 (issues de la même vérification des mises à jour, sans autre appel réseau) ; **Fermer** ou `Esc` la ferme. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Capture d’écran : Mises à jour automatiques"></a> |
72
+
73
+ <!-- END GENERATED FEATURES -->
66
74
 
67
75
  Les boutons, info-bulles, messages et notifications suivent la langue choisie dans dsh (voir Langue de l’application ci-dessous).
68
76
 
69
77
  ## Réglages
70
78
 
71
- 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. 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** et de **Prédiction du message suivant** : 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** et celui de **Compléter pendant la saisie** (par défaut **Comme la prédiction du message suivant**). **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.**
79
+ 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** et de **Prédiction du message suivant** : 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**) et celui d’**Améliorer le prompt** (par défaut **Comme le modèle de la discussion**). **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.**
72
80
 
73
81
  <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>
74
82
 
@@ -114,22 +122,23 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
114
122
  - **Continuer :** le point de terminaison local authentifié ne reprend que le dernier tour interrompu, refuse les requêtes périmées ou en double et conserve les hooks d’approbation existants. Il n’envoie pas de nouveau message utilisateur.
115
123
  - **Reprendre après redémarrage :** désactivée tant que vous ne l’activez pas. La partie hôte ne garde que les identifiants des discussions et leurs heures de début dans `$DSH_HOME/storages/dsh-composer-plus/resume.json` (accès réservé au propriétaire), et rien ne quitte votre machine. Elle ne reprend une discussion que si le journal de dsh indique que c’est dsh (et non vous) qui a arrêté son dernier tour. Les approbations et la revue automatique s’appliquent au tour repris comme d’habitude.
116
124
 
117
- - **Panneau des modifications :** git s’exécute en lecture seule sur votre machine, dans le dossier de la discussion, via le canal `/api` authentifié de dsh. Il ne fait jamais de commit, de stage ni de fetch, et n’affiche que les chemins listés par git lui-même.
125
+ - **Panneau des modifications :** git s’exécute en lecture seule sur votre machine, dans le dossier de la discussion, via le canal `/api` authentifié de dsh. Il ne fait jamais de commit, de stage ni de fetch, et n’affiche que les chemins listés par git lui-même. L’arbre montre les 300 commits les plus récents des branches locales et distantes ; il ne change jamais de branche (checkout). Dans un très grand dépôt sans fichier commit-graph, l’arbre peut mettre quelques secondes à s’ouvrir. **Cette discussion** lit le journal de la discussion elle-même pour trouver les fichiers que ses outils de fichiers ont écrits, puis les compare à l’instantané que l’Annulation de tour a pris pour cette discussion, dans un dossier temporaire supprimé aussitôt ; elle n’écrit rien dans votre dépôt ni dans le stockage des instantanés.
118
126
  - **Idées de fonctionnalités :** rien ne s’exécute tant que vous ne cliquez pas sur **Suggérer des fonctionnalités**. La partie hôte lit alors uniquement le dossier de la discussion (le navigateur n’envoie jamais de chemin) : les noms des entrées de premier niveau, les 6 premiers ko du README, d’AGENTS.md et du manifeste (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) et `git log --oneline -15`, 16 ko au plus au total. Elle ignore `.env*`, les fichiers de clés et les dossiers comme `node_modules`, et elle ne lit que des fichiers ordinaires qui restent dans le dossier : un lien symbolique qui pointe hors du dossier, une FIFO ou un périphérique est ignoré. Ce résumé est envoyé au modèle utilisé par la discussion, via les réglages de fournisseur de dsh, en une seule requête ; il n’est ajouté à aucune discussion. Rien n’est écrit dans le projet. Une idée balayée vers la droite lance une nouvelle discussion en mode plan : les approbations et la revue du plan s’appliquent donc comme d’habitude. **Créer maintenant** lance la discussion sans mode plan : le modèle peut modifier des fichiers tout de suite, avec les approbations habituelles de la discussion et la revue automatique. Les idées gardées pour plus tard (titre, résumé, raison, effort) sont conservées avec le chemin du dossier du projet dans `storages/dsh-composer-plus/later.json`, dans le dossier personnel de dsh (fichier réservé au propriétaire) ; rien ne va dans le projet. L’historique des idées suggérées (titre, résumé, raison, effort, date, lancée ou non) est conservé de la même façon dans `storages/dsh-composer-plus/idea-history.json`, au plus 200 par projet (les plus anciennes partent en premier) ; ses titres vont au modèle avec la prochaine demande **Suggérer des fonctionnalités** de ce projet.
119
127
  - **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`.
120
- - **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`.
128
+ - **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).
121
129
  - **Exporter la discussion en Markdown :** la partie hôte lit seulement le journal de la discussion elle-même (les mêmes messages que dsh affiche) et les donne à la page ; elle ne lit aucun fichier du projet et n’envoie rien sur le réseau. Le Markdown va seulement dans votre presse-papiers ou dans le fichier que vous enregistrez.
122
130
  - **Supprimer la discussion :** déplace les dossiers de journaux de la discussion elle-même (`$DSH_HOME/sessions/<project>/<chat>`) dans la Corbeille. Le dossier du projet n’est pas touché.
123
- - **Autoriser pour cette discussion :** les autorisations sont enregistrées dans `$DSH_HOME/storages/dsh-composer-plus/grants.json` (accès réservé au propriétaire). Une autorisation couvre **un seul outil précis dans une seule discussion**. Si cet outil peut écrire, l’autorisation couvre aussi toute écriture. Révoquez-la depuis la pastille de l’en-tête.
131
+ - **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.
124
132
  - La revue automatique s’exécute toujours à chaque appel ; les échecs de revue ne sont jamais autorisés automatiquement.
125
- - **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) ; **Revoke** 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. Données : `$DSH_HOME/storages/dsh-composer-plus/mobile/`. Détails : [tether/README.md](tether/README.md).
133
+ - **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).
126
134
  - **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.
127
135
  - **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).
128
136
  - **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).
137
+ - **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).
129
138
 
130
139
  ## Dépannage
131
140
 
132
- - **Aucune notification sur macOS :** Réglages Système → Notifications → DeepSeek Harness → autorisez les notifications. Choisissez **Alertes** pour qu’elles restent à l’écran.
141
+ - **Aucune notification sur macOS :** Réglages Système → Notifications → DeepSeek Harness → autorisez les notifications. Choisissez Alertes pour qu’elles restent à l’écran.
133
142
  - **▶, les poignées de file, le statut du projet, l’option des projets récents, Réduire tous les projets, Copier le chemin, le champ de recherche de projet, la prédiction du message suivant, la complétion pendant la saisie, Autoriser pour cette discussion ou le clic droit manquent après une mise à jour de dsh :** ces éléments s’attachent au HTML actuel de dsh, car dsh n’a pas encore d’emplacement prévu pour eux. Si dsh change ce balisage, ils se masquent ; rien d’autre ne casse. Merci d’ouvrir une [issue](https://github.com/furkancak1r/dsh-composer-plus/issues).
134
143
  - **« Échec de la mise à jour » ou « n’a pas été installée depuis npm » :** une copie liée depuis un dossier local ou renommée ne peut pas se mettre à jour elle-même ; réinstallez `dsh-composer-plus` depuis Réglages → Plugins. Sinon, le message affiche la première ligne de l’erreur de pnpm ; **Rechercher des mises à jour** réessaie.
135
144
  - **Connexion mobile indique que la passerelle ne fonctionne pas :** « no IPv4 address on en0 » signifie que ce Mac n’a pas d’adresse Wi-Fi/Ethernet ; « EADDRINUSE » signifie qu’un autre dsh (ou une autre app) utilise le port 19390 ou 19391. Un seul dsh à la fois peut exécuter Connexion mobile.
@@ -138,8 +147,9 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
138
147
  - **Pas de bouton ↶ sur mes messages :** Annulation de tour est désactivée, la discussion est une discussion de sous-agent, ou dsh-rewind-plugin est installé (utilisez son bouton ↶). Après une mise à jour, redémarrez dsh.
139
148
  - **Discussion et fichiers est grisé :** le projet n’est pas un dépôt git, il n’y a pas d’instantané d’avant ce message (le message est plus ancien que le plugin, ou l’un des 50 instantanés les plus récents l’a remplacé), ou aucun fichier n’a changé.
140
149
  - **Supprimer indique qu’un autre dsh a cette discussion ouverte :** un second dsh qui utilise le même dossier personnel de dsh détient le verrou de la discussion. Fermez cette fenêtre ou ce dsh, puis supprimez de nouveau. En attendant, la discussion reste archivée.
150
+ - **Mon iPhone ne peut pas se connecter depuis que j’ai activé « Tailscale only » :** Tailscale doit être activé sur le Mac et sur l’iPhone. Le panneau Connexion mobile vous avertit quand il est désactivé sur le Mac. Le journal d’accès montre chaque tentative refusée avec sa raison.
141
151
  - **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).
142
- - **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.11.3`) ; voir la note d’installation plus haut.
152
+ - **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.13.0`) ; voir la note d’installation plus haut.
143
153
 
144
154
  ## Limites
145
155
 
@@ -155,9 +165,14 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
155
165
  - **Supprimer la discussion** a besoin de l’archivage de dsh (dsh 0.2.0 et versions ultérieures). Une discussion (ou une des discussions de ses sous-agents) qui ne s’arrête pas dans les 15 s, ou qu’un autre dsh détient, reste archivée et rien n’est déplacé. Sur les systèmes autres que macOS, le dossier de corbeille doit être sur le même disque que l’historique des discussions. Une discussion ouverte que vous supprimez reste dans la mémoire de dsh, archivée et masquée, jusqu’au redémarrage de dsh. Videz la Corbeille vous-même ; dsh ne le fait pas.
156
166
  - La file d’attente de dsh n’a pas d’action `move` : la partie hôte du plugin déplace donc le message lui-même dans la file d’attente de dsh (une seule modification, le même message). Les messages avec des images ou des fichiers se déplacent aussi. Seuls vos propres messages se déplacent : une itération d’objectif ou une réponse à une question dans la file reste à sa place. Si l’envoi d’un message commence pendant que vous faites glisser, rien n’est déplacé et un avis le signale.
157
167
  - 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.
168
+ - **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.
158
169
  - **Garder le focus dans la zone de saisie** ne rend le focus qu’après une commande `/` ou une compétence. Pendant que dsh résout la commande, la zone de saisie reste en lecture seule pendant quelques millisecondes : les touches tapées pendant ce temps sont perdues. Si le menu `/` de dsh est encore ouvert, `Enter` choisit la ligne en surbrillance et n’envoie pas le message.
159
- - **Connexion mobile** ne fonctionne que sur macOS (elle utilise `en0`, `openssl`, `swift` et `dns-sd`). Elle utilise les ports fixes 19390 et 19391 : un seul dsh par Mac peut donc l’exécuter à la fois (chaque Mac est une entrée dans la liste des Mac du téléphone). Le téléphone ne reçoit des notifications que lorsque Tether est ouvert ou vient de passer en arrière-plan (pas de service push). L’app iOS n’est pas encore sur l’App Store : compilez-la depuis `tether/ios` avec Xcode.
160
- - Un lien de session fonctionne dans les discussions ; un clic dessus n’ouvre pas la discussion.
170
+ - **Connexion mobile** ne fonctionne que sur macOS (elle utilise `en0`, `openssl`, `swift` et `dns-sd`). Elle utilise les ports fixes 19390 et 19391 : un seul dsh par Mac peut donc l’exécuter à la fois (chaque Mac est une entrée dans la liste des Mac du téléphone). Le téléphone ne reçoit des notifications que lorsque Tether est ouvert ou vient de passer en arrière-plan (pas de service push). L’app iOS n’est pas encore sur l’App Store : compilez-la depuis `tether/ios` avec Xcode. « Tailscale only » demande quand même une adresse Wi-Fi ou Ethernet sur le Mac (la passerelle ne démarre qu’avec une telle adresse). Le journal d’accès est propre à chaque Mac et ne garde que les 200 tentatives les plus récentes ; une tentative répétée en moins d’une minute augmente de un le compteur de la même ligne. Le verrouillage de Tether ne masque pas les aperçus des notifications sur l’écran verrouillé de l’iPhone : désactivez-les dans les Réglages d’iOS. Les points verts de Tether suivent le Mac : une conversation que vous ouvrez dans dsh perd aussi son point sur le téléphone. Une conversation que vous ouvrez dans Tether perd son point seulement sur les téléphones. Le point de dsh sur le Mac reste jusqu’à ce que vous ouvriez la conversation sur le Mac.
171
+ - 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.
172
+ - **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.
173
+ - **Modifier sur place un message en file d’attente** ouvre l’éditeur de file d’attente de dsh lui-même, avec ses limites : un message avec des images ou des fichiers ne peut pas être modifié, et un message qui a commencé à partir entre-temps n’est pas changé (dsh affiche sa propre erreur).
174
+ - **Refaire** ne change jamais la discussion annulée : il lance une nouvelle discussion à partir du moment juste avant l’annulation (la duplication de session de dsh, le même contexte du modèle), donc la nouvelle discussion a un nouvel id et un nouveau titre. Seule la dernière annulation d’une discussion peut être refaite, une seule fois, et seulement tant que rien n’est venu après (un nouveau message retire l’offre). Un fichier que vous avez modifié après l’annulation est conservé, sauf si vous cochez la case qui l’écrase. Refaire a besoin de l’instantané gardé par l’annulation (la même fenêtre de 50 entrées) ; une annulation faite avant cette version, ou avec **Discussion uniquement**, ne ramène que les messages.
175
+ - **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.
161
176
  - Une notification envoyée avant un redémarrage ne fait que ramener dsh au premier plan quand vous cliquez dessus.
162
177
  - Les projets actifs sont déplacés avec l’ordre des projets enregistré par dsh : le nouvel ordre est donc conservé après un redémarrage. Les discussions hors de tout projet (« Sans groupe ») ne peuvent pas être déplacées ; dsh les liste toujours en dernier.
163
178
  - dsh n’a pas de point d’extension dans le menu des options d’affichage de la barre latérale : l’option des projets récents est donc ajoutée au menu de dsh lui-même. Si une mise à jour de dsh change ce menu, l’option n’apparaît pas et tous les projets restent visibles. Le filtre agit sur les lignes de projet : **Dans une seule liste** n’est donc pas filtré. Utilisez-le avec **Espace de travail** : dans **Arborescence des espaces de travail**, un dossier parent masqué masque aussi les projets actifs qu’il contient. **Par état** a le même type de limite : dsh n’a pas d’emplacement pour l’ordre, donc l’élément de menu et l’ordre des lignes s’attachent au balisage du menu et de la liste de dsh.
@@ -165,6 +180,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
165
180
  - dsh n’a pas non plus de point d’extension dans le menu des projets d’une nouvelle discussion : le champ **Rechercher des projets** et l’ordre A–Z s’attachent donc au balisage du menu de dsh. Si une mise à jour de dsh change ce balisage, le menu s’affiche comme dsh le dessine : dans l’ordre enregistré, sans le champ. L’ordre A–Z n’est qu’un affichage : il ne change pas l’ordre des projets enregistré par dsh.
166
181
  - dsh n’a pas non plus de point d’extension pour une indication dans la zone de saisie : le texte de **Prédiction du message suivant** se place donc sur le texte indicatif de dsh (`[data-composer-placeholder]`). Si une mise à jour de dsh change ce balisage, aucune prédiction ne s’affiche. Tant qu’elle est activée, chaque tour terminé coûte un court appel au modèle.
167
182
  - **Compléter pendant la saisie** affiche son texte au moyen de l’indication de saisie propre à dsh (le style `--dsh-composer-hint` que dsh utilise pour l’indication d’argument d’une commande slash). Cette fonctionnalité ne s’exécute pas pour une commande slash, un message avec une pastille de fichier ou de symbole, ou quand le curseur n’est pas à la fin du message. Si une mise à jour de dsh change ce style, aucune complétion ne s’affiche. Chaque pause pendant la saisie coûte un appel au modèle.
183
+ - **Améliorer le prompt** ne voit qu’un court résumé du projet, les chemins modifiés et les chemins dont le nom correspond à vos mots : pas le code lui-même. Il peut donc manquer le bon fichier, et il ne cite que les chemins qu’il a reçus. Relisez le nouveau texte avant de l’envoyer. Il ne s’exécute pas pour une commande slash ni pour un message avec une pastille de fichier ou de symbole (le nouveau texte est du texte brut : la pastille serait perdue), et un message peut avoir au plus 8 000 caractères. Les images restent jointes : seul le texte change. Chaque clic coûte un appel au modèle ; un modèle puissant peut prendre une minute (`Esc` annule).
168
184
  - 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).
169
185
 
170
186
  ## FAQ
@@ -189,9 +205,25 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
189
205
 
190
206
  **Quel modèle écrit la prédiction ?** Le modèle que vous choisissez dans **Réglages → Composer Plus → Prédiction du message suivant → Modèle**. La liste est celle des modèles de dsh. **Défaut de dsh** suit le modèle par défaut de dsh. Si dsh ne liste plus le modèle choisi, la prédiction utilise le modèle par défaut. **Compléter pendant la saisie** a son propre menu **Modèle** : **Comme la prédiction du message suivant** (l’option par défaut) suit le modèle de la prédiction ; un autre choix ne sert qu’aux complétions. Si dsh ne liste plus ce modèle, les complétions utilisent le modèle de la prédiction.
191
207
 
208
+ **dsh peut-il améliorer mon prompt avant que je l’envoie, comme le bouton Enhance prompt de Roo Code ou d’Augment ?** Oui, avec **Améliorer le prompt** (activé par défaut) : tapez une demande approximative et cliquez sur la baguette magique à côté du menu des modèles. Il réécrit le texte avec cette discussion et le projet comme contexte, dans votre langue, et ne l’envoie pas. `Cmd/Ctrl+Z` ou **Annuler l’amélioration** rétablit votre texte. Choisissez son modèle dans **Réglages → Composer Plus → Améliorer le prompt → Modèle**.
209
+
192
210
  **Comment réordonner les messages en file d’attente dans dsh ?** Faites glisser la poignée ⠿ d’un message en file d’attente, ou placez le focus dessus et appuyez sur `↑` / `↓`.
193
211
 
194
- **Comment empêcher la revue automatique de redemander pour le même outil dans une discussion ?** Cliquez sur **Autoriser pour cette discussion** sur la carte d’approbation. Cela couvre cet outil précis dans cette discussion seulement ; révoquez l’autorisation depuis la pastille de l’en-tête.
212
+ **Comment corriger une faute de frappe dans un message en file d’attente ?** Double-cliquez sur le message dans la file d’attente, modifiez le texte et appuyez sur `Enter` (`Esc` annule). Le message garde sa place dans la file d’attente.
213
+
214
+ **Comment effacer d’un coup tous les points non lus d’un projet ?** Barre latérale → bouton **…** du projet → **Tout marquer comme lu**.
215
+
216
+ **Puis-je faire un lien vers un seul message d’une longue discussion ?** Oui : survolez le message et cliquez sur **🔗**. Envoyez le lien dans une discussion : sur dsh 0.2.1 et versions ultérieures, un clic dessus ouvre la discussion à ce message.
217
+
218
+ **J’ai annulé un tour par erreur. Puis-je le récupérer ?** Oui, avec **Refaire** au-dessus de la zone de saisie, juste après l’annulation : il lance une nouvelle discussion à partir du moment juste avant l’annulation, avec les mêmes messages, et **Discussion et fichiers** remet aussi les fichiers.
219
+
220
+ **Comment voir seulement les fichiers qu’une discussion a modifiés ?** Barre latérale droite → **Modifications** → **Cette discussion**. Cliquez sur **␣** pour masquer les modifications qui ne portent que sur des espaces.
221
+
222
+ **Comment empêcher la revue automatique de redemander pour le même outil dans une discussion ?** Cliquez sur **Autoriser pour cette discussion** sur la carte d’approbation. Cela couvre cet outil précis dans cette discussion seulement, pendant 1 heure par défaut ; révoquez l’autorisation depuis la pastille de l’en-tête. Changez la durée dans **Réglages → Composer Plus → Autoriser pour cette discussion**.
223
+
224
+ **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.
225
+
226
+ **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.
195
227
 
196
228
  **Comment n’afficher que les projets utilisés aujourd’hui dans la barre latérale de dsh ?** Barre latérale → options d’affichage (icône de curseurs) → **Actifs au cours des 2 dernières heures**. Sélectionnez de nouveau l’option pour afficher tous les projets.
197
229
 
@@ -219,8 +251,12 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /pa
219
251
  PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
220
252
  # Order by status (fake model + Schedule): real-app test + its thumbnail
221
253
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
222
- # every Settings feature row shows a loading screenshot
254
+ # every Settings feature row shows a loading screenshot and a ? link to its README row
223
255
  PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
256
+ # What's new after an update: the release notes show once, Esc and Close close them
257
+ PLAYWRIGHT=/path/to/playwright node test/browser-whats-new.mjs /path/to/dsh/lib/bin.js
258
+ # README feature anchors (the ? links) on github.com, headless: each #feature-… shows the start of its row
259
+ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
224
260
  # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
225
261
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
226
262
  # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
@@ -235,14 +271,17 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-export-markdown.mjs /pat
235
271
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
236
272
  # Turn rollback + Delete chat (fake model, made-up git project): bash edit → ↶ Chat and files → files back, .git unchanged; Delete… → Trash + its thumbnails
237
273
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
274
+ # Improve prompt (fake model, made-up git project): the wand sends the draft with the chat and the project, the answer replaces the draft, Cmd+Z and Undo bring it back + its thumbnail
275
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
238
276
  ```
239
277
 
240
278
  ```sh
241
279
  npm run build:locales # after editing locales/<id>.json
280
+ npm run build:readme # after editing docs/features.json
242
281
  npm test
243
282
  ```
244
283
 
245
- **Règle pour les nouvelles fonctionnalités :** chaque ligne de fonctionnalité dans Réglages → Composer Plus affiche une capture d’écran. Ajoutez l’id de la fonctionnalité à `SHOT_OF` dans `client.js` et à `SHOTS` dans `index.js`, et livrez `assets/features/<id>.webp` (pris dans le dsh de démonstration jetable, interface en anglais, environ 60 ko ou moins). Ajoutez la fonctionnalité au tableau du README avec la même image, dans `README.md` et dans chaque `README.<id>.md` traduit. `test/shots.test.mjs` échoue quand une fonctionnalité n’a pas de capture d’écran, et `test/browser-settings-shots.mjs` vérifie la vraie page des Réglages. La liste de contrôle complète pour chaque changement se trouve dans [AGENTS.md](AGENTS.md).
284
+ **Règle pour les nouvelles fonctionnalités :** chaque ligne de fonctionnalité dans Réglages → Composer Plus affiche une capture d’écran. Ajoutez l’id de la fonctionnalité à `SHOT_OF` dans `client.js` et à `SHOTS` dans `index.js`, et livrez `assets/features/<id>.webp` (pris dans le dsh de démonstration jetable, interface en anglais, environ 60 ko ou moins). Ajoutez la fonctionnalité, avec la même image, à `docs/features.json` et lancez `npm run build:readme` : il écrit le tableau des fonctionnalités de `README.md` et de chaque `README.<id>.md` traduit, ainsi que la liste de `llms.txt`. `test/shots.test.mjs` échoue quand une fonctionnalité n’a pas de capture d’écran, et `test/browser-settings-shots.mjs` vérifie la vraie page des Réglages. La liste de contrôle complète pour chaque changement se trouve dans [AGENTS.md](AGENTS.md).
246
285
 
247
286
  Les tests exécutent le vrai `client.js` sur un faux React/DOM et le vrai `index.js` (partie hôte) sur un dépôt git temporaire. Les tests de la passerelle Tether (`test/tether-gateway.test.mjs`) utilisent un hôte dsh simulé et une vraie passerelle TLS. L’app iPhone se trouve dans `tether/ios` (voir [tether/README.md](tether/README.md) et [tether/AGENTS.md](tether/AGENTS.md)). `node test/browser-history.mjs '<dsh web URL with ?token=…>'` vérifie l’historique de saisie dans un vrai navigateur, avec un `dsh web` jetable qui a son propre `DSH_HOME`.
248
287