[{"data":1,"prerenderedAt":34},["ShallowReactive",2],{"doc:fr:plugins\u002Fmanifest":3},{"title":4,"lede":5,"html":6,"headings":7},"Le manifeste","Chaque plugin d’Escouade se décrit dans un fichier escouade-plugin.json à la racine de son dossier. Cette page en est la référence : chaque champ, ce qu’Escouade vérifie, comment il installe un plugin et pourquoi il en désactive un.","\u003Ch2 id=\"un-exemple-complet\">Un exemple complet\u003C\u002Fh2>\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.exemple.slack&quot;,\n  &quot;name&quot;: &quot;Slack&quot;,\n  &quot;version&quot;: &quot;1.2.0&quot;,\n  &quot;description&quot;: { &quot;fr&quot;: &quot;Les tickets à tester dans un salon Slack.&quot;, &quot;en&quot;: &quot;Tickets to review in a Slack channel.&quot; },\n  &quot;author&quot;: { &quot;name&quot;: &quot;Exemple&quot;, &quot;url&quot;: &quot;https:\u002F\u002Fexemple.dev&quot; },\n  &quot;license&quot;: &quot;MIT&quot;,\n  &quot;repository&quot;: &quot;https:\u002F\u002Fgithub.com\u002Fexemple\u002Fescouade-slack&quot;,\n  &quot;escouade&quot;: { &quot;api&quot;: &quot;1&quot;, &quot;min&quot;: &quot;2.1.0&quot; },\n  &quot;run&quot;: { &quot;command&quot;: &quot;bin\u002Fescouade-slack&quot;, &quot;windows&quot;: &quot;bin\u002Fescouade-slack.exe&quot; },\n  &quot;activation&quot;: [&quot;event:ticket.column&quot;],\n  &quot;permissions&quot;: {\n    &quot;events&quot;: [&quot;ticket.*&quot;],\n    &quot;network&quot;: [&quot;hooks.slack.com&quot;],\n    &quot;secrets&quot;: [&quot;webhook&quot;]\n  },\n  &quot;contributes&quot;: {\n    &quot;settings&quot;: [{ &quot;key&quot;: &quot;channel&quot;, &quot;type&quot;: &quot;string&quot;, &quot;title&quot;: { &quot;fr&quot;: &quot;Salon&quot;, &quot;en&quot;: &quot;Channel&quot; } }],\n    &quot;secrets&quot;: [{ &quot;key&quot;: &quot;webhook&quot;, &quot;title&quot;: { &quot;fr&quot;: &quot;Adresse du webhook&quot;, &quot;en&quot;: &quot;Webhook URL&quot; } }]\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La ligne \u003Ccode class=\"key\">$schema\u003C\u002Fcode> donne l’autocomplétion et la vérification dans VS Code et les éditeurs qui lisent les schémas JSON. Le schéma est publié à l’adresse \u003Ccode>https:\u002F\u002Fescouade.dev\u002Fschemas\u002Fplugin-1.json\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"les-champs\">Les champs\u003C\u002Fh2>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Champ\u003C\u002Fth>\n\u003Cth>Obligatoire\u003C\u002Fth>\n\u003Cth>Ce qu’il dit\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>oui\u003C\u002Ftd>\n\u003Ctd>L’identifiant unique du plugin, en nom de domaine inversé et en minuscules : \u003Ccode class=\"key\">dev.exemple.slack\u003C\u002Fcode>. Les ids \u003Ccode class=\"key\">dev.escouade.*\u003C\u002Fcode> sont réservés aux plugins d’Escouade.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>oui\u003C\u002Ftd>\n\u003Ctd>Son nom : un texte, ou un texte par langue.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">version\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>oui\u003C\u002Ftd>\n\u003Ctd>Sa version, en trois nombres : \u003Ccode class=\"key\">1.2.0\u003C\u002Fcode>, \u003Ccode class=\"key\">0.3.0-beta.1\u003C\u002Fcode>. La même que l’étiquette git de la version.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">description\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Ce qu’il fait, en une phrase : un texte, ou un texte par langue.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">author\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Qui l’a fait : \u003Ccode class=\"key\">name\u003C\u002Fcode> obligatoire, \u003Ccode class=\"key\">url\u003C\u002Fcode> et \u003Ccode class=\"key\">email\u003C\u002Fcode> facultatifs.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">license\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Sa licence, en identifiant SPDX : \u003Ccode class=\"key\">MIT\u003C\u002Fcode>, \u003Ccode class=\"key\">Apache-2.0\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">repository\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>L’adresse de son dépôt, en \u003Ccode class=\"key\">https:\u002F\u002F\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">escouade\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>oui\u003C\u002Ftd>\n\u003Ctd>L’Escouade pour lequel il est écrit : \u003Ccode class=\"key\">api\u003C\u002Fcode>, \u003Ccode class=\"key\">min\u003C\u002Fcode> et \u003Ccode class=\"key\">max\u003C\u002Fcode> (voir plus bas).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">run\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Son programme. Sans lui, le plugin est déclaratif : rien ne s’exécute.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">activation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Ce qui le démarre, par exemple \u003Ccode class=\"key\">event:ticket.column\u003C\u002Fcode>. Sans activation, son programme ne tourne pas.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">permissions\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Ce qu’il demande : \u003Ccode class=\"key\">events\u003C\u002Fcode>, \u003Ccode class=\"key\">network\u003C\u002Fcode>, \u003Ccode class=\"key\">secrets\u003C\u002Fcode>, \u003Ccode class=\"key\">commands\u003C\u002Fcode> (des listes) et \u003Ccode class=\"key\">decide\u003C\u002Fcode> (\u003Ccode class=\"key\">true\u003C\u002Fcode> ou \u003Ccode class=\"key\">false\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">contributes\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Ses points d’extension : ce qu’il ajoute à Escouade.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">store\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Ce que la place de marché montre de lui : \u003Ccode class=\"key\">categories\u003C\u002Fcode>, \u003Ccode class=\"key\">keywords\u003C\u002Fcode>, \u003Ccode class=\"key\">screenshots\u003C\u002Fcode>, \u003Ccode class=\"key\">docs\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch3 id=\"les-textes-dans-deux-langues\">Les textes dans deux langues\u003C\u002Fh3>\n\u003Cp>\u003Ccode class=\"key\">name\u003C\u002Fcode>, \u003Ccode class=\"key\">description\u003C\u002Fcode> et les titres des réglages prennent un texte seul, ou un objet de textes par langue : \u003Ccode>{ &quot;fr&quot;: &quot;Salon&quot;, &quot;en&quot;: &quot;Channel&quot; }\u003C\u002Fcode>. Escouade montre celui de la langue de l’interface, sinon l’anglais, sinon le français. Un objet doit avoir au moins \u003Ccode class=\"key\">en\u003C\u002Fcode> ou \u003Ccode class=\"key\">fr\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"la-plage-d-escouade\">La plage d’Escouade\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">api\u003C\u002Fcode> : la version majeure du protocole des plugins que parle le plugin, entre guillemets : \u003Ccode class=\"key\">&quot;1&quot;\u003C\u002Fcode>. Escouade 2.1 sert la version 1.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">min\u003C\u002Fcode> : la plus ancienne version d’Escouade avec laquelle le plugin a été essayé, \u003Ccode class=\"key\">2.1.0\u003C\u002Fcode> ou \u003Ccode class=\"key\">2.1\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">max\u003C\u002Fcode> (facultatif) : la plus récente. \u003Ccode class=\"key\">2.4\u003C\u002Fcode> comprend toutes les 2.4.x.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Un plugin d’une autre API, ou pour un Escouade hors de sa plage, reste installé mais désactivé, et Escouade dit pourquoi : par exemple « Ce plugin demande Escouade 2.3.0 ou plus récent ; tu as la 2.1.0. Mets Escouade à jour. »\u003C\u002Fp>\n\u003Ch3 id=\"le-programme\">Le programme\u003C\u002Fh3>\n\u003Cp>\u003Ccode class=\"key\">command\u003C\u002Fcode> est le chemin du programme dans le dossier du plugin ; \u003Ccode class=\"key\">windows\u003C\u002Fcode>, \u003Ccode class=\"key\">macos\u003C\u002Fcode> et \u003Ccode class=\"key\">linux\u003C\u002Fcode> en donnent un autre pour chaque système qui a le sien ; \u003Ccode class=\"key\">args\u003C\u002Fcode> ajoute des arguments. Un chemin absolu ou qui remonte avec \u003Ccode class=\"key\">..\u003C\u002Fcode> est refusé : un plugin ne lance que ce qu’il apporte.\u003C\u002Fp>\n\u003Ch3 id=\"les-points-d-extension\">Les points d’extension\u003C\u002Fh3>\n\u003Cp>\u003Ccode class=\"key\">contributes\u003C\u002Fcode> regroupe ce que le plugin ajoute. Escouade vérifie déjà leur forme :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">settings\u003C\u002Fcode> : ses réglages, chacun avec une clé (\u003Ccode class=\"key\">key\u003C\u002Fcode>), un type (\u003Ccode class=\"key\">string\u003C\u002Fcode>, \u003Ccode class=\"key\">number\u003C\u002Fcode>, \u003Ccode class=\"key\">boolean\u003C\u002Fcode> ou \u003Ccode class=\"key\">select\u003C\u002Fcode>) et un titre (\u003Ccode class=\"key\">title\u003C\u002Fcode>) ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">secrets\u003C\u002Fcode> : les secrets qu’il garde, chacun avec une clé et un titre ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">accounts\u003C\u002Fcode> : un genre de compte, partagé par ses autres points ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">ticketSources\u003C\u002Fcode>, \u003Ccode class=\"key\">forges\u003C\u002Fcode> et \u003Ccode class=\"key\">harnesses\u003C\u002Fcode> : une source du Kanban, un hébergeur de code, un harness ; chacun avec un \u003Ccode class=\"key\">id\u003C\u002Fcode>, et le compte qu’il utilise (\u003Ccode class=\"key\">account\u003C\u002Fcode>) parmi ceux de \u003Ccode class=\"key\">accounts\u003C\u002Fcode> ;\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">themes\u003C\u002Fcode>, \u003Ccode class=\"key\">webhooks\u003C\u002Fcode>, \u003Ccode class=\"key\">commands\u003C\u002Fcode>, \u003Ccode class=\"key\">menus\u003C\u002Fcode>, \u003Ccode class=\"key\">statusBar\u003C\u002Fcode>, \u003Ccode class=\"key\">badges\u003C\u002Fcode>, \u003Ccode class=\"key\">projectTemplates\u003C\u002Fcode> et \u003Ccode class=\"key\">escouadeYml\u003C\u002Fcode> : décrits avec les versions qui les mettent en service.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Un même plugin peut tenir plusieurs points : un plugin GitHub donne ses issues au Kanban et suit ses PR sur un seul compte.\u003C\u002Fp>\n\u003Ch2 id=\"ce-qu-escouade-verifie\">Ce qu’Escouade vérifie\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Un manifeste invalide ne charge rien.\u003C\u002Fstrong> Escouade dit pourquoi, champ par champ, avec le chemin du champ : « \u003Ccode class=\"key\">escouade.min\u003C\u002Fcode> manque. », « \u003Ccode>contributes.settings[0].type\u003C\u002Fcode> vaut l’un de : string, number, boolean, select. »\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Un champ inconnu est ignoré.\u003C\u002Fstrong> Un manifeste écrit pour un Escouade plus récent se charge quand même ; les champs ignorés sont listés.\u003C\u002Fli>\n\u003Cli>Le même contrôle tourne sur la place de marché quand un auteur y soumet son plugin : les deux disent les mêmes erreurs (\u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fpublishing\u002F\">publier sur le store\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"installer-un-plugin\">Installer un plugin\u003C\u002Fh2>\n\u003Cp>Escouade installe un plugin de trois façons :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Depuis un dossier\u003C\u002Fstrong> : le dossier est copié dans \u003Ccode>~\u002F.escouade\u002Fplugins\u002F&lt;id&gt;\u002F\u003C\u002Fcode>, sans son historique git, et fixé par l’empreinte SHA-256 de ses fichiers.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Depuis un dépôt git et une étiquette\u003C\u002Fstrong> (\u003Ccode class=\"key\">v1.2.0\u003C\u002Fcode>) : Escouade clone cette étiquette seule, la copie au même endroit, et la fixe par son commit. Un plugin est toujours fixé à une version ; installer une autre étiquette remplace la précédente.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Un dossier en développement\u003C\u002Fstrong> : chargé là où il est, sans copie, et relu dès qu’un de ses fichiers change. C’est le mode des auteurs de plugins.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>La liste des plugins installés, leur origine et leur empreinte sont dans \u003Ccode>~\u002F.escouade\u002Fplugins.json\u003C\u002Fcode>. Une copie dont les fichiers ont changé depuis l’installation est désactivée, avec la raison.\u003C\u002Fp>\n\u003Cp>Le programme d’un plugin démarre à sa première activation et parle \u003Ca href=\"\u002Fdocs\u002Fplugins\u002Fapi\u002F\">le protocole\u003C\u002Fa>. L’onglet Réglages › Plugins, qui installe, active et désinstalle les plugins depuis l’interface, et les faits qui démarrent un plugin arrivent avec la suite de la 2.1.\u003C\u002Fp>\n",[8,12,15,19,22,25,28,31],{"id":9,"text":10,"depth":11},"un-exemple-complet","Un exemple complet",2,{"id":13,"text":14,"depth":11},"les-champs","Les champs",{"id":16,"text":17,"depth":18},"les-textes-dans-deux-langues","Les textes dans deux langues",3,{"id":20,"text":21,"depth":18},"la-plage-d-escouade","La plage d’Escouade",{"id":23,"text":24,"depth":18},"le-programme","Le programme",{"id":26,"text":27,"depth":18},"les-points-d-extension","Les points d’extension",{"id":29,"text":30,"depth":11},"ce-qu-escouade-verifie","Ce qu’Escouade vérifie",{"id":32,"text":33,"depth":11},"installer-un-plugin","Installer un plugin",1793283950123]