[{"data":1,"prerenderedAt":21},["ShallowReactive",2],{"doc:fr:plugins\u002Fharnesses":3},{"title":4,"lede":5,"html":6,"headings":7},"Un harness ACP décrit","Un agent qui parle ACP (Agent Client Protocol) devient un harness d’Escouade par un plugin déclaratif : son manifeste le décrit, sans une ligne de code, et le plugin ACP livré avec Escouade fait le reste.","\u003Cp>Ce plugin (\u003Ccode class=\"key\">dev.escouade.acp\u003C\u002Fcode>) lance l’agent, lui parle et montre sa conversation, ses permissions, ses diffs et ses fins de tour, comme pour Claude Code. L’agent apparaît dans le menu « Harness » à côté de « Nouvel agent ».\u003C\u002Fp>\n\u003Ch2 id=\"le-manifeste\">Le manifeste\u003C\u002Fh2>\n\u003Cp>Le plugin Goose (\u003Ccode class=\"key\">plugins\u002Fgoose\u002F\u003C\u002Fcode> du dépôt d’Escouade), essayé avec Goose 1.57 :\u003C\u002Fp>\n\u003Cp>\u003Ccode>plugins\u002Fgoose\u002Fescouade-plugin.json\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;$schema&quot;: &quot;https:\u002F\u002Fescouade.dev\u002Fschemas\u002Fplugin-1.json&quot;,\n  &quot;id&quot;: &quot;dev.escouade.goose&quot;,\n  &quot;name&quot;: &quot;Goose&quot;,\n  &quot;version&quot;: &quot;1.0.0&quot;,\n  &quot;description&quot;: {\n    &quot;fr&quot;: &quot;Goose, l&#39;agent open source de Block, comme harness : décrit par ACP, sans code.&quot;,\n    &quot;en&quot;: &quot;Goose, Block&#39;s open source agent, as a harness: described over ACP, no code.&quot;\n  },\n  &quot;author&quot;: { &quot;name&quot;: &quot;Escouade&quot;, &quot;url&quot;: &quot;https:\u002F\u002Fescouade.dev&quot; },\n  &quot;license&quot;: &quot;MIT&quot;,\n  &quot;repository&quot;: &quot;https:\u002F\u002Fgithub.com\u002Fguillaume-gagnaire\u002Fescouade\u002Ftree\u002Fmain\u002Fplugins\u002Fgoose&quot;,\n  &quot;escouade&quot;: { &quot;api&quot;: &quot;1&quot;, &quot;min&quot;: &quot;2.1.0&quot; },\n  &quot;contributes&quot;: {\n    &quot;harnesses&quot;: [\n      {\n        &quot;id&quot;: &quot;goose&quot;,\n        &quot;name&quot;: &quot;Goose&quot;,\n        &quot;speaker&quot;: &quot;Goose&quot;,\n        &quot;writer&quot;: &quot;Goose&quot;,\n        &quot;locate&quot;: { &quot;names&quot;: [&quot;goose&quot;] },\n        &quot;tested&quot;: { &quot;oldest&quot;: &quot;1.57.0&quot;, &quot;newest&quot;: &quot;1.57.0&quot; },\n        &quot;caps&quot;: {\n          &quot;modes&quot;: [\n            {\n              &quot;id&quot;: &quot;default&quot;,\n              &quot;meaning&quot;: {\n                &quot;fr&quot;: &quot;Goose demande avant chaque outil (son mode approve). Il écrit les fichiers lui-même, sans les faire passer par Escouade.&quot;,\n                &quot;en&quot;: &quot;Goose asks before each tool (its approve mode). It writes files by itself, without passing them through Escouade.&quot;\n              }\n            },\n            {\n              &quot;id&quot;: &quot;acceptEdits&quot;,\n              &quot;meaning&quot;: {\n                &quot;fr&quot;: &quot;Goose ne demande que pour ce qu&#39;il juge sensible (son mode smart_approve) ; Escouade accepte ses écritures dans le dossier de l&#39;agent.&quot;,\n                &quot;en&quot;: &quot;Goose asks only for what it deems sensitive (its smart_approve mode); Escouade accepts its writes in the agent&#39;s folder.&quot;\n              }\n            },\n            {\n              &quot;id&quot;: &quot;bypassPermissions&quot;,\n              &quot;meaning&quot;: {\n                &quot;fr&quot;: &quot;Goose ne demande rien (son mode auto) : commandes, fichiers, tout le disque. Pas de bac à sable.&quot;,\n                &quot;en&quot;: &quot;Goose asks nothing (its auto mode): commands, files, the whole disk. No sandbox.&quot;\n              }\n            }\n          ],\n          &quot;readOnly&quot;: true\n        },\n        &quot;accountVar&quot;: &quot;GOOSE_PATH_ROOT&quot;,\n        &quot;install&quot;: {\n          &quot;windows&quot;: &quot;Invoke-WebRequest -Uri https:\u002F\u002Fraw.githubusercontent.com\u002Faaif-goose\u002Fgoose\u002Fmain\u002Fdownload_cli.ps1 -OutFile download_cli.ps1; .\u002Fdownload_cli.ps1&quot;,\n          &quot;unix&quot;: &quot;curl -fsSL https:\u002F\u002Fgithub.com\u002Faaif-goose\u002Fgoose\u002Freleases\u002Fdownload\u002Fstable\u002Fdownload_cli.sh | CONFIGURE=false bash&quot;\n        },\n        &quot;updateCommand&quot;: &quot;goose update&quot;,\n        &quot;acp&quot;: {\n          &quot;args&quot;: [&quot;acp&quot;],\n          &quot;fs&quot;: false,\n          &quot;modes&quot;: { &quot;default&quot;: &quot;approve&quot;, &quot;acceptEdits&quot;: &quot;smart_approve&quot;, &quot;bypassPermissions&quot;: &quot;auto&quot; },\n          &quot;readOnlyMode&quot;: &quot;chat&quot;,\n          &quot;modelOption&quot;: &quot;model&quot;,\n          &quot;questionsInText&quot;: true,\n          &quot;tools&quot;: { &quot;shell&quot;: &quot;Bash&quot;, &quot;write&quot;: &quot;Write&quot;, &quot;edit&quot;: &quot;Edit&quot;, &quot;text_editor&quot;: &quot;Edit&quot;, &quot;read&quot;: &quot;Read&quot;, &quot;tree&quot;: &quot;Glob&quot; }\n        }\n      }\n    ]\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Chaque entrée de \u003Ccode>contributes.harnesses\u003C\u002Fcode> avec un objet \u003Ccode class=\"key\">acp\u003C\u002Fcode> est un harness décrit :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">id\u003C\u002Fcode>, \u003Ccode class=\"key\">name\u003C\u002Fcode>, \u003Ccode class=\"key\">speaker\u003C\u002Fcode> (le nom de ses agents dans les textes), \u003Ccode class=\"key\">writer\u003C\u002Fcode> (qui rédige les textes) ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">locate.names\u003C\u002Fcode> : les noms de son programme, cherchés dans le PATH ; un plugin déclaratif ne donne jamais de chemin ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">versionArgs\u003C\u002Fcode> (par défaut \u003Ccode class=\"key\">--version\u003C\u002Fcode>) et \u003Ccode class=\"key\">tested\u003C\u002Fcode> : la version lue et les versions essayées, comme pour les harness d’Escouade ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">caps\u003C\u002Fcode> : ses modes, chacun par son id ou avec son sens (\u003Ccode class=\"key\">meaning\u003C\u002Fcode>, ce que dit le menu des modes), et ce qu’il sait faire (\u003Ccode class=\"key\">images\u003C\u002Fcode>, \u003Ccode class=\"key\">pdf\u003C\u002Fcode>, \u003Ccode class=\"key\">readOnly\u003C\u002Fcode>…) ; ce qui n’est pas dit, il ne le fait pas ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">models\u003C\u002Fcode> : les modèles de son menu (\u003Ccode class=\"key\">id\u003C\u002Fcode>, \u003Ccode class=\"key\">label\u003C\u002Fcode>) ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">accountVar\u003C\u002Fcode> : la variable qui donne à chaque compte son dossier de configuration ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">install\u003C\u002Fcode> et \u003Ccode class=\"key\">updateCommand\u003C\u002Fcode> : sa commande d’installation (Windows, Unix) et de mise à jour.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"l-objet-acp\">L’objet \u003Ccode class=\"key\">acp\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">args\u003C\u002Fcode> : ses arguments (\u003Ccode class=\"key\">[&quot;acp&quot;]\u003C\u002Fcode>) ; \u003Ccode class=\"key\">env\u003C\u002Fcode> et \u003Ccode class=\"key\">removeEnv\u003C\u002Fcode> : des variables à lui (jamais un secret : un manifeste se lit), et celles de l’app qu’il ne doit pas recevoir ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">fs\u003C\u002Fcode> : il lit et écrit les fichiers \u003Cstrong>par Escouade\u003C\u002Fstrong> (\u003Ccode class=\"key\">fs\u002Fread_text_file\u003C\u002Fcode>, \u003Ccode class=\"key\">fs\u002Fwrite_text_file\u003C\u002Fcode>), vrai par défaut. Mets \u003Ccode class=\"key\">false\u003C\u002Fcode> pour un agent qui les lit et écrit lui-même, comme Goose ou Cursor CLI, même quand Escouade le lui propose ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">modes\u003C\u002Fcode> : le mode ACP (\u003Ccode class=\"key\">session\u002Fset_mode\u003C\u002Fcode>) de chaque mode d’Escouade ; \u003Ccode class=\"key\">readOnlyMode\u003C\u002Fcode> : celui qui ne change rien, pour les discussions de l’onglet Docs ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">modelOption\u003C\u002Fcode> : l’option de configuration du modèle (\u003Ccode>session\u002Fset_config_option\u003C\u002Fcode>), sinon \u003Ccode class=\"key\">session\u002Fset_model\u003C\u002Fcode> ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">questionsInText\u003C\u002Fcode> : l’agent n’a pas d’outil pour poser une question ; son premier message lui dit de finir son tour sur un bloc \u003Ccode class=\"key\">&lt;escouade_question&gt;\u003C\u002Fcode>, qu’Escouade montre comme une carte de question ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">tools\u003C\u002Fcode> : le nom d’Escouade (celui de Claude Code) de ses outils de genre \u003Ccode class=\"key\">other\u003C\u002Fcode> (\u003Ccode>{ &quot;shell&quot;: &quot;Bash&quot; }\u003C\u002Fcode>), lus dans \u003Ccode>_meta.&lt;agent&gt;.toolCall.toolName\u003C\u002Fcode> ou dans leur titre avant « · » ; \u003Ccode class=\"key\">subagentTools\u003C\u002Fcode> : ceux qui lancent un sous-agent ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">extensions\u003C\u002Fcode> : \u003Ccode class=\"key\">cursor\u003C\u002Fcode> pour les extensions \u003Ccode class=\"key\">cursor\u002F*\u003C\u002Fcode> de Cursor CLI.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"ce-qu-escouade-tient\">Ce qu’Escouade tient\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Le lancement.\u003C\u002Fstrong> Escouade trouve le programme, demande au plugin ACP comment le lancer, vérifie la description et le lance lui-même. Le serveur MCP d’Escouade est donné à la session (\u003Ccode class=\"key\">mcpServers\u003C\u002Fcode>), son jeton dans un en-tête, sur l’entrée de l’agent : jamais dans ses arguments.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Les permissions.\u003C\u002Fstrong> Chaque permission demandée est une carte, avec son diff pour une écriture. « Édits auto » laisse passer les écritures dans le dossier de l’agent, « Bypass » tout ce qu’il demande.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Les projets privés.\u003C\u002Fstrong> Escouade refuse les fichiers d’un autre projet que l’agent lit ou écrit par lui. Quand l’agent lit ou écrit un fichier lui-même pendant qu’une clôture tient, la conversation le dit : la clôture ne tient pas pour ces accès. Un harness déclaré \u003Ccode>&quot;fs&quot;: false\u003C\u002Fcode> ne démarre pas dans un projet privé.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Ce qu’ACP ne dit pas\u003C\u002Fstrong> reste inconnu : le quota, le coût, les comptes. Les jetons d’un tour sont comptés quand l’agent les donne.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Un plugin désinstallé ou désactivé (ou le plugin ACP lui-même) : ses agents restent, marqués « Harness absent », avec leurs conversations. Ils reviennent avec lui. L’id d’un harness décrit est \u003Ccode>plugin:&lt;plugin&gt;:&lt;harness&gt;\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Pour l’instant, un harness décrit n’a pas de vue terminal ni de textes rédigés.\u003C\u002Fp>\n\u003Cp>Un harness qui n’est pas décrit par ACP s’écrit en Rust : voir \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Frust\u002F#ecrire-un-harness\">écrire un harness\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"l-essayer\">L’essayer\u003C\u002Fh2>\n\u003Cp>Installe le dossier de ton plugin depuis la vue Plugins (« En développement »), puis choisis son harness dans le menu « Harness ». Avant l’installation, la fenêtre montre le programme que ses agents lanceront (\u003Ccode>goose acp\u003C\u002Fcode>). Le banc des harness d’Escouade joue le même client sur un faux agent ACP décrit par un manifeste (\u003Ccode>tests\u002Ffixtures\u002Fplugins\u002Ffake-acp\u002F\u003C\u002Fcode>).\u003C\u002Fp>\n",[8,12,15,18],{"id":9,"text":10,"depth":11},"le-manifeste","Le manifeste",2,{"id":13,"text":14,"depth":11},"l-objet-acp","L’objet acp",{"id":16,"text":17,"depth":11},"ce-qu-escouade-tient","Ce qu’Escouade tient",{"id":19,"text":20,"depth":11},"l-essayer","L’essayer",1793889379659]