[{"data":1,"prerenderedAt":24},["ShallowReactive",2],{"doc:en:plugins\u002Fintroduction":3},{"title":4,"lede":5,"html":6,"headings":7},"Plugins","A plugin adds to Escouade what it does not do on its own: a theme, a harness, notifications, rules for your agents’ permissions. This page says what a plugin can do, the forms it comes in, where it comes from and where to start.","\u003Ch2 id=\"what-a-plugin-brings\">What a plugin brings\u003C\u002Fh2>\n\u003Cp>A plugin describes itself in one file, its \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fmanifest\u002F\">manifest\u003C\u002Fa>, and declares there what it adds:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>themes\u003C\u002Fstrong>: the window’s colors, dark and light, and a palette for projects (\u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fthemes\u002F\">themes\u003C\u002Fa>);\u003C\u002Fli>\n\u003Cli>\u003Cstrong>reactions to events\u003C\u002Fstrong>: a webhook or a command when a ticket moves to “To review”, when an agent waits, when a turn ends (\u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fevents\u002F\">events\u003C\u002Fa>);\u003C\u002Fli>\n\u003Cli>\u003Cstrong>permission decisions\u003C\u002Fstrong>: allowing or denying what an agent asks for, before the question reaches you (\u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fpermission-rules\u002F\">permission rules\u003C\u002Fa>);\u003C\u002Fli>\n\u003Cli>\u003Cstrong>harnesses\u003C\u002Fstrong>: an agent that speaks ACP, like Goose, described without code (\u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fharnesses\u002F\">a described ACP harness\u003C\u002Fa>);\u003C\u002Fli>\n\u003Cli>\u003Cstrong>a workflow reader\u003C\u002Fstrong>, for a workflow Escouade does not read on its own;\u003C\u002Fli>\n\u003Cli>\u003Cstrong>its settings and its secrets\u003C\u002Fstrong>, which you fill in on its page.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Some of Escouade’s integrations are plugins themselves, shipped with the app: GitHub, GitLab, Bitbucket, Gitea and Forgejo, Trello, the ACP harnesses, isola and the online voice services (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Finstaller\u002F#the-plugins-shipped-with-escouade\">the plugins shipped with Escouade\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"three-forms\">Three forms\u003C\u002Fh2>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Form\u003C\u002Fth>\n\u003Cth>What it is\u003C\u002Fth>\n\u003Cth>What the install window says\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Declarative\u003C\u002Ftd>\n\u003Ctd>The manifest alone: a theme, webhooks, a described harness. Nothing runs.\u003C\u002Ftd>\n\u003Ctd>Its permissions, with no program\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Program in WASM\u003C\u002Ftd>\n\u003Ctd>A bundle in JS or TypeScript (\u003Ccode class=\"key\">run.js\u003C\u002Fcode>), or a module in Rust (\u003Ccode class=\"key\">run.wasm\u003C\u002Fcode>), that Escouade runs inside the app, with no Node or Rust on your machine. It reaches the network, files and programs only through Escouade, and only what it declares.\u003C\u002Ftd>\n\u003Ctd>“Runs inside Escouade, isolated”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Native program\u003C\u002Ftd>\n\u003Ctd>An executable (\u003Ccode class=\"key\">run.command\u003C\u002Fcode>) started in a process, with your rights. The store publishes none: it only comes from a folder or a git repository.\u003C\u002Ftd>\n\u003Ctd>“Runs a program on your computer, with your rights”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>A program talks to Escouade through \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fapi\u002F\">the protocol\u003C\u002Fa>; \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fsdk\u002F\">the SDK\u003C\u002Fa> writes it for you in TypeScript, \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Frust\u002F\">the kit\u003C\u002Fa> in Rust.\u003C\u002Fp>\n\u003Ch2 id=\"what-a-plugin-cannot-do\">What a plugin cannot do\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Read another one’s secrets\u003C\u002Fstrong>: a plugin has only its own, never those of an account, a harness or another plugin.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Act in a private project\u003C\u002Fstrong> without your consent: a plugin you install is off there from the start (only the plugins shipped with Escouade are on there, like the rest of the app).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Install itself\u003C\u002Fstrong>: a project can propose a plugin in its \u003Ca href=\"\u002Fen\u002Fdocs\u002Fescouade-yml\u002F#plugins\">\u003Ccode class=\"key\">.escouade.yml\u003C\u002Fcode>\u003C\u002Fa>, never install it; an \u003Ccode class=\"key\">escouade:\u002F\u002F\u003C\u002Fcode> link opens its page, never the install.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Receive what it did not ask for\u003C\u002Fstrong>: a fact outside \u003Ccode class=\"key\">permissions.events\u003C\u002Fcode> is never sent to it, a secret outside \u003Ccode class=\"key\">permissions.secrets\u003C\u002Fcode> is refused (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fpermissions\u002F\">permissions\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Change the interface\u003C\u002Fstrong> beyond what its manifest declares: no view of its own.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"where-it-comes-from\">Where it comes from\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Shipped with Escouade\u003C\u002Fstrong>: signed and updated with the app; it is switched off, never uninstalled.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>The store\u003C\u002Fstrong>, \u003Ca href=\"https:\u002F\u002Fstore.escouade.dev\" rel=\"noopener\">store.escouade.dev\u003C\u002Fa>: each version passes eleven checks there; those Escouade reviewed carry the “Verified by Escouade” seal, the others are “Unverified”.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>A folder or a git repository\u003C\u002Fstrong>: allowed, always “Unverified”: nobody reviewed it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>A folder in development\u003C\u002Fstrong>: loaded in place, read again when it changes, to write it.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"where-to-start\">Where to start\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Using one\u003C\u002Fstrong>: \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Finstaller\u002F\">installing a plugin\u003C\u002Fa>, then \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fpermissions\u002F\">permissions\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Writing one\u003C\u002Fstrong>: \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fquick-start\u002F\">a first plugin\u003C\u002Fa> in ten minutes, in TypeScript or in Rust, then \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fmanifest\u002F\">the manifest\u003C\u002Fa>, \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fcapabilities\u002F\">the host’s capabilities\u003C\u002Fa>, \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fcalls\u002F\">the calls\u003C\u002Fa> and \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fexamples\u002F\">the example plugins\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Publishing it\u003C\u002Fstrong>: \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Ftesting\u002F\">testing a plugin\u003C\u002Fa>, \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fpublishing\u002F\">publishing on the store\u003C\u002Fa>, \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fsecurity\u002F\">plugin security\u003C\u002Fa> and \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Fversioning\u002F\">versions\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>A question\u003C\u002Fstrong>: \u003Ca href=\"\u002Fen\u002Fdocs\u002Fplugins\u002Ffaq\u002F\">the FAQ\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n",[8,12,15,18,21],{"id":9,"text":10,"depth":11},"what-a-plugin-brings","What a plugin brings",2,{"id":13,"text":14,"depth":11},"three-forms","Three forms",{"id":16,"text":17,"depth":11},"what-a-plugin-cannot-do","What a plugin cannot do",{"id":19,"text":20,"depth":11},"where-it-comes-from","Where it comes from",{"id":22,"text":23,"depth":11},"where-to-start","Where to start",1793889381991]