dsh-composer-plus 1.15.0 → 1.16.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 +67 -14
- package/README.es.md +67 -14
- package/README.fr.md +67 -14
- package/README.hi.md +67 -14
- package/README.id.md +67 -14
- package/README.ja.md +67 -14
- package/README.ko.md +67 -14
- package/README.md +67 -14
- package/README.pt-BR.md +67 -14
- package/README.ru.md +67 -14
- package/README.tr.md +67 -14
- package/README.vi.md +67 -14
- package/README.zh.md +67 -14
- package/assets/features/autoBackup.webp +0 -0
- package/assets/features/backup.webp +0 -0
- package/assets/features/branchTree.webp +0 -0
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/idleSwitch.webp +0 -0
- package/assets/features/projectMemory.webp +0 -0
- package/assets/features/questionFit.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/assets/features/rescueConsole.webp +0 -0
- package/assets/features/sessionDoctor.webp +0 -0
- package/assets/features/stopSendFirst.webp +0 -0
- package/backup.mjs +1069 -0
- package/client.js +1218 -175
- package/index.js +1573 -36
- package/package.json +3 -2
- package/tether/gateway/server.mjs +1 -1
package/README.fr.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau ; c’est l’app qui le gère.)
|
|
31
31
|
|
|
32
|
-
> Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.
|
|
32
|
+
> Le pnpm de dsh ignore les versions publiées depuis moins de 24 heures. Juste après une nouvelle version, ajoutez le numéro de version : `dsh-composer-plus@1.16.0`.
|
|
33
33
|
|
|
34
34
|
## Fonctionnalités
|
|
35
35
|
|
|
@@ -37,7 +37,7 @@ 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**.
|
|
40
|
+
| **Panneau des modifications** | <a id="feature-changespanel"></a>Barre latérale droite → `+` → **Modifications**. La page s’ouvre sur **Arbre** : une carte des branches du dépôt de la discussion. Trois tuiles comptent les branches : toutes, les branches fusionnées et celles qui attendent une fusion. Cliquez sur une tuile pour n’afficher que ces branches ; cliquez de nouveau dessus pour toutes les afficher. Chaque branche est une boîte avec son dernier commit : verte quand la branche principale contient son travail, orange sinon, bleue pour la branche principale. Une flèche va de chaque branche vers la branche qui l’a intégrée (✅ **Fusionnée**) ou vers la branche dont elle est partie (⏳ **En attente**, en pointillés). Cliquez sur une boîte pour voir les commits de la branche, puis sur un commit pour voir ses fichiers et leurs diffs. Cliquez sur **Fusionnée** pour voir les fichiers du commit de fusion, ou sur **En attente** pour voir les fichiers que la branche apporte dans sa cible. Une branche distante ne s’affiche que si aucune branche locale n’a le même nom. Dans le menu des modes, 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. **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
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
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> |
|
|
@@ -46,10 +46,12 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
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> |
|
|
47
47
|
| **Mode plan avec Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` ajoute `/plan ` au début du brouillon (appuyez de nouveau pour le retirer). Si la discussion est déjà en mode plan, `Shift+Tab` quitte ce mode. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Capture d’écran : Mode plan avec Shift+Tab"></a> |
|
|
48
48
|
| **Garder le focus dans la zone de saisie** | <a id="feature-keepfocus"></a>Après l’envoi d’une commande `/` ou d’une compétence, le curseur reste dans la zone de saisie et vous pouvez taper de nouveau tout de suite. Cela fonctionne aussi pour les macros clavier qui tapent une commande et appuient sur `Enter`. dsh met la zone de saisie en lecture seule pendant qu’il résout la commande, et le navigateur retire alors le focus. Cette fonctionnalité remet le focus, sauf si un menu, une boîte de dialogue ou un autre champ l’a. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Capture d’écran : Garder le focus dans la zone de saisie"></a> |
|
|
49
|
+
| **Adapter la carte de question à la fenêtre** | <a id="feature-questionfit"></a>Quand l’agent vous pose une question, la question et ses réponses défilent ensemble dans la carte, et **Ignorer** et **Envoyer** restent visibles en bas. La carte utilise la hauteur de la fenêtre (moins 200 px pour l’en-tête de la conversation et une bande de la conversation) : elle grandit et rétrécit avec la fenêtre. Sans cette fonctionnalité, dsh limite la carte à 60 % de la fenêtre (520 px au plus) et seules les réponses défilent : une longue question peut pousser sa propre fin, les réponses et les boutons hors de la carte. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Capture d’écran : Adapter la carte de question à la fenêtre"></a> |
|
|
49
50
|
| **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
51
|
| **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
52
|
| **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
|
|
53
|
+
| **Modifier sur place un message en file d’attente** | <a id="feature-queueedit"></a>Double-cliquez sur un message en file d’attente, ou cliquez sur son bouton Modifier (**Modifier le message en file d’attente**). Un éditeur s’ouvre dans la ligne : modifiez le texte, supprimez une image ou un fichier avec son ✕, ou ajoutez-en de nouveaux avec le trombone (**Ajouter des images ou des fichiers**) ou en collant une image. `Enter` enregistre, `Esc` annule et `Shift+Enter` ajoute une ligne. Le message garde sa place dans la file, et les images et fichiers que vous gardez ne changent pas. Tant que l’éditeur est ouvert, la file ne peut pas être réordonnée. Dans Tether : menu du message en file d’attente → Edit. | <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> |
|
|
54
|
+
| **Priorité au message envoyé après Arrêter** | <a id="feature-stopsendfirst"></a>Activée par défaut. Arrêtez une discussion pendant que des messages attendent dans sa file, puis envoyez un nouveau message : il s’exécute tout de suite, seul. Les messages en file gardent leur ordre et s’exécutent après lui, un par tour. Sans cela, dsh ajoute le nouveau message à la fin de la file et exécute à sa place le premier message en file, si bien que le nouveau s’exécute en dernier. Un message envoyé pendant que la discussion travaille attend toujours à la fin de la file. | <a href="assets/features/stopSendFirst.webp"><img src="assets/features/stopSendFirst.webp" width="160" alt="Capture d’écran : Priorité au message envoyé après Arrêter"></a> |
|
|
53
55
|
| **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
56
|
| **Copier le lien du message** | <a id="feature-copymessagelink"></a>Survolez un message et cliquez sur **🔗** (dans sa ligne d’actions ; pour une réponse, à côté de l’heure). Le lien est le lien de session suivi du numéro du message : `dsh-session:…#42`. Collez-le dans un message et envoyez-le : à partir de dsh 0.2.1, le lien s’affiche comme une pastille. Un clic ouvre cette discussion, fait défiler jusqu’au message et le met en évidence pendant 2 secondes. Comme un lien de session, il joint aussi cette discussion comme contexte en lecture seule. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Capture d’écran : Copier le lien du message"></a> |
|
|
55
57
|
| **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> |
|
|
@@ -57,23 +59,30 @@ Redémarrez ensuite dsh. (La CLI ne peut pas installer dans le profil de bureau
|
|
|
57
59
|
| **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
60
|
| **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
61
|
| **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>
|
|
62
|
+
| **Une branche par discussion** | <a id="feature-worktreechats"></a>Sur l’écran de nouvelle discussion, le bouton de branche (icône de branche) entre le bouton de projet et le bouton de mode affiche **Nouvelle branche** par défaut. Tapez le premier message et envoyez-le. Pour rester sur la branche actuelle, choisissez « Branche actuelle (main) » dans le même bouton. Le premier message peut contenir des images et des fichiers. En mode plan, la nouvelle discussion démarre aussi en mode plan : envoyez le message sous la forme `/plan <message>` (Shift+Tab), ou mettez d’abord Nouvelle discussion en mode plan. 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> |
|
|
63
|
+
| **Branches dans l’arborescence des espaces de travail** | <a id="feature-branchtree"></a>Réglages → Composer Plus → **Branches dans l’arborescence des espaces de travail** (désactivé par défaut). Chaque branche qui a un dossier de worktree dans `<project>/.worktrees/` s’affiche alors comme un projet dans son projet ; choisissez **Options d’affichage** → **Arborescence des espaces de travail** de dsh pour la voir imbriquée. Une branche dont le dossier est supprimé quitte la liste, et dsh affiche ses discussions sous **Sans groupe**. Quand l’agent d’une discussion dans le dossier du projet crée une branche et passe dessus (`git switch -c`, `git checkout -b`) sans modification non validée dans le dossier, le dossier du projet revient à sa branche précédente, la branche reçoit son propre dossier et la discussion y va : une copie s’ouvre dans le projet de la branche et continue la tâche, et l’ancienne discussion est archivée. La liste est vérifiée au démarrage, toutes les 30 secondes, après chaque tour et quand vous revenez à la fenêtre. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Capture d’écran : Branches dans l’arborescence des espaces de travail"></a> |
|
|
61
64
|
| **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> |
|
|
62
65
|
| **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> |
|
|
63
66
|
| **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> |
|
|
64
67
|
| **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> |
|
|
68
|
+
| **Mémoire du projet** | <a id="feature-projectmemory"></a>Désactivée par défaut : activez-la dans **Réglages → Composer Plus**. Chaque dossier de projet a sa propre mémoire, que les discussions suivantes de ce projet lisent, comme DS Bot en garde une par Bot. Après chaque tour terminé, un appel au modèle de la discussion lit les nouveaux messages (pas ceux annulés), garde vos préférences, décisions et faits durables sous forme de notes courtes, et modifie ou supprime les anciennes. L’agent peut aussi enregistrer, supprimer et chercher des notes lui-même (`memory_remember`, `memory_forget`, `memory_recall`). Une note peut aussi être globale : tous les projets la lisent. Une nouvelle discussion reçoit les notes dans son prompt système ; une note enregistrée plus tard apparaît à partir de la discussion suivante. Les fichiers sont en Markdown dans le dossier personnel de dsh (`storages/dsh-composer-plus/memory/`), jamais dans le dossier du projet. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Capture d’écran : Mémoire du projet"></a> |
|
|
65
69
|
| **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> |
|
|
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> |
|
|
70
|
+
| **Statut du projet** | <a id="feature-projectstatus"></a>La ligne d’un projet dans la barre latérale affiche le même indicateur en cours / en attente / terminé que ses discussions : même replié, un projet vous indique donc qu’une discussion travaille ou a besoin de vous. Une discussion qui vous attend s’affiche en premier, puis une discussion terminée que vous n’avez pas encore ouverte (le point vert, même pendant qu’une autre discussion est encore en cours), puis l’indicateur en cours. Survolez-le pour voir les détails. Dans **Arborescence des espaces de travail**, la ligne d’un dossier parent affiche aussi les discussions de chaque projet qu’il contient (par exemple chaque dossier de branche dans `.worktrees/`), même quand il est replié. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Capture d’écran : Statut du projet"></a> |
|
|
67
71
|
| **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. Si la ligne de projet au-dessus de la discussion porte le même nom que la branche (par exemple un dossier « Une branche par discussion »), la ligne de discussion n’affiche pas de pastille, mais « Dans une seule liste » l’affiche toujours. | <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
72
|
| **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> |
|
|
69
73
|
| **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> |
|
|
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> |
|
|
74
|
+
| **Filtre des projets récents** | <a id="feature-recentprojects"></a>Barre latérale → options d’affichage (icône de curseurs) → **Actifs au cours des 2 dernières heures**. Tant que cette option est sélectionnée, la barre latérale n’affiche que les projets qui ont une discussion active au cours des 2 dernières heures : une discussion mise à jour pendant ce temps, une discussion en cours ou en attente, la discussion ouverte, ou une discussion terminée que vous n’avez pas encore ouverte (le point vert « terminé » de dsh), même après les 2 heures. Les projets sans une telle discussion sont masqués, y compris les projets nouveaux et vides. Dans **Arborescence des espaces de travail**, un dossier parent reste affiché tant qu’un projet qu’il contient est actif, et les discussions qui n’ont pas été actives au cours des 2 dernières heures sont aussi masquées, si bien que seules les discussions récentes sont affichées. Sélectionnez de nouveau l’option pour afficher tous les projets. Le choix est conservé sur cet appareil. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Capture d’écran : Filtre des projets récents"></a> |
|
|
71
75
|
| **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> |
|
|
72
76
|
| **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> |
|
|
73
77
|
| **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> |
|
|
78
|
+
| **Ouvrir la discussion en attente en cas d’inactivité** | <a id="feature-idleswitch"></a>Quand une discussion pose une question ou attend une approbation ou une revue du plan (le point orange) et que vous n’utilisez pas dsh pendant 30 secondes, dsh ouvre cette discussion. Si plusieurs discussions attendent, celle qui attend depuis le plus longtemps s’ouvre en premier ; la suivante s’ouvre après 30 autres secondes sans utilisation. Une touche, un clic, un mouvement de souris, la molette ou un toucher relancent les 30 secondes. Du texte dans le champ qui a le focus, du texte sélectionné, ou un menu ou une boîte de dialogue ouverts empêchent aussi le changement. Tant qu’une discussion en attente est à l’écran, rien ne change. Si vous quittez une discussion en attente sans répondre, elle peut se rouvrir après les 30 secondes suivantes sans utilisation. Cela fonctionne aussi quand dsh est en arrière-plan, mais dsh ne passe pas au premier plan. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Capture d’écran : Ouvrir la discussion en attente en cas d’inactivité"></a> |
|
|
74
79
|
| **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> |
|
|
75
80
|
| **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> |
|
|
76
81
|
| **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> |
|
|
82
|
+
| **Sauvegarde** | <a id="feature-backup"></a>Réglages → Composer Plus → **Sauvegarde** → **Sauvegarder maintenant** écrit tout votre dossier personnel de dsh (discussions, réglages, plugins, MCP, compétences) dans une seule archive dans `~/Desktop/dsh-backups`, avec une somme de contrôle. Les secrets sont masqués dans l’archive : les fichiers d’identifiants, les fichiers de clés (`.pem`, `.key`) et les valeurs token, secret et password des réglages yml restent uniquement sur cet ordinateur, dans le `vault` du dossier. `cache/`, `dsh-runtimes/` et `node_modules` ne vont pas dans l’archive (dsh les recrée). Chaque sauvegarde de la liste a **Vérifier** (la lit entièrement), **Pour un autre ordinateur** (un dossier à copier sur le nouvel ordinateur, avec la console de secours) et **Supprimer**. Les archives de dsh-backup dans le même dossier s’affichent et fonctionnent aussi. Pour restaurer, quittez dsh et utilisez la console de secours. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Capture d’écran : Sauvegarde"></a> |
|
|
83
|
+
| **Sauvegarde automatique** | <a id="feature-autobackup"></a>Activez **Sauvegarde automatique** (désactivée par défaut : chaque copie est à peu près aussi grande que votre dossier personnel de dsh sans son cache). Choisissez la fréquence (**Toutes les** : de 6 heures à 7 jours, 24 heures par défaut) et le nombre de sauvegardes conservées (**Conserver** : de 3 à 14, 7 par défaut). L’heure de la prochaine sauvegarde s’affiche sous l’interrupteur ; une sauvegarde qui a échoué s’y affiche aussi et est relancée 30 minutes plus tard. Quand dsh ou Composer Plus démarre avec une nouvelle version, un instantané est pris peu après le démarrage, avant que la nouvelle version ait longtemps utilisé vos données (les deux plus récents restent, marqués **Avant une mise à niveau**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Capture d’écran : Sauvegarde automatique"></a> |
|
|
84
|
+
| **Vérification des journaux de session** | <a id="feature-sessiondoctor"></a>**Vérifier les journaux de session** lit le journal de chaque discussion et liste ceux que dsh ne peut pas ouvrir (une trame cassée, un enregistrement coupé, un mauvais numéro de séquence). Une fin incomplète n’est pas listée : dsh la répare lui-même. **Réparer depuis les sauvegardes** remet la copie de la sauvegarde la plus récente qui en contient une saine et garde le fichier endommagé à côté (`.corrupt-<heure>`). Les messages écrits après cette sauvegarde ne sont pas dans la copie. Une discussion ouverte dans ce dsh n’est pas réparée ici : quittez dsh et réparez-la dans la console de secours. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Capture d’écran : Vérification des journaux de session"></a> |
|
|
85
|
+
| **Console de secours** | <a id="feature-rescueconsole"></a>Chaque sauvegarde place aussi une console de secours dans le dossier de sauvegarde. Quand dsh est fermé ou ne démarre pas, ouvrez `Composer Plus Rescue` dans ce dossier (macOS : `Composer Plus Rescue.command`) : un menu dans une fenêtre de terminal liste, vérifie et restaure les sauvegardes, et vérifie et répare les journaux de session. Elle n’ouvre aucun port réseau. Une restauration vous demande de taper `RESTORE`, garde votre dossier personnel de dsh actuel sous le nom `.dsh.pre-restore-<heure>`, remet les secrets masqués depuis le vault et déplace `cache/`, `dsh-runtimes/` et `node_modules` depuis l’ancien dossier. Elle fonctionne sans dsh : elle utilise Node.js, ou l’app DeepSeek Harness elle-même. Sur un nouvel ordinateur, copiez le dossier de **Pour un autre ordinateur** et ouvrez `Composer Plus Rescue` à cet endroit. | <a href="assets/features/rescueConsole.webp"><img src="assets/features/rescueConsole.webp" width="160" alt="Capture d’écran : Console de secours"></a> |
|
|
77
86
|
|
|
78
87
|
<!-- END GENERATED FEATURES -->
|
|
79
88
|
|
|
@@ -117,7 +126,7 @@ Chaque pack contient 3 280 textes : tous les textes d’interface de dsh `0.2.0-
|
|
|
117
126
|
| `Esc` | zone de saisie vide avec une prédiction | masquer la prédiction |
|
|
118
127
|
| `Cmd/Ctrl+Z` | zone de saisie, après **Améliorer le prompt** | rétablir le texte que vous avez tapé |
|
|
119
128
|
| `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
|
|
129
|
+
| `Enter` / `Esc` | éditeur du message en file d’attente | enregistrer / annuler la modification |
|
|
121
130
|
| `Cmd+F` sur un Mac, `Ctrl+F` sous Windows et Linux | discussion ouverte | ouvrir **Rechercher dans la discussion** |
|
|
122
131
|
| `Enter` / `Shift+Enter`, `↓` / `↑` | champ **Rechercher dans la discussion** | résultat suivant / précédent |
|
|
123
132
|
| `Esc` | champ **Rechercher dans la discussion** | fermer le champ |
|
|
@@ -151,6 +160,9 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
151
160
|
- **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).
|
|
152
161
|
- **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
162
|
- **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).
|
|
163
|
+
- **Mémoire du projet :** désactivée tant que vous ne l’activez pas. Quand elle est activée, après chaque tour terminé d’une discussion de premier niveau, la partie Host envoie les nouveaux messages de la discussion depuis la dernière revue (vos messages et les réponses texte de l’agent ; pas de sortie d’outils, pas de raisonnement, pas de contexte caché, pas de messages annulés ; la copie de la discussion parente dans une discussion dérivée est laissée de côté ; au plus environ 16 000 caractères) et les notes enregistrées au modèle de la discussion, en une seule requête sans outils. Les notes sont des fichiers Markdown dans `$DSH_HOME/storages/dsh-composer-plus/memory/` (fichiers réservés au propriétaire) : `projects/<id>/` pour chaque dossier de projet (`<id>` est un hash du chemin réel du dossier ; `project.json` indique le dossier), `global/`, `journal.jsonl` (chaque modification avec la ligne avant et après) et `reviewed.json` (jusqu’où chaque discussion a été lue). Rien n’est écrit dans le dossier du projet. Les notes qui ressemblent à une clé, un jeton, un mot de passe ou un numéro d’identité sont refusées. Les notes d’un projet entrent dans le prompt système de chaque nouvelle discussion de ce dossier : elles vont donc au modèle avec chaque requête de cette discussion. L’interrupteur est dans `memory.json`, au même endroit.
|
|
164
|
+
- **Sauvegarde :** rien ne quitte votre machine. Les archives vont dans `~/Desktop/dsh-backups` (fichiers réservés au propriétaire). Les secrets ne sont pas dans une archive : les fichiers d’identifiants (`.credentials.yaml`, `.env`), les fichiers de clés (`.pem`, `.key`, `.p12`, `.pfx`) et les valeurs des réglages token, secret, password et clé d’API des fichiers yml sont masqués ; leurs vraies copies restent dans `composer-plus-vault/<archive>/`, dans le même dossier (réservé au propriétaire), sur cet ordinateur uniquement. **Pour un autre ordinateur** ne copie aucun vault : saisissez de nouveau ces secrets là-bas. Vos journaux de discussion, vos réglages et le reste du dossier personnel de dsh sont dans l’archive tels quels : gardez le dossier privé, comme `$DSH_HOME` lui-même. La sauvegarde lit les fichiers avec `O_NOFOLLOW | O_NONBLOCK` ; un lien symbolique est enregistré comme lien (jamais suivi) et une FIFO ou un périphérique est ignoré. L’interrupteur et les réglages de la sauvegarde automatique sont dans `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, l’interrupteur de la console de secours dans `rescue-console.json`, et pendant que dsh tourne, `running/host-<pid>.json` désigne chaque processus dsh (la console de secours les lit pour refuser une restauration).
|
|
165
|
+
- **Console de secours :** un menu dans un terminal ; elle n’ouvre aucun port réseau. Une restauration écrit uniquement dans un nouveau dossier à côté du dossier personnel de dsh (fichiers avec `O_EXCL | O_NOFOLLOW`, liens symboliques en dernier et jamais suivis) et refuse une archive qui contient un nom dangereux (`..`, un chemin absolu), un périphérique ou une FIFO, plus d’un dossier de premier niveau ou une entrée sous un lien.
|
|
154
166
|
|
|
155
167
|
## Dépannage
|
|
156
168
|
|
|
@@ -165,11 +177,15 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
165
177
|
- **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
178
|
- **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.
|
|
167
179
|
- **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).
|
|
180
|
+
- **La file d’attente est vide après un redémarrage :** dsh vide lui-même la file d’attente quand il se ferme. Reprendre après redémarrage ne la remet que dans une discussion qu’il reprend ; dans les autres, renvoyez les messages. Un message supprimé juste avant la fermeture peut revenir : supprimez-le de nouveau.
|
|
168
181
|
- **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
182
|
- **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
183
|
- **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
184
|
- **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.
|
|
185
|
+
- **L’installation échoue juste après une nouvelle version :** ajoutez la version (`dsh-composer-plus@1.16.0`) ; voir la note d’installation plus haut.
|
|
186
|
+
- **Sauvegarder maintenant indique « Une autre action de sauvegarde est en cours » :** une action tourne dans une autre fenêtre de dsh ou dans la console de secours (elles partagent un fichier de verrou, `.composer-plus.lock`, dans le dossier de sauvegarde). Attendez qu’elle se termine. Si aucune action ne tourne, le verrou d’un processus fermé est repris au clic suivant.
|
|
187
|
+
- **La console de secours indique « dsh is running » :** quittez d’abord dsh. Si dsh est vraiment fermé, le fichier nommé dans le message reste d’un plantage : supprimez-le et réessayez.
|
|
188
|
+
- **Après une restauration, dsh ne démarre pas ou un plugin manque :** les paquets de plugins d’un profil doivent être réinstallés. La console de secours le propose après une restauration ; sinon, exécutez `pnpm install` dans chaque dossier sous `$DSH_HOME/profiles/` qu’elle liste. Les secrets qui n’étaient pas dans le vault (autre ordinateur) doivent être saisis de nouveau : la console les liste.
|
|
173
189
|
|
|
174
190
|
## Limites
|
|
175
191
|
|
|
@@ -177,6 +193,7 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
177
193
|
- **Idées de fonctionnalités** garde les cartes en mémoire pour chaque discussion jusqu’au rechargement de dsh ou de la page ; ensuite, **Suggérer des fonctionnalités** interroge de nouveau le modèle. Les cartes arrivent dans la langue d’interface de dsh au moment du clic ; si vous changez de langue, les cartes déjà dans la pile gardent la leur et **Plus d’idées** utilise la nouvelle. Le modèle ne voit que le court résumé du projet, pas le code : une idée peut donc répéter une chose que le projet a déjà ; ignorez-la. La nouvelle discussion s’exécute en mode plan seulement si le profil a la commande `/plan` de dsh ; sinon, l’idée part comme un premier message ordinaire. La liste **Plus tard** appartient au chemin du dossier de la discussion : le même dossier ouvert via un lien symbolique a sa propre liste. Elle garde au plus 50 idées par projet (retirez-en une pour en ajouter d’autres) et un même titre une seule fois. Faire glisser une carte décide seulement entre gauche et droite ; utilisez **↓** pour la garder et **▶** pour la créer maintenant. Une répétition est détectée par son titre seulement : le modèle peut encore suggérer une idée déjà vue sous un autre nom ; ignorez-la. Quand le modèle ne répond que par des idées déjà vues, rien de nouveau ne s’affiche : cliquez de nouveau. Un thème ciblé étroit rend cela plus probable ; utilisez un thème plus large ou effacez-le. Le thème ciblé reste dans le champ pour chaque discussion jusqu’au rechargement de dsh ou de la page.
|
|
178
194
|
- **Exporter la discussion en Markdown** ne contient que vos propres messages et les réponses texte de l’assistant : les appels d’outils et leur sortie, le raisonnement, les images (une ligne `[image]` les signale), le contexte caché et les messages que l’Annulation de tour ou dsh-rewind-plugin a retirés sont laissés de côté. Les réponses d’un même tour sont réunies en une seule section. Un export contient au plus environ 4 millions de caractères ; une discussion plus longue donne sa première partie et une note.
|
|
179
195
|
- **Reprendre après redémarrage** continue le tour ; il ne le rejoue pas. Un appel d’outil en cours au moment de la fermeture se termine avec le résultat « inconnu » de dsh, et le modèle reçoit la consigne de ne pas refaire le travail terminé ; mais une commande qu’il est risqué d’exécuter deux fois peut s’exécuter de nouveau. Les sous-agents, approbations et questions ouverts ne sont pas restaurés : leur discussion parente continue et pose de nouveau la demande. Au plus 20 discussions reprennent à un même démarrage.
|
|
196
|
+
- **Reprendre après redémarrage** et la file d’attente : dsh vide la file d’attente d’une discussion quand il se ferme. Le plugin remet vos messages en attente à partir du journal de la discussion, avec leur ordre, leurs modifications, leurs images et leurs fichiers ; ils s’exécutent après le tour repris. Seules les discussions qui reprennent retrouvent leur file (interrupteur activé, fermeture pendant le tour). dsh enregistre de la même façon la suppression par vous des derniers messages en attente : si vous les supprimez et que dsh se ferme avant le début de l’étape suivante, ils reviennent.
|
|
180
197
|
|
|
181
198
|
- **Recherche dans le contenu** est la recherche de dsh lui-même : elle a donc les limites de dsh. Elle ne cherche que dans les messages de l’utilisateur et de l’assistant : pas dans la sortie des outils (commandes, contenu des fichiers, résultats), pas dans le raisonnement, et elle n’a pas de filtre par message utilisateur, assistant ou outil. Elle trouve des mots entiers, pas des parties de mot (`deploy` ne trouve pas `deployment`) ; les lettres accentuées correspondent aussi sans accent (`seker` trouve `şeker`). Une ligne par discussion, avec l’extrait de 240 caractères de dsh, 20 lignes au plus.
|
|
182
199
|
- **Recherche dans le contenu** : coût mesuré sur une copie de 247 vrais journaux de discussion (159 Mo, dsh 0.2.1-rc.2, Apple Silicon, 32 Go). La première recherche après un démarrage crée l’index en environ 15 s. Pendant ce temps, l’hôte de dsh ne répond plus pendant environ 7 s : les autres discussions arrêtent donc leur flux pendant ce moment (la page elle-même ne se fige pas). La mémoire de l’hôte augmente d’environ 1,1 Go au pic ; une minute plus tard, elle reste encore environ 0,5–0,6 Go au-dessus du niveau de départ, jusqu’à la fermeture de dsh. Le fichier d’index fait environ 165 Mo. Les recherches suivantes prennent environ 0,5 s. Après un redémarrage, la première recherche prend environ 1 s (seules les discussions nouvelles ou modifiées sont ajoutées) et ajoute environ 70 Mo. Désactivez-la si votre ordinateur a peu de mémoire.
|
|
@@ -187,19 +204,25 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
187
204
|
- 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
205
|
- **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.
|
|
189
206
|
- **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.
|
|
190
|
-
- **
|
|
207
|
+
- **Adapter la carte de question à la fenêtre** ne modifie que la carte de question de dsh, pas la carte de revue du plan. Elle trouve la carte grâce au balisage de dsh (`data-question-key`, `data-question-scroll`) ; si une mise à jour de dsh change ce balisage, la carte s’affiche comme dsh la dessine. La hauteur de la carte suit la fenêtre, pas la conversation : dans une conversation affichée dans un panneau latéral étroit, une carte haute peut encore dépasser le haut de la conversation.
|
|
208
|
+
- **Connexion mobile** ne fonctionne que sur macOS (elle utilise `en0`, `openssl`, `swift` et `dns-sd`). Elle utilise les ports fixes 19390 et 19391 : un seul dsh par Mac peut donc l’exécuter à la fois (chaque Mac est une entrée dans la liste des Mac du téléphone). Le téléphone ne reçoit des notifications que lorsque Tether est ouvert ou vient de passer en arrière-plan (pas de service push). Tether ne les envoie qu’après que vous avez activé « Settings → Notifications → Send notifications » dans Tether. Cette option est désactivée par défaut, et iOS demande l’autorisation quand vous l’activez. L’app iOS n’est pas encore sur l’App Store : compilez-la depuis `tether/ios` avec Xcode. « Tailscale only » demande quand même une adresse Wi-Fi ou Ethernet sur le Mac (la passerelle ne démarre qu’avec une telle adresse). Le journal d’accès est propre à chaque Mac et ne garde que les 200 tentatives les plus récentes ; une tentative répétée en moins d’une minute augmente de un le compteur de la même ligne. Le verrouillage de Tether ne masque pas les aperçus des notifications sur l’écran verrouillé de l’iPhone : désactivez-les dans les Réglages d’iOS. Les points verts de Tether suivent le Mac : une conversation que vous ouvrez dans dsh perd aussi son point sur le téléphone. Une conversation que vous ouvrez dans Tether perd son point seulement sur les téléphones. Le point de dsh sur le Mac reste jusqu’à ce que vous ouvriez la conversation sur le Mac.
|
|
191
209
|
- 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
210
|
- **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**
|
|
211
|
+
- **Modifier sur place un message en file d’attente** ne change pas un message dont l’envoi a commencé entre-temps et n’écrase pas un message modifié entre-temps (par exemple dans Tether sur l’iPhone) : un avis le signale. Une nouvelle image demande un modèle qui accepte les images (les limites d’image propres à dsh s’appliquent), et un nouveau fichier doit finir de se téléverser avant que vous puissiez enregistrer. Seuls vos propres messages en file d’attente peuvent être modifiés : pas une itération d’objectif ni une réponse à une question dans la file. Après une mise à jour du plugin, seules les modifications de texte fonctionnent tout de suite : redémarrez dsh avant d’enregistrer un message avec des images ou des fichiers (la partie hôte se charge au démarrage).
|
|
194
212
|
- **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.
|
|
213
|
+
- La carte des branches de la vue **Arbre** devine où va chaque flèche, car git n’enregistre pas la branche dans laquelle une branche est fusionnée. Une branche fusionnée pointe vers la branche dont le commit de fusion l’a intégrée en premier. Une branche en attente pointe vers la branche la plus proche dont elle est partie (la branche principale d’abord) ; quand deux branches sont parties du même commit, la carte peut choisir la mauvaise. Une branche qui a avancé par fast-forward n’a pas de commit de fusion, donc son libellé **Fusionnée** n’ouvre rien. La branche principale est la branche par défaut de `origin`, sinon `main` ou `master`, sinon la branche ouverte. La carte lit les 20 000 commits les plus récents et affiche au plus 60 branches ; dans un historique plus long, elle signale que certaines flèches peuvent être fausses. Une branche fusionnée par squash ou rebase (par exemple sur GitHub) apparaît comme **En attente** : git ne garde aucun lien avec ses commits.
|
|
195
214
|
- **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
215
|
- **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
216
|
- **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
217
|
- **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. Si la ligne de projet au-dessus de la discussion porte le même nom que la branche (par exemple un dossier « Une branche par discussion »), la ligne de discussion n’affiche pas de pastille, mais « Dans une seule liste » l’affiche toujours.
|
|
218
|
+
- **Une branche par discussion** en mode plan : dsh envoie `/plan <message>` comme une commande, pas comme un message, donc Composer Plus intercepte l’envoi de la commande dans la zone de saisie de dsh (pas une API publique). Si une mise à jour de dsh change cela, `/plan <message>` avec **Nouvelle branche** choisie s’exécute dans la Nouvelle discussion ouverte comme commande propre à dsh. Quand l’hôte ne peut pas activer le mode plan dans la nouvelle discussion, le dossier de la branche reste et le message n’est pas envoyé : la nouvelle discussion ne modifie donc pas de fichiers dans le mode par défaut.
|
|
219
|
+
- **Une branche par discussion** : quand le dossier de branche d'une discussion (`<project>/.worktrees/<name>`) est supprimé, par exemple quand l'agent de la discussion retire le worktree et supprime la branche, l'étape suivante de la discussion la sort de ce dossier. Le projet du dossier de branche disparaît de la barre latérale, et la discussion apparaît sous Sans groupe et reste ouverte. Avec dsh 0.2.1 et plus, la discussion continue dans le dossier principal du projet, et le modèle reçoit une note sur le nouveau dossier. Avec dsh 0.2.0, la discussion garde le dossier supprimé : une commande y échoue jusqu'à ce que vous commenciez une nouvelle discussion. Le déplacement a lieu seulement à l'étape suivante de la discussion : le projet d'une branche supprimée qu'aucune discussion n'utilise reste donc dans la barre latérale. Retirez-le avec le menu de projet de dsh. Pendant qu'une discussion se déplace, **Nouvelle branche** dans le même dépôt répond « réessayez ». Interrupteur désactivé, l'erreur de dsh revient (« working-directory: directory does not exist »).
|
|
220
|
+
- **Branches dans l’arborescence des espaces de travail** écrit dans git sans clic : quand il déplace une discussion, il remet le dossier du projet sur sa branche précédente (`git switch`) et ajoute un worktree (`git worktree add`). Il ne supprime jamais une branche, un worktree ni un fichier. dsh ne peut pas changer le dossier d’une discussion : une discussion déplacée est donc une copie (le fork propre à dsh, avec un nouvel id) et l’ancienne discussion est archivée. La copie reprend la tâche arrêtée ; un appel d’outil en cours quand la branche est apparue se termine par un refus, et l’agent le relance dans le nouveau dossier. Un objectif de l’ancienne discussion ne suit pas. Seule une discussion dont le dossier est le dossier principal du dépôt est déplacée, et seulement pour une branche qu’elle a créée et sur laquelle elle est passée pendant ce tour (`git switch -c`, `git checkout -b`) : une branche créée avec `git branch` seul, un dossier avec des modifications non validées, un worktree lié ou un sous-dossier ne déplacent rien. Seuls les worktrees placés directement dans `<project>/.worktrees/` et liés à une branche apparaissent dans l’arborescence ; un worktree détaché ou placé ailleurs n’apparaît pas. La copie ne s’ouvre d’elle-même que si sa discussion était celle qui était ouverte (le plugin le lit dans la ligne de la barre latérale de dsh) ; sinon, elle est dans le projet de la branche.
|
|
199
221
|
- **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).
|
|
222
|
+
- **Ouvrir la discussion en attente en cas d’inactivité** ne connaît que ce que voit la fenêtre de dsh : le travail dans une autre app ne compte pas, donc quand dsh est en arrière-plan, elle peut ouvrir une discussion en attente au bout de 30 secondes. Elle ne fait pas passer dsh au premier plan. Lire sans toucher une touche, cliquer ni bouger la souris compte comme de l’inactivité. Elle ne regarde que les discussions avec le point orange de dsh (une question, une approbation ou une revue du plan) ; la demande d’un sous-agent s’affiche dans sa discussion parente. Tant qu’une discussion en attente est à l’écran, aucune autre ne s’ouvre ; une discussion quittée sans réponse peut se rouvrir après les 30 secondes suivantes sans utilisation. Les 30 secondes ne sont pas modifiables.
|
|
200
223
|
- Une notification envoyée avant un redémarrage ne fait que ramener dsh au premier plan quand vous cliquez dessus.
|
|
201
224
|
- 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.
|
|
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é.
|
|
225
|
+
- dsh n’a pas de point d’extension dans le menu des options d’affichage de la barre latérale : l’option des projets récents est donc ajoutée au menu de dsh lui-même. Si une mise à jour de dsh change ce menu, l’option n’apparaît pas et tous les projets restent visibles. Le filtre agit sur les lignes de projet : **Dans une seule liste** n’est donc pas filtré. Dans **Arborescence des espaces de travail**, un dossier parent reste affiché tant qu’un projet qu’il contient est actif, et les lignes de discussion qui n’ont pas été actives au cours des 2 dernières heures sont masquées aussi ; dans **Espace de travail**, seules les lignes de projet sont filtrées. Le filtre lit la vue que dsh affiche dans le réglage de vue enregistré par dsh (pas une API publique) ; si une mise à jour de dsh le renomme, **Arborescence des espaces de travail** est filtrée comme **Espace de travail**. La fonction Statut du projet lit le même réglage : dans **Arborescence des espaces de travail**, la ligne d’un dossier parent compte aussi les discussions des projets qu’il contient ; si dsh renomme ce réglage, chaque ligne n’affiche que ses propres discussions. **Par état** a le même type de limite : dsh n’a pas d’emplacement pour l’ordre, donc l’élément de menu et l’ordre des lignes s’attachent au balisage du menu et de la liste de dsh.
|
|
203
226
|
- 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.
|
|
204
227
|
- 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
228
|
- 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.
|
|
@@ -207,6 +230,12 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
207
230
|
- **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.
|
|
208
231
|
- **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
232
|
- **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.
|
|
233
|
+
- **Priorité au message envoyé après Arrêter** n’agit qu’après l’arrêt de la discussion (ou après un tour qui a échoué, ou à l’ouverture d’une discussion qui a encore une file) : un message envoyé pendant qu’un tour s’exécute attend toujours à la fin de la file. Il ne passe que devant vos propres messages en file : si un tour d’objectif ou une réponse à une question attend dans la file, l’ordre de dsh reste. Il lit une partie de dsh qui n’est pas une API publique (si le tour arrêté est encore en train de se terminer) ; si une mise à jour de dsh la renomme, le message ne passe devant qu’une fois ce tour terminé. Les discussions de sous-agents gardent l’ordre de dsh.
|
|
234
|
+
- **Mémoire du projet** appartient au premier dossier de la discussion (le dossier de projet de dsh) : une discussion qui change de dossier avec `cd` garde la mémoire de son premier projet, et le même dossier ouvert par un autre chemin vers les mêmes fichiers la partage. Une discussion fige sa section de mémoire à son début : une note enregistrée plus tard apparaît donc à partir de la discussion suivante (`memory_recall` la trouve tout de suite). La revue garde seulement ce que le modèle décide de garder : elle peut manquer un fait ou en garder un faux ; ouvrez les fichiers pour les vérifier, et modifiez-les ou supprimez-les à la main quand dsh est fermé. Chaque tour terminé avec un message de vous coûte un appel au modèle ; un appel en échec relit les mêmes messages après le tour suivant. Les discussions de sous-agents ne sont pas revues. L’idée et le format de fichier viennent de [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0) ; Composer Plus n’utilise pas son code et ne lit ni n’écrit jamais la mémoire propre de DS Bot.
|
|
235
|
+
- **Sauvegarde** utilise un seul dossier fixe, `~/Desktop/dsh-backups` (celui de dsh-backup par défaut, pour que ses archives restent utilisables) ; aucun réglage ne permet un autre dossier. Une archive est à peu près aussi grande que le dossier personnel de dsh sans `cache/` ni `dsh-runtimes/` (mesuré : 1,6 Go de fichiers ont donné une archive de 830 Mo en environ 30 s sur Apple Silicon ; dsh est resté réactif). Un fichier qui change pendant sa lecture est enregistré tel qu’il était quand la sauvegarde l’a ouvert : le journal d’une discussion ouverte peut donc se terminer par un enregistrement coupé, que dsh répare à sa prochaine écriture. Le masquage trouve un secret dans un fichier yml par le nom de sa clé sur une ligne (`token:`, `apiKey:`, …) ; un secret dans une map de flux (`{token: x}`), dans une liste sous une telle clé, dans un fichier JSON (par exemple l’`apiKey` d’un serveur MCP dans un fichier `.json`) ou sous un autre nom reste dans l’archive. Les archives par type de dsh-backup (`dsh-t-…`) ne sont pas listées. **Pour un autre ordinateur** copie l’archive (un clone sur APFS : aucun espace en plus) ; le vault ne la suit pas. **Sauvegarder maintenant** ne supprime aucune sauvegarde. Une sauvegarde automatique conserve les sauvegardes les plus récentes faites par Composer Plus (le réglage **Conserver** de **Sauvegarde automatique**) et supprime ses sauvegardes plus anciennes ; les instantanés d’avant une mise à niveau sont comptés à part (les 2 plus récents restent). Les archives de dsh-backup ne sont jamais supprimées : retirez-les avec **Supprimer**. Tant que dsh-backup est encore installé, il compte les archives de Composer Plus dans son propre nombre de copies conservées et peut les supprimer.
|
|
236
|
+
- **Restaurer** ne fonctionne que dans la console de secours, quand dsh est fermé : cela remplace tout le dossier personnel de dsh. L’ancien reste à côté sous le nom `.dsh.pre-restore-<time>` jusqu’à ce que vous le supprimiez : le disque doit donc avoir de la place pour les deux. Les discussions gardent les chemins de leurs projets : sur un autre ordinateur, un projet situé à un autre chemin apparaît comme manquant jusqu’à ce que vous l’ajoutiez de nouveau. Les liens symboliques qui pointent hors du dossier personnel de dsh (par exemple des compétences liées depuis un autre dossier) reviennent comme liens ; leurs cibles doivent exister sur cet ordinateur.
|
|
237
|
+
- **Vérification des journaux de session** lit le journal le plus récent de chaque discussion avec les propres règles de dsh sur ce qui s’ouvre : une ligne qui n’est pas du JSON ou qui n’est pas dans l’ordre ne compte comme un dommage que si une fin de tour vient après elle (sinon dsh ouvre la discussion sans les lignes à partir de là, donc elle n’est pas listée). Elle ne vérifie pas les événements d’un journal par rapport aux règles d’événements de dsh lui-même : un journal qu’elle juge sain peut donc quand même ne pas s’ouvrir après une mise à niveau de dsh. Une réparation prend la copie d’une sauvegarde : les messages postérieurs à cette sauvegarde sont perdus pour cette discussion (le fichier endommagé reste à côté). Une discussion ouverte dans ce dsh n’est pas réparée dans les Réglages : dsh la détient.
|
|
238
|
+
- **Sauvegarde automatique** ne tourne que pendant que dsh tourne : une sauvegarde prévue pendant que dsh était fermé s’exécute environ 45 s après le démarrage suivant. L’instantané d’une nouvelle version est pris après ce démarrage, pas avant la mise à jour.
|
|
210
239
|
- 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).
|
|
211
240
|
|
|
212
241
|
## FAQ
|
|
@@ -235,9 +264,19 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
235
264
|
|
|
236
265
|
**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
266
|
|
|
267
|
+
**L’agent peut-il retenir mes préférences d’une discussion à l’autre, comme la mémoire de DS Bot ?** Oui, avec **Mémoire du projet** (désactivée par défaut) : activez-la dans **Réglages → Composer Plus**. Après chaque tour, vos préférences et décisions durables sont gardées sous forme de notes courtes pour le projet de la discussion, et chaque nouvelle discussion de ce projet les lit. Demandez à l’agent de retenir quelque chose : il l’enregistre tout de suite.
|
|
268
|
+
|
|
269
|
+
**dsh peut-il sauvegarder mes discussions et mes réglages, comme dsh-backup ?** Oui : **Réglages → Composer Plus → Sauvegarde → Sauvegarder maintenant**. Il écrit le même format d’archive dans le même dossier (`~/Desktop/dsh-backups`) : les archives de dsh-backup s’affichent donc aussi et se restaurent, et vous pouvez supprimer dsh-backup. Activez **Sauvegarde automatique** pour des sauvegardes planifiées.
|
|
270
|
+
|
|
271
|
+
**dsh ne démarre plus. Comment restaurer une sauvegarde ?** Ouvrez le dossier de sauvegarde (`~/Desktop/dsh-backups`) et double-cliquez sur `Composer Plus Rescue.command` (Linux : `composer-plus-rescue.sh`, Windows : `Composer Plus Rescue.cmd`). Choisissez `3) Restore a backup`, sélectionnez-en une et tapez `RESTORE`. Cela fonctionne sans dsh.
|
|
272
|
+
|
|
273
|
+
**Comment déplacer dsh vers un nouvel ordinateur ?** Sur l’ancien : **Sauvegarde** → **Pour un autre ordinateur** à côté d’une sauvegarde. Copiez ce dossier sur le nouvel ordinateur, installez-y dsh, quittez-le, ouvrez `Composer Plus Rescue` dans le dossier copié et restaurez. Saisissez de nouveau vos clés d’API (elles restent sur l’ancien ordinateur).
|
|
274
|
+
|
|
275
|
+
**Une discussion ne s’ouvre plus après un plantage. Puis-je la réparer ?** **Réglages → Composer Plus → Vérification des journaux de session → Vérifier les journaux de session**. Une discussion endommagée revient depuis la sauvegarde la plus récente avec **Réparer depuis les sauvegardes** (les messages postérieurs à cette sauvegarde sont perdus).
|
|
276
|
+
|
|
238
277
|
**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 `↑` / `↓`.
|
|
239
278
|
|
|
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.
|
|
279
|
+
**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. Vous pouvez aussi y supprimer ses images et ses fichiers, ou en ajouter de nouveaux.
|
|
241
280
|
|
|
242
281
|
**Comment effacer d’un coup tous les points non lus d’un projet ?** Barre latérale → bouton **…** du projet → **Tout marquer comme lu**.
|
|
243
282
|
|
|
@@ -265,13 +304,17 @@ Testé sur dsh `0.2.0-rc.2` (bureau et web) et `0.2.1-rc.2` (web). La CI exécut
|
|
|
265
304
|
|
|
266
305
|
**Comment recevoir des notifications macOS / Windows quand une tâche dsh se termine ou a besoin d’une approbation ?** Gardez **Notifications en arrière-plan** activée (c’est le réglage par défaut) et autorisez les notifications pour DeepSeek Harness dans les réglages du système.
|
|
267
306
|
|
|
307
|
+
**dsh peut-il ouvrir tout seul la discussion qui me pose une question ?** Oui, avec **Ouvrir la discussion en attente en cas d’inactivité** (activé par défaut) : quand une discussion attend une réponse, une approbation ou une revue du plan et que vous n’utilisez pas dsh pendant 30 secondes, dsh l’ouvre. Pendant que vous tapez, faites défiler ou bougez la souris, il attend.
|
|
308
|
+
|
|
268
309
|
**Comment passer l’interface de DeepSeek Harness en turc, en espagnol, en japonais… ?** Réglages → Composer Plus → **Langue de l’application**.
|
|
269
310
|
|
|
270
311
|
**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.
|
|
271
312
|
|
|
272
313
|
**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
314
|
|
|
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
|
|
315
|
+
**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** : sur l’écran de nouvelle discussion, le bouton de branche affiche **Nouvelle branche** par défaut : 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.
|
|
316
|
+
|
|
317
|
+
**La barre latérale peut-elle afficher chaque branche d’un projet et déplacer ma discussion quand l’agent crée une branche ?** Oui, avec **Branches dans l’arborescence des espaces de travail** (désactivé par défaut) : activez-le dans Réglages → Composer Plus, puis choisissez **Options d’affichage** → **Arborescence des espaces de travail** dans dsh. Chaque branche qui a un worktree dans `<project>/.worktrees/` s’affiche dans son projet. Quand vous demandez à l’agent du dossier du projet de créer une branche et d’y travailler, et que le dossier n’a pas de modification non validée, la discussion passe d’elle-même dans la branche. Supprimez le dossier de la branche et elle quitte la liste ; ses discussions vont dans **Sans groupe**.
|
|
275
318
|
|
|
276
319
|
**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
320
|
|
|
@@ -287,6 +330,7 @@ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh
|
|
|
287
330
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
|
|
288
331
|
# recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
|
|
289
332
|
PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
|
|
333
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
|
|
290
334
|
# Order by status (fake model + Schedule): real-app test + its thumbnail
|
|
291
335
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
|
|
292
336
|
# every Settings feature row shows a loading screenshot and a ? link to its README row
|
|
@@ -297,10 +341,14 @@ PLAYWRIGHT=/path/to/playwright node test/browser-whats-new.mjs /path/to/dsh/lib/
|
|
|
297
341
|
PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
|
|
298
342
|
# Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
|
|
299
343
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
|
|
344
|
+
# Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
|
|
345
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
|
|
300
346
|
# Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
|
|
301
347
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
302
348
|
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|
|
303
349
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
|
|
350
|
+
# Resume after restart with a queue (fake model, real quit and start): text, image, file, a drag and an edit come back in order
|
|
351
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-resume-queue.mjs /path/to/dsh/lib/bin.js
|
|
304
352
|
# Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list, a focus topic chip, Copy as checklist + its thumbnail
|
|
305
353
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
|
|
306
354
|
# Export chat as Markdown (fake model, made-up project): right-click → Export as Markdown…, copy and save keep the code blocks, switch off + its thumbnail
|
|
@@ -315,8 +363,10 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path
|
|
|
315
363
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
364
|
# 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
365
|
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
|
|
366
|
+
# Changes Tree (fake model, made-up git history): the branch map (counts, colors, arrows), a branch's commits, commit files and diffs, Merged and Waiting files, back marks the box + its thumbnail
|
|
319
367
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
368
|
+
# Branches in the workspace tree (fake model, made-up git project): a worktree becomes a project, the agent's new branch moves the chat, a deleted folder leaves the tree + its thumbnail
|
|
369
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-branch-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
370
|
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
371
|
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
372
|
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
@@ -327,6 +377,9 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path
|
|
|
327
377
|
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
378
|
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
379
|
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
380
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
381
|
+
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
382
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
330
383
|
```
|
|
331
384
|
|
|
332
385
|
```sh
|