Unified Dev 1.1 : merges refusés, orchestrateur et canvas
Avec Unified Dev 1.1, l'agent traite les merges refusés par GitHub, un workspace coordonne les autres et un onglet affiche vos documents.
Lorsque GitHub refuse un merge, un agent lancé depuis Unified Dev 1.1.0 peut maintenant chercher la cause, la corriger et réessayer. C’est l’un des changements de cette version. Unified Dev est une application macOS native qui fait tourner des agents de code dans des worktrees git. Chaque tâche y dispose de sa propre copie du dépôt, de sa branche et de son agent, et plusieurs peuvent s’exécuter en parallèle avec Claude Code, Codex, Grok, Cursor ou OpenCode.
L’historique compte 50 commits de fonctionnalités et 88 de corrections depuis la 1.0.0, dont quelques-uns ne concernent que les outils de prévisualisation internes.
Quand GitHub refuse un merge
Le message d’erreur est le même pour un check en échec, un check en attente ou une revue manquante. L’agent consulte donc l’état de la pull request. S’il trouve un conflit, une branche en retard ou un check en échec, il corrige, fait un push, attend les checks et relance le merge.
Les instructions qu’il reçoit fixent les limites :
// Sources/Core/GitHub/MergeInstructions.swift
- **Three rounds at most.** A round is one fix, one push and one merge attempt. If the third
is refused too, stop and say what GitHub said each time.
- **Thirty minutes of waiting at most**, counting every wait above together: for `UNKNOWN`,
for a check still running, and after each push. Past it, stop and say what never finished.
Elles lui interdisent aussi d’utiliser un simple --force et d’assouplir un test, une règle de lint ou un workflow pour faire passer un check. Face à une revue obligatoire, à une pull request issue d’un fork ou à une branche modifiée entre-temps par quelqu’un d’autre, il s’arrête et rapporte ce que GitHub a répondu. Il s’agit toutefois d’instructions : elles guident l’agent, sans le contraindre comme le fait le retrait des outils de l’orchestrateur, décrit plus bas.
Quand une pull request que l’application a vue ouverte est fusionnée, son workspace est archivé après le contrôle de sécurité habituel, sans demande de confirmation. Ce comportement est activé par défaut et se désactive pour toute l’application ou pour un projet. Un tour ou une commande en cours retardent l’archivage. Si vous arrêtez le tour à la main, ou s’il reste du travail hors de git, le workspace est conservé et une notification vous prévient.
L’orchestrateur
Vous pouvez désigner dans chaque projet un workspace comme orchestrateur, pour y placer l’agent qui planifie et répartit le travail. L’application vous le propose à la création du premier workspace du projet, puis affiche l’orchestrateur en tête de la barre latérale, avec les autres en dessous.
L’orchestrateur est prévenu chaque fois qu’un workspace démarre dans le projet, que vous l’ayez créé vous-même ou qu’un autre agent l’ait fait, puis de nouveau à la fin du premier tour du nouvel agent si ce workspace a une tâche. Pour ceux qu’il lance lui-même, il ne reçoit que ce second message.
En revanche, il ne modifie aucun fichier et ne fait aucun commit. Claude Code démarre sans ces outils :
// Sources/Core/Agent/OrchestratorToolGuard.swift
public static let claudeDisallowedTools: [String] =
["Edit", "Write", "MultiEdit", "NotebookEdit"] + OrchestratorShellJudge.gitVerbs.map { "Bash(git \($0):*)" }
Codex doit demander l’autorisation, ce qui le limite à une sandbox en lecture seule, et Grok ne reçoit jamais --always-approve. Dans une conversation, les commandes shell sont examinées avant leur exécution : un git commit ou une redirection vers un fichier sont refusés, tout comme les outils du bridge qui pilotent un terminal.
L’onglet canvas
Un rapport se lit mieux sous forme de page que dans une conversation. L’agent peut appeler canvas_show avec le chemin du fichier, qui s’ouvre alors dans un onglet à côté de la conversation et se recharge à chaque modification. Vous pouvez aussi y ouvrir un fichier depuis l’inspecteur.
Les formats acceptés sont les suivants :
// Sources/Core/Presentation/CanvasFile.swift
public static let extensions: Set<String> = [
"html", "htm", "md", "markdown", "svg", "png", "jpg", "jpeg", "gif", "webp",
]
Le fichier doit se trouver dans le workspace concerné. Les fichiers .env et les fichiers internes du dépôt ne sont jamais affichés, et l’agent est invité à copier ce qu’il veut montrer dans un fichier normal.
Et aussi
L’écran des dépenses a maintenant une section par compte, à côté des sections par fournisseur et par projet. Si vous utilisez plusieurs comptes pour un même agent, chacun a sa ligne, et un compte qui n’est plus sur le Mac apparaît comme dépense historique.
Vous pouvez citer le texte sélectionné dans une réponse, ou vous en servir pour ouvrir une conversation parallèle.
Les blocs shell ont un bouton qui les exécute dans le workspace. Le statut et les 16 000 derniers caractères de la sortie sont renvoyés dans la conversation, ce qui permet à l’agent de vérifier le résultat. Enfin, les merges utilisent désormais par défaut un merge commit, sauf si vous choisissez une autre méthode pour l’application ou pour un projet.
Pour l’essayer
L’application se télécharge sur la page des releases et demande macOS 26 sur un Mac Apple silicon. Si l’orchestrateur vous intéresse, commencez par la documentation du bridge, qui détaille ce que chaque type d’agent peut appeler.