dsh-composer-plus 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +96 -19
- package/README.es.md +96 -19
- package/README.fr.md +96 -19
- package/README.hi.md +96 -19
- package/README.id.md +96 -19
- package/README.ja.md +96 -19
- package/README.ko.md +96 -19
- package/README.md +96 -19
- package/README.pt-BR.md +96 -19
- package/README.ru.md +96 -19
- package/README.tr.md +96 -19
- package/README.vi.md +96 -19
- package/README.zh.md +96 -19
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/copyMessageLink.webp +0 -0
- package/assets/features/defaultWorkspace.webp +0 -0
- package/assets/features/findInChat.webp +0 -0
- package/assets/features/goalCheck.webp +0 -0
- package/assets/features/markProjectRead.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/worktreeChats.webp +0 -0
- package/client.js +1983 -199
- package/index.js +1824 -106
- package/package.json +7 -3
- package/tether/gateway/admin.html +47 -3
- package/tether/gateway/server.mjs +100 -29
package/README.fr.md
CHANGED
|
@@ -14,7 +14,7 @@ Des fonctions pratiques dans le style de Codex pour l’interface de bureau et w
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness avec Composer Plus : le projet en cours affiche un indicateur de chargement dans la barre latérale et le panneau des modifications affiche un diff git"></p>
|
|
16
16
|
|
|
17
|
-
Plugin communautaire non officiel. Les seuls appels réseau servent à la recherche de mises à jour (versions GitHub et registre npm) ; désactivez **Mises à jour automatiques** pour les arrêter au démarrage. **Idées de fonctionnalités** n’appelle le modèle de votre discussion que lorsque vous cliquez sur **Suggérer des fonctionnalités**. **Prédiction du message suivant** (activée par défaut) appelle le modèle choisi dans les Réglages (celui par défaut de dsh, sauf si vous en choisissez un autre) une fois après chaque tour terminé, sans clic. Désactivez-la dans **Réglages → Composer Plus** pour arrêter ces appels. **Compléter pendant la saisie** (désactivé par défaut) appelle le modèle choisi pour cette fonctionnalité (par défaut, celui de la prédiction) à chaque pause pendant la saisie, une fois que vous l’avez activé. **Améliorer le prompt** n’appelle un modèle que lorsque vous cliquez sur sa baguette magique. **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. **Vérification de l’objectif** (activée par défaut) appelle un modèle une fois chaque fois que l’agent marque un `/goal` comme terminé lors d’une itération automatique. **Connexion mobile** (désactivée par défaut) accepte les connexions d’iPhone depuis votre réseau local ou votre tailnet, et seulement après que vous l’avez activée.
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau ; c’est l’app qui le gère.)
|
|
31
31
|
|
|
32
|
-
> Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.
|
|
32
|
+
> Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.14.0`.
|
|
33
33
|
|
|
34
34
|
## Fonctionnalités
|
|
35
35
|
|
|
@@ -37,10 +37,10 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
37
37
|
|
|
38
38
|
| Fonctionnalité | Utilisation | Capture d’écran |
|
|
39
39
|
|---|---|---|
|
|
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. | <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,
|
|
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. Le menu **…** d’un fichier → **Discussions qui ont modifié ce fichier** liste les discussions du même dépôt dont les outils d’écriture ou de modification ont modifié ce fichier, de la plus récente à la plus ancienne, avec la demande qui l’a fait ; un clic ouvre cette discussion à cette demande. | <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, plan du reste du README, titres des commits récents) 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. **Ouvrir une issue GitHub** sur une idée ouvre une issue avec son titre et son résumé (et pourquoi elle compte) dans le dépôt GitHub du projet, avec votre propre connexion GitHub CLI (`gh`) ; le lien **Issue #N** s’affiche ensuite à côté de l’idée et ouvre l’issue. **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
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. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Capture d’écran : Annulation de tour"></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
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
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
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> |
|
|
@@ -49,22 +49,30 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
49
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
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
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> |
|
|
52
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> |
|
|
53
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> |
|
|
54
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> |
|
|
55
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
|
+
| **Espace de travail par défaut pour Nouvelle session** | <a id="feature-defaultworkspace"></a>Réglages → Composer Plus → **Espace de travail par défaut pour Nouvelle session** → **Ouvrir Nouvelle session dans** : choisissez un projet ou **Dossier général (default-workspace)** (la valeur par défaut : le dossier de dsh `Documents/deepseek-harness/default-workspace`, créé à la première utilisation). Ensuite, **Nouvelle session** en haut de la barre latérale (et son raccourci) ouvre toujours la nouvelle discussion à cet endroit, même quand une discussion d’un autre projet est ouverte. Le `+` à côté d’un projet ouvre toujours ce projet, et le bouton de projet au-dessus de la zone de saisie de la nouvelle discussion change toujours le projet. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Capture d’écran : Espace de travail par défaut pour Nouvelle session"></a> |
|
|
59
|
+
| **Rechercher dans la discussion** | <a id="feature-findinchat"></a>Appuyez sur `Cmd+F` sur un Mac (`Ctrl+F` sous Windows et Linux) dans une discussion : un champ de recherche s’ouvre au-dessus. Tapez un mot : chaque résultat dans les messages et les réponses à l’écran est surligné, le résultat actuel dans une couleur plus forte, et le champ affiche n / total. `Enter` ou `↓` passe au résultat suivant et `Shift+Enter` ou `↑` au précédent (les boutons fléchés aussi) ; la discussion fait défiler le résultat jusqu’au milieu. Les majuscules, les accents et le ı sans point du turc ne comptent pas. `Esc` ferme le champ et remet le curseur là où il était. La recherche suit la discussion pendant qu’une réponse arrive. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Capture d’écran : Rechercher dans la discussion"></a> |
|
|
60
|
+
| **Une branche par discussion** | <a id="feature-worktreechats"></a>Nouvelle discussion → le bouton ⑂ main à côté du bouton de projet → **Nouvelle branche**, puis tapez le premier message et envoyez-le. L’IA nomme la branche (`feat/…`, `fix/…`) d’après ce message, Composer Plus crée pour elle un worktree git dans `<project>/.worktrees/`, copie les fichiers ignorés que liste `.worktreeinclude` (par exemple `.env` et `node_modules/`) et y ouvre une nouvelle discussion avec votre message. L’en-tête de la discussion ouverte affiche ⑂ branche · N modifications · ↑ ↓ (ou **non poussée**) ; cliquez dessus pour ouvrir **Modifications**. Le même menu liste les worktrees ouverts : choisissez-en un pour y lancer une discussion. Pour voir les dossiers des branches dans leur projet dans la barre latérale, choisissez dans dsh **Options d’affichage** → **Arborescence des espaces de travail**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Capture d’écran : Une branche par discussion"></a> |
|
|
56
61
|
| **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> |
|
|
57
62
|
| **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> |
|
|
58
63
|
| **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> |
|
|
59
|
-
| **
|
|
64
|
+
| **Vérification de l’objectif** | <a id="feature-goalcheck"></a>Lancez un objectif avec `/goal`. Quand l’agent marque l’objectif comme terminé lors d’une itération automatique, l’objectif ne se ferme qu’après deux vérifications. D’abord, la commande de test du projet s’exécute dans le dossier de la discussion, avec le mode sandbox de la discussion. La commande est la vôtre ou celle trouvée dans `package.json`, `Makefile`, `Cargo.toml`, `go.mod` ou pytest. Quand la dernière étape de l’agent lui-même était une exécution réussie de ce test, il n’est pas relancé. Ensuite, un appel indépendant au modèle, sans outils, lit l’objectif, cette discussion, `git status` et le résultat du test. Si une vérification échoue, l’objectif reste actif et l’agent lit pourquoi, puis l’itération suivante continue. Une ligne sous la barre de l’objectif (**Vérification de l’objectif**) affiche le test et le dernier résultat. **Modifier** définit votre propre commande de test et une limite de temps ou de tokens ; au-delà de la limite, l’objectif devient bloqué. **Lancer maintenant** lance la vérification sans fermer l’objectif. Il a son propre menu **Modèle** dans les Réglages (par défaut : **Comme le modèle de la discussion**). Quand vous terminez l’objectif vous-même, rien n’est vérifié. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Capture d’écran : Vérification de l’objectif"></a> |
|
|
65
|
+
| **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> |
|
|
60
66
|
| **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> |
|
|
67
|
+
| **Branche Git sur les lignes de discussion** | <a id="feature-sessionbranch"></a>Chaque ligne de discussion de la barre latérale affiche une petite pastille grise avec la branche git sur laquelle se trouvait le dossier du projet de la discussion lors de son dernier tour (par exemple `main` ou `feature/login` ; un HEAD détaché affiche son identifiant de commit court entre parenthèses). Deux discussions d’un même projet sur des branches différentes ne se ressemblent plus, et vous voyez tout de suite quand vous allez continuer une discussion sur la mauvaise branche. Survolez la pastille pour voir le nom complet. La partie hôte lit la branche (`git branch --show-current`, en lecture seule) au début et à la fin de chaque tour ; une discussion sans tour depuis que vous avez installé cette fonctionnalité, ou un dossier qui n’est pas un dépôt git, n’affiche pas de pastille. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Capture d’écran : Branche Git sur les lignes de discussion"></a> |
|
|
68
|
+
| **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> |
|
|
61
69
|
| **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> |
|
|
62
70
|
| **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> |
|
|
63
71
|
| **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> |
|
|
64
72
|
| **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> |
|
|
65
73
|
| **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> |
|
|
66
74
|
| **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> |
|
|
67
|
-
| **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. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Capture d’écran : Connexion mobile (iPhone)"></a> |
|
|
75
|
+
| **Connexion mobile (iPhone)** | <a id="feature-mobileconnect"></a>Utilisez dsh depuis votre iPhone avec l’app [Tether](tether/), sur le même réseau Wi-Fi ou via [Tailscale](https://tailscale.com). Activez-la dans **Réglages → Composer Plus** (elle est désactivée par défaut, car elle ouvre un port réseau sur ce Mac). Cliquez ensuite sur **Connexion mobile** en bas à gauche de la barre latérale : scannez le code QR avec l’app Appareil photo de l’iPhone (touchez **Open in Tether**) ou avec **Scan code** dans Tether, touchez **Connect** et cliquez sur **Approve**. Installez d’abord Tether : sans elle, l’app Appareil photo ne peut pas ouvrir le code. Le téléphone affiche vos discussions, envoie des messages (avec des photos : le **+** de la zone de saisie → Camera, Photos ou Paste image), répond aux approbations et aux questions, et change de modèle et d’agent. Appairez autant de Mac que vous voulez : le nom du Mac, en haut à gauche de l’app, permet de passer de l’un à l’autre. Le panneau **Connexion mobile** liste les iPhone appairés avec leur dernière connexion : **Remove** en déconnecte un tout de suite. « Tailscale only » refuse le réseau local (pour un Wi-Fi partagé), et le journal d’accès montre qui a essayé de se connecter. Dans Tether, « Settings → Privacy » verrouille l’app avec Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Capture d’écran : Connexion mobile (iPhone)"></a> |
|
|
68
76
|
| **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> |
|
|
69
77
|
|
|
70
78
|
<!-- END GENERATED FEATURES -->
|
|
@@ -73,7 +81,7 @@ Les boutons, info-bulles, messages et notifications suivent la langue choisie da
|
|
|
73
81
|
|
|
74
82
|
## Réglages
|
|
75
83
|
|
|
76
|
-
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
|
|
84
|
+
Chaque fonctionnalité peut être activée ou désactivée séparément : dsh **Réglages → Composer Plus**. Chaque ligne a une petite capture d’écran : survolez-la pour un aperçu plus grand, cliquez dessus pour l’ouvrir en taille réelle (`Esc` la ferme). La zone **Rechercher des fonctionnalités**, en haut, filtre la page par nom ou par description (dans toutes les langues, sans tenir compte de la casse ni des accents) ; `Esc` la vide. Chaque ligne a un interrupteur et une courte description ; les changements s’appliquent tout de suite, sans redémarrage, et sont mémorisés sur cet appareil. Le petit **?** après le nom d’une ligne ouvre la partie de ce README qui décrit cette fonctionnalité, dans le README de la langue de l’interface de dsh. Tout est activé par défaut, sauf **Connexion mobile**, **Reprendre après redémarrage** et **Compléter pendant la saisie**. L’hôte de dsh garde les interrupteurs de ces trois fonctionnalités, ainsi que ceux de **Recherche dans le contenu**, d’**Annulation de tour**, de **Prédiction du message suivant** et de **Vérification de l’objectif** : ils s’appliquent donc à toutes les fenêtres et restent valables après un redémarrage. L’hôte garde aussi le **Modèle** choisi pour **Prédiction du message suivant**, celui de **Compléter pendant la saisie** (par défaut **Comme la prédiction du message suivant**), celui d’**Améliorer le prompt**, celui de **Vérification de l’objectif** (tous deux par défaut **Comme le modèle de la discussion**) et la **Limite de temps** d’**Autoriser pour cette discussion** (1 heure par défaut). **Recherche dans le contenu** ne change qu’après un redémarrage de dsh (dsh lit ce réglage au démarrage) ; d’ici là, sa ligne indique **Redémarrez dsh pour appliquer ce changement.**
|
|
77
85
|
|
|
78
86
|
<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>
|
|
79
87
|
|
|
@@ -87,7 +95,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
87
95
|
|
|
88
96
|
Toute l’app change de langue immédiatement. Le choix est la préférence enregistrée par dsh lui-même, `locale.preference` (la même que Général → Langue) : il reste donc valable après un redémarrage. **Langue du système** efface ce choix : l’app de bureau suit la langue du système d’exploitation, l’interface web suit celle du navigateur, et une langue non prise en charge revient à l’anglais. L’installation du plugin ne remplace jamais une langue que vous avez déjà choisie.
|
|
89
97
|
|
|
90
|
-
Chaque pack contient 3
|
|
98
|
+
Chaque pack contient 3 280 textes : tous les textes d’interface de dsh `0.2.0-rc.2` et `0.2.1-rc.2` (discussions, barre latérale, réglages, approbations, tâches d’automatisation, aperçus de fichiers, gestionnaire de plugins, place de marché de plugins), les contrôles du plugin lui-même et le plugin populaire [dsh-rewind](https://github.com/SiriLee/dsh-rewind). Ne sont pas traduits : vos messages, les réponses du modèle, le code, les noms des commandes slash (`/plan`, `/compact`), les libellés propres aux fournisseurs comme l’effort de raisonnement `High`, les textes des autres plugins, ainsi que les menus natifs et les boîtes de dialogue de mise à jour de l’app de bureau (dsh ne les fournit qu’en anglais et en chinois). Les textes ajoutés par une version plus récente de dsh s’affichent en anglais jusqu’à la mise à jour des packs. Si un autre plugin fournit déjà une langue, cette langue reste fournie par cet autre plugin.
|
|
91
99
|
|
|
92
100
|
## Raccourcis clavier
|
|
93
101
|
|
|
@@ -107,6 +115,12 @@ Chaque pack contient 3 143 textes : tous les textes d’interface de dsh `0.2.0-
|
|
|
107
115
|
| `Tab` | zone de saisie vide avec une prédiction | placer la prédiction dans la zone de saisie |
|
|
108
116
|
| `Tab` | complétion grise après le curseur | ajouter la complétion au message |
|
|
109
117
|
| `Esc` | zone de saisie vide avec une prédiction | masquer la prédiction |
|
|
118
|
+
| `Cmd/Ctrl+Z` | zone de saisie, après **Améliorer le prompt** | rétablir le texte que vous avez tapé |
|
|
119
|
+
| `Esc` | zone de saisie, pendant l’exécution d’**Améliorer le prompt** | annuler l’amélioration |
|
|
120
|
+
| `Enter` / `Esc` | message en file d’attente sur lequel vous avez double-cliqué | enregistrer / annuler la modification |
|
|
121
|
+
| `Cmd+F` sur un Mac, `Ctrl+F` sous Windows et Linux | discussion ouverte | ouvrir **Rechercher dans la discussion** |
|
|
122
|
+
| `Enter` / `Shift+Enter`, `↓` / `↑` | champ **Rechercher dans la discussion** | résultat suivant / précédent |
|
|
123
|
+
| `Esc` | champ **Rechercher dans la discussion** | fermer le champ |
|
|
110
124
|
|
|
111
125
|
Quand un menu `/` ou `@` est ouvert, il garde ces touches pour lui.
|
|
112
126
|
|
|
@@ -119,19 +133,24 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
119
133
|
- **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.
|
|
120
134
|
- **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.
|
|
121
135
|
|
|
122
|
-
- **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.
|
|
123
|
-
- **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 --
|
|
136
|
+
- **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 liste jusqu’à 1000 branches locales et distantes et montre les 300 commits les plus récents d’une branche : sa ligne de premier parent, donc un commit de merge représente les commits qu’il a apportés. Il ne change jamais de branche (checkout). **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.
|
|
137
|
+
- **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`, …), un plan du reste du README (titres, lignes de tableau, éléments de liste ; 6 ko au plus) et les titres des commits les plus récents (`git log --format=%s`, 6 ko au plus), 28 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.
|
|
124
138
|
- **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`.
|
|
125
|
-
- **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`.
|
|
139
|
+
- **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).
|
|
140
|
+
- **Ouvrir une issue GitHub** (Idées de fonctionnalités → liste **Plus tard**) : ne s’exécute que lorsque vous cliquez dessus. La partie hôte exécute votre propre GitHub CLI (`gh issue create`) dans le dossier de la discussion, avec le titre et le résumé enregistrés de l’idée (et pourquoi elle compte) ; `gh` utilise sa propre connexion et le dépôt distant GitHub du dossier, donc l’issue va dans ce dépôt avec votre compte, et GitHub la montre à tous ceux qui peuvent voir ce dépôt. dsh retire des commandes qu’il lance les variables dont le nom ressemble à un jeton ; si vous avez donné un jeton à `gh` avec `GH_TOKEN` ou `GITHUB_TOKEN`, le plugin ne transmet que celles-ci à `gh`. Le lien de l’issue est conservé avec l’idée dans `later.json`.
|
|
141
|
+
- **Discussions qui ont modifié ce fichier** (Modifications, menu « … » d’un fichier) : la partie hôte lit les journaux des discussions dont le dossier se trouve dans le même dépôt, tels que dsh les conserve, et renvoie le titre de chaque discussion, l’heure et la première ligne de la demande ; elle n’ouvre jamais le fichier lui-même.
|
|
142
|
+
- **Branche Git sur les lignes de discussion :** la partie hôte exécute `git branch --show-current` (en lecture seule) dans le dossier de la discussion au début et à la fin de chaque tour, et ne conserve que l’identifiant de la discussion, le nom de la branche et l’heure dans `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` (fichier réservé au propriétaire, les 2000 discussions les plus récentes). L’interrupteur se trouve dans `branches.json`, à côté.
|
|
143
|
+
- **Rechercher dans la discussion** ne s’exécute que dans la page : la fonctionnalité lit le texte que la page affiche et n’envoie rien.
|
|
126
144
|
- **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.
|
|
127
145
|
- **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é.
|
|
128
|
-
- **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.
|
|
146
|
+
- **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.
|
|
129
147
|
- La revue automatique s’exécute toujours à chaque appel ; les échecs de revue ne sont jamais autorisés automatiquement.
|
|
130
|
-
- **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. Données : `$DSH_HOME/storages/dsh-composer-plus/mobile
|
|
148
|
+
- **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).
|
|
131
149
|
- **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.
|
|
132
150
|
- **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).
|
|
133
151
|
- **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).
|
|
134
152
|
- **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).
|
|
153
|
+
- **Vérification de l’objectif :** elle ne s’exécute que quand l’agent marque un `/goal` comme terminé lors d’une itération automatique (ou quand vous cliquez sur **Lancer maintenant**). La partie hôte exécute la commande de test dans le dossier de la discussion avec le mode sandbox de la discussion (comme l’outil `bash` de dsh lui-même : la même politique d’accès aux fichiers ; quand ce sandbox ne peut pas démarrer, le test ne s’exécute pas et la vérification échoue). Pour trouver la commande, elle ne lit que `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` et `pytest.ini`, comme fichiers ordinaires dans le dossier (aucun lien symbolique hors du dossier, aucune FIFO). Elle envoie ensuite l’objectif, la discussion depuis le début de l’objectif (vos messages, les réponses de l’agent, les appels d’outils coupés à 1 000 caractères et les 2 000 derniers caractères de chaque résultat d’outil ; sans raisonnement ni étapes retirées par une annulation ; environ 60 000 caractères au plus, la partie la plus récente), `git status --short` et la fin de la sortie du test au modèle choisi sous **Vérification de l’objectif** (par défaut, le modèle de la discussion), en une seule requête sans outils. La sortie des outils peut contenir ce que l’agent a lu : cette requête peut donc contenir des parties de vos fichiers, comme la discussion elle-même. Rien n’est écrit dans la discussion ni dans le projet. Votre commande de test, les limites, le dernier résultat (avec la fin de sa sortie) et le modèle choisi sont dans `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (fichier réservé au propriétaire, les 500 discussions les plus récentes).
|
|
135
154
|
|
|
136
155
|
## Dépannage
|
|
137
156
|
|
|
@@ -144,8 +163,13 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
144
163
|
- **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.
|
|
145
164
|
- **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é.
|
|
146
165
|
- **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.
|
|
166
|
+
- **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.
|
|
147
167
|
- **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).
|
|
148
|
-
- **
|
|
168
|
+
- **Ouvrir une issue GitHub indique « gh could not open the issue » :** le message est la première ligne de `gh` lui-même. Exécutez `gh auth status` dans un terminal et connectez-vous avec `gh auth login` ; le dossier de la discussion doit avoir un dépôt distant GitHub (`git remote -v`). « not installed or not on the PATH of dsh » signifie que dsh n’a pas trouvé `gh` : installez-le, ou démarrez dsh depuis un terminal où `gh` fonctionne.
|
|
169
|
+
- **Pas de pastille de branche sur une ligne de discussion :** la discussion n’a eu aucun tour depuis que vous avez installé cette version, son dossier n’est pas un dépôt git, ou **Branche Git sur les lignes de discussion** est désactivée. Après une mise à jour, redémarrez dsh (la partie hôte enregistre la branche).
|
|
170
|
+
- **Vérification de l’objectif indique que le test s’est terminé avec le code 127 ou « not found » :** dsh démarré depuis le Finder ou le Dock peut avoir un PATH plus court que votre terminal : il ne trouve donc pas `npm`, `pnpm` ou `cargo`. Démarrez dsh depuis un terminal, ou définissez votre propre commande de test avec le chemin complet sous **Vérification de l’objectif** → **Modifier**. **Lancer maintenant** affiche le résultat tout de suite.
|
|
171
|
+
- **L’objectif ne se ferme pas et l’agent continue de travailler :** **Vérification de l’objectif** a trouvé un test en échec ou du travail manquant ; la ligne sous l’objectif indique pourquoi (survolez le résultat pour voir les détails). Corrigez la cause ou la commande de test, ou terminez l’objectif vous-même avec `/goal` ou la barre de l’objectif (ce n’est pas vérifié).
|
|
172
|
+
- **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.14.0`) ; voir la note d’installation plus haut.
|
|
149
173
|
|
|
150
174
|
## Limites
|
|
151
175
|
|
|
@@ -161,17 +185,28 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
161
185
|
- **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.
|
|
162
186
|
- 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.
|
|
163
187
|
- 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.
|
|
188
|
+
- **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.
|
|
164
189
|
- **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.
|
|
165
|
-
- **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. 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.
|
|
166
|
-
- Un lien de session fonctionne dans les discussions ; un clic dessus n’ouvre pas la discussion.
|
|
190
|
+
- **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.
|
|
191
|
+
- 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.
|
|
192
|
+
- **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.
|
|
193
|
+
- **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).
|
|
194
|
+
- **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.
|
|
195
|
+
- **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.
|
|
196
|
+
- **Ouvrir une issue GitHub** a besoin de GitHub CLI (`gh`) dans le PATH de dsh et d’un dépôt distant GitHub dans le dossier de la discussion. L’action dure au plus 60 s ; si `gh` met plus longtemps, l’issue peut exister sur GitHub sans son lien dans la liste (avant de cliquer à nouveau, regardez sur GitHub : la liste ne lit le lien que d’une exécution terminée, donc un nouveau clic peut ouvrir une deuxième issue). Un dossier avec plus d’un dépôt distant GitHub utilise la valeur par défaut de `gh` lui-même (`gh repo set-default`).
|
|
197
|
+
- **Discussions qui ont modifié ce fichier** ne connaît que les outils de fichiers de dsh (`write`, `edit`, `str_replace_editor`), comme **Cette discussion** : une modification faite par une commande (`bash`) n’est pas listée. La liste lit les 300 discussions les plus récentes du dépôt (selon leur date de création) et le signale quand il y en a plus ; elle affiche au plus 100 lignes. Un fichier renommé est listé sous le nom que l’outil a écrit. Une discussion dont le dossier est hors du dépôt (y compris par un autre chemin vers les mêmes fichiers) n’est pas comptée. La première ouverture après le démarrage de dsh lit tous les journaux de discussion du dépôt (environ 4 s pour 275 discussions) ; les ouvertures suivantes ne lisent que les discussions modifiées depuis.
|
|
198
|
+
- **Branche Git sur les lignes de discussion** affiche la branche du dossier de la discussion au début ou à la fin de son dernier tour, pas la branche actuelle : un changement de branche hors d’un tour s’affiche après le tour suivant. Les discussions antérieures à cette version n’affichent pas de pastille avant leur prochain tour. La pastille se place dans le balisage des lignes de discussion de dsh (dsh n’a pas d’emplacement prévu à cet endroit) ; si une mise à jour de dsh change ce balisage, aucune pastille ne s’affiche.
|
|
199
|
+
- **Rechercher dans la discussion** ne cherche que dans ce que la page affiche : les messages et les réponses chargés (faites défiler vers le haut ou cliquez sur **Charger les précédents** pour les plus anciens), ni dans les étapes d’outil fermées, ni dans le texte replié de la sortie d’un outil. La recherche compte au plus 2 000 résultats (puis « 2000+ »). Elle utilise l’API de surlignage du navigateur (Chromium 105 et plus récent ; l’app de bureau l’a) : dans un navigateur plus ancien, le compteur et les déplacements fonctionnent sans la couleur. `Cmd+F` sur un Mac (`Ctrl+F` sous Windows et Linux) ne l’ouvre que lorsqu’une discussion est à l’écran ; ailleurs, la recherche du navigateur fonctionne comme avant. Sur un Mac, `Ctrl+F` garde son rôle macOS dans les champs de texte (le curseur avance d’un caractère).
|
|
167
200
|
- Une notification envoyée avant un redémarrage ne fait que ramener dsh au premier plan quand vous cliquez dessus.
|
|
168
201
|
- 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.
|
|
169
202
|
- 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.
|
|
170
203
|
- dsh n’a pas non plus de menu de ligne de projet ni d’emplacement dans l’en-tête Espaces de travail. **Copier le chemin** trouve la ligne du projet grâce au balisage des lignes de dsh, et **Réduire tous les projets** se place dans l’en-tête de dsh et ferme chaque projet ouvert avec le même clic que sur la ligne du projet. Si une mise à jour de dsh change ce balisage, le clic droit affiche le menu du navigateur et le bouton n’apparaît pas.
|
|
171
204
|
- 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.
|
|
205
|
+
- dsh n’a pas non plus de point d’extension qui choisit où s’ouvre **Nouvelle session**. **Espace de travail par défaut pour Nouvelle session** enveloppe une méthode de dsh qui n’est pas une API publique (`startSession` du service d’espaces de travail de dsh). Si une mise à jour de dsh la renomme, **Nouvelle session** s’ouvre là où dsh le choisit (le projet ouvert ou le plus récent). Tout appel qui ne nomme pas de projet utilise la valeur par défaut : le bouton de la barre latérale, son raccourci, le logo et aussi **Nouvelle** sur la page **Tâches d’automatisation**. dsh rouvre toujours la dernière discussion au démarrage. Le dossier général est créé et ajouté à vos projets à la première utilisation ; sous Windows ou Linux avec un dossier Documents déplacé, il peut être différent du dossier de dsh.
|
|
172
206
|
- 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.
|
|
173
207
|
- **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.
|
|
174
208
|
- **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).
|
|
209
|
+
- **Vérification de l’objectif** ne vérifie qu’un achèvement que l’agent fait lors d’une itération automatique de l’objectif : un achèvement que vous demandez dans la discussion, `/goal` et la barre de l’objectif ne sont pas vérifiés. L’agent peut modifier lui-même les tests ou les fichiers de la commande de test ; le vérificateur lit la discussion et peut le voir, mais il peut se tromper dans les deux sens (un « pas terminé » erroné coûte une itération de plus ; un « terminé » erroné ferme l’objectif). Le vérificateur voit la discussion et `git status`, pas le code lui-même. Une exécution de test n’est réutilisée que quand la dernière étape de l’agent capable de modifier des fichiers était sa propre exécution `bash` réussie d’exactement la même commande dans le même dossier ; une commande avec un pipe (`| tail`) ou `&&` n’est pas réutilisée. Le budget est mesuré à la fin d’un tour : un tour peut donc le dépasser. Seuls les appels au modèle de la discussion elle-même comptent (pas ceux de ses sous-agents). `update_goal` attend pendant la vérification (le test 15 minutes au plus, le vérificateur 3 minutes au plus). Une duplication de session reçoit un nouvel id de discussion : elle démarre donc sans la commande de test ni les limites propres de la discussion parente. Chaque achèvement qui atteint le vérificateur coûte un appel au modèle.
|
|
175
210
|
- 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).
|
|
176
211
|
|
|
177
212
|
## FAQ
|
|
@@ -198,9 +233,29 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
198
233
|
|
|
199
234
|
**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**.
|
|
200
235
|
|
|
236
|
+
**L’agent peut-il arrêter de marquer son propre travail comme terminé, comme avec les boucles de vérification de la loop engineering ?** Oui, avec **Vérification de l’objectif** (activée par défaut) : lancez un objectif avec `/goal`. Quand l’agent dit que l’objectif est terminé, les tests du projet s’exécutent et un appel indépendant au modèle vérifie l’objectif par rapport à la discussion ; si l’un des deux échoue, l’objectif reste ouvert et l’agent lit pourquoi. Définissez votre propre commande de test, une limite de temps ou une limite de tokens avec **Modifier** dans la ligne **Vérification de l’objectif** sous l’objectif.
|
|
237
|
+
|
|
201
238
|
**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 `↑` / `↓`.
|
|
202
239
|
|
|
203
|
-
**Comment
|
|
240
|
+
**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.
|
|
241
|
+
|
|
242
|
+
**Comment effacer d’un coup tous les points non lus d’un projet ?** Barre latérale → bouton **…** du projet → **Tout marquer comme lu**.
|
|
243
|
+
|
|
244
|
+
**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.
|
|
245
|
+
|
|
246
|
+
**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.
|
|
247
|
+
|
|
248
|
+
**Quelle discussion a modifié ce fichier ?** Barre latérale droite → **Modifications** → **…** du fichier → **Discussions qui ont modifié ce fichier**. Cliquez sur une ligne pour ouvrir cette discussion à la demande qui a fait la modification.
|
|
249
|
+
|
|
250
|
+
**Puis-je chercher dans une longue discussion ?** Oui : appuyez sur `Cmd+F` sur un Mac (`Ctrl+F` sous Windows et Linux) dans la discussion. **Rechercher dans la discussion** surligne chaque résultat et passe de l’un à l’autre avec `Enter` et `Shift+Enter`.
|
|
251
|
+
|
|
252
|
+
**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.
|
|
253
|
+
|
|
254
|
+
**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**.
|
|
255
|
+
|
|
256
|
+
**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.
|
|
257
|
+
|
|
258
|
+
**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.
|
|
204
259
|
|
|
205
260
|
**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.
|
|
206
261
|
|
|
@@ -214,6 +269,12 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
214
269
|
|
|
215
270
|
**Comment utiliser dsh depuis mon iPhone ?** Compilez l’app Tether depuis `tether/ios` (Xcode), activez **Réglages → Composer Plus → Connexion mobile (iPhone)**, cliquez sur **Connexion mobile** en bas à gauche, scannez le code QR (avec l’app Appareil photo de l’iPhone ou avec **Scan code** dans Tether), touchez **Connect** et cliquez sur **Approve**. Hors de chez vous, utilisez Tailscale sur les deux appareils.
|
|
216
271
|
|
|
272
|
+
**Comment ouvrir Nouvelle session toujours dans le même projet ?** Réglages → Composer Plus → **Espace de travail par défaut pour Nouvelle session** → **Ouvrir Nouvelle session dans** → choisissez le projet. Le `+` à côté d’un autre projet ouvre toujours ce projet.
|
|
273
|
+
|
|
274
|
+
**Comment travailler sur plusieurs fonctionnalités d’un même projet en même temps, chacune sur sa propre branche ?** Avec **Une branche par discussion** : nouvelle discussion → le bouton ⑂ main → **Nouvelle branche**, puis envoyez le premier message. Chaque discussion a sa propre branche et son propre dossier de worktree, avec votre `.env` et votre `node_modules` quand `.worktreeinclude` les liste. L’en-tête de la discussion indique sur quelle branche vous êtes.
|
|
275
|
+
|
|
276
|
+
**Puis-je envoyer une photo depuis mon iPhone ?** Oui. Dans une discussion Tether, touchez **+** à côté du champ de message → Camera, Photos (jusqu’à 4) ou Paste image. Les photos arrivent dans la discussion sur le Mac comme pièces jointes de votre message, donc le modèle les voit.
|
|
277
|
+
|
|
217
278
|
**Est-ce que cela fonctionne avec l’app de bureau ?** Oui : Réglages → Plugins → **Ajouter un plugin** → `dsh-composer-plus`. Testé sur dsh 0.2.0-rc.2 (bureau et web) et 0.2.1-rc.2 (web).
|
|
218
279
|
|
|
219
280
|
## Développement
|
|
@@ -250,6 +311,22 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path
|
|
|
250
311
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
|
|
251
312
|
# 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
|
|
252
313
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
|
|
314
|
+
# Goal check (fake model, made-up project): a failing test and a verifier "not done" keep the goal open, the agent's own test run is reused, a pass closes it, a token budget blocks it + its thumbnail
|
|
315
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
|
+
# Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
|
|
317
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
|
|
318
|
+
# Changes Tree (fake model, made-up git history): branch list, a branch's commits, commit files and diffs, back marks the row + its thumbnail
|
|
319
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
|
+
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
|
+
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
323
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-predict.mjs /path/to/dsh/lib/bin.js
|
|
324
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-complete.mjs /path/to/dsh/lib/bin.js
|
|
325
|
+
# Project search in a new chat: A–Z order, filter, Enter + its thumbnail
|
|
326
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path/to/dsh/lib/bin.js
|
|
327
|
+
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
253
330
|
```
|
|
254
331
|
|
|
255
332
|
```sh
|
|
@@ -260,7 +337,7 @@ npm test
|
|
|
260
337
|
|
|
261
338
|
**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).
|
|
262
339
|
|
|
263
|
-
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`.
|
|
340
|
+
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)). Le fichier [docs/ROUTES.md](docs/ROUTES.md) liste chaque route de l’hôte et sa requête, et indique si Tether peut l’appeler. `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`.
|
|
264
341
|
|
|
265
342
|
Les packs de langue sont des fichiers JSON qui ne contiennent que des données, dans `locales/<id>.json`. `npm run build:locales` les intègre au point d’entrée client unique (pas de service de traduction ni de téléchargement à l’exécution). `npm test` vérifie pour chaque pack la couverture complète des clés, des espaces réservés et des sauts de ligne identiques, ainsi que le comportement système/remplacement. Pour des vérifications isolées dans l’app réelle avec un Playwright installé localement :
|
|
266
343
|
|