[{"data":1,"prerenderedAt":24},["ShallowReactive",2],{"doc:fr:plugins\u002Fintroduction":3},{"title":4,"lede":5,"html":6,"headings":7},"Les plugins","Un plugin ajoute à Escouade ce qu’elle ne fait pas seule : un thème, un harness, des notifications, des règles pour les autorisations de tes agents. Cette page dit ce qu’un plugin peut faire, sous quelles formes il vient, d’où il vient et par où commencer.","\u003Ch2 id=\"ce-qu-un-plugin-apporte\">Ce qu’un plugin apporte\u003C\u002Fh2>\n\u003Cp>Un plugin se décrit dans un fichier, son \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fmanifest\u002F\">manifeste\u003C\u002Fa>, et y déclare ce qu’il ajoute :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>des thèmes\u003C\u002Fstrong> : les couleurs de la fenêtre, en sombre et en clair, et une palette pour les projets (\u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fthemes\u002F\">les thèmes\u003C\u002Fa>) ;\u003C\u002Fli>\n\u003Cli>\u003Cstrong>des réactions aux événements\u003C\u002Fstrong> : un webhook ou une commande quand un ticket passe « À tester », quand un agent attend, quand un tour finit (\u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fevents\u002F\">les événements\u003C\u002Fa>) ;\u003C\u002Fli>\n\u003Cli>\u003Cstrong>des décisions d’autorisation\u003C\u002Fstrong> : autoriser ou refuser ce qu’un agent demande, avant que la question n’arrive jusqu’à toi (\u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fpermission-rules\u002F\">les règles d’autorisation\u003C\u002Fa>) ;\u003C\u002Fli>\n\u003Cli>\u003Cstrong>des harness\u003C\u002Fstrong> : un agent qui parle ACP, comme Goose, décrit sans code (\u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fharnesses\u002F\">un harness ACP décrit\u003C\u002Fa>) ;\u003C\u002Fli>\n\u003Cli>\u003Cstrong>un lecteur de workflows\u003C\u002Fstrong>, pour un workflow qu’Escouade ne lit pas seule ;\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ses réglages et ses secrets\u003C\u002Fstrong>, que tu saisis sur sa page.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Certaines intégrations d’Escouade sont elles-mêmes des plugins, livrés avec l’app : GitHub, GitLab, Bitbucket, Gitea et Forgejo, Trello, les harness ACP, isola et les services de voix en ligne (voir \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Finstaller\u002F#les-plugins-livres-avec-escouade\">les plugins livrés avec Escouade\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"trois-formes\">Trois formes\u003C\u002Fh2>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Forme\u003C\u002Fth>\n\u003Cth>Ce qu’elle est\u003C\u002Fth>\n\u003Cth>Ce que dit la fenêtre d’installation\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Déclaratif\u003C\u002Ftd>\n\u003Ctd>Le manifeste seul : un thème, des webhooks, un harness décrit. Rien ne s’exécute.\u003C\u002Ftd>\n\u003Ctd>Ses permissions, sans programme\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Programme en WASM\u003C\u002Ftd>\n\u003Ctd>Un bundle en JS ou en TypeScript (\u003Ccode class=\"key\">run.js\u003C\u002Fcode>), ou un module en Rust (\u003Ccode class=\"key\">run.wasm\u003C\u002Fcode>), qu’Escouade fait tourner dans l’app, sans Node ni Rust chez toi. Il n’atteint le réseau, les fichiers et les programmes que par Escouade, et ce qu’il déclare seulement.\u003C\u002Ftd>\n\u003Ctd>« Tourne dans Escouade, isolé »\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Programme natif\u003C\u002Ftd>\n\u003Ctd>Un exécutable (\u003Ccode class=\"key\">run.command\u003C\u002Fcode>) lancé dans un process, avec tes droits. Le store n’en publie aucun : il ne vient que d’un dossier ou d’un dépôt git.\u003C\u002Ftd>\n\u003Ctd>« Lance un programme sur ton ordinateur, avec tes droits »\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Un programme parle à Escouade par \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fapi\u002F\">le protocole\u003C\u002Fa> ; \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fsdk\u002F\">le SDK\u003C\u002Fa> l’écrit pour toi en TypeScript, \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Frust\u002F\">le kit\u003C\u002Fa> en Rust.\u003C\u002Fp>\n\u003Ch2 id=\"ce-qu-un-plugin-ne-peut-pas-faire\">Ce qu’un plugin ne peut pas faire\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Lire les secrets d’un autre\u003C\u002Fstrong> : un plugin n’a que les siens, jamais ceux d’un compte, d’un harness ou d’un autre plugin.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Agir dans un projet privé\u003C\u002Fstrong> sans ton accord : un plugin installé y est coupé d’office (seuls les plugins livrés avec Escouade y sont actifs, comme le reste de l’app).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>S’installer seul\u003C\u002Fstrong> : un projet peut proposer un plugin dans son \u003Ca href=\"\u002Fdocs\u002Fescouade-yml\u002F#plugins\">\u003Ccode class=\"key\">.escouade.yml\u003C\u002Fcode>\u003C\u002Fa>, jamais l’installer ; un lien \u003Ccode class=\"key\">escouade:\u002F\u002F\u003C\u002Fcode> ouvre sa page, jamais l’installation.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Recevoir ce qu’il n’a pas demandé\u003C\u002Fstrong> : un fait hors de \u003Ccode class=\"key\">permissions.events\u003C\u002Fcode> ne lui est pas envoyé, un secret hors de \u003Ccode class=\"key\">permissions.secrets\u003C\u002Fcode> lui est refusé (voir \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fpermissions\u002F\">les permissions\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Changer l’interface\u003C\u002Fstrong> au-delà de ce que son manifeste déclare : pas de vue à lui.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"d-ou-il-vient\">D’où il vient\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Livré avec Escouade\u003C\u002Fstrong> : signé et mis à jour avec l’app ; il se coupe, il ne se désinstalle pas.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Le store\u003C\u002Fstrong>, \u003Ca href=\"https:\u002F\u002Fstore.escouade.dev\" rel=\"noopener\">store.escouade.dev\u003C\u002Fa> : chaque version y passe onze contrôles ; celles qu’Escouade a relues portent le sceau « Vérifié par Escouade », les autres sont « Non vérifié ».\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Un dossier ou un dépôt git\u003C\u002Fstrong> : permis, toujours « Non vérifié » : personne ne l’a relu.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Un dossier en développement\u003C\u002Fstrong> : chargé en place, relu quand il change, pour l’écrire.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"par-ou-commencer\">Par où commencer\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>L’utiliser\u003C\u002Fstrong> : \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Finstaller\u002F\">installer un plugin\u003C\u002Fa>, puis \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fpermissions\u002F\">les permissions\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>En écrire un\u003C\u002Fstrong> : \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fquick-start\u002F\">un premier plugin\u003C\u002Fa> en dix minutes, en TypeScript ou en Rust, puis \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fmanifest\u002F\">le manifeste\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fcapabilities\u002F\">les capacités de l’hôte\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fcalls\u002F\">les appels\u003C\u002Fa> et \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fexamples\u002F\">les plugins d’exemple\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Le publier\u003C\u002Fstrong> : \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Ftesting\u002F\">tester un plugin\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fpublishing\u002F\">publier sur le store\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fsecurity\u002F\">la sécurité des plugins\u003C\u002Fa> et \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fversioning\u002F\">les versions\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Une question\u003C\u002Fstrong> : \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Ffaq\u002F\">les questions fréquentes\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n",[8,12,15,18,21],{"id":9,"text":10,"depth":11},"ce-qu-un-plugin-apporte","Ce qu’un plugin apporte",2,{"id":13,"text":14,"depth":11},"trois-formes","Trois formes",{"id":16,"text":17,"depth":11},"ce-qu-un-plugin-ne-peut-pas-faire","Ce qu’un plugin ne peut pas faire",{"id":19,"text":20,"depth":11},"d-ou-il-vient","D’où il vient",{"id":22,"text":23,"depth":11},"par-ou-commencer","Par où commencer",1793889379302]