[{"data":1,"prerenderedAt":46},["ShallowReactive",2],{"doc:en:integrations":3},{"title":4,"lede":5,"html":6,"headings":7},"Jira, Trello, GitHub, and Linear","Escouade imports tickets from Jira, Trello, GitHub Issues, and Linear into the Kanban, with their acceptance criteria, then keeps their status up to date and leaves comments on them as the work goes. This page covers connecting, importing, and syncing.","\u003Cp>\u003Cimg src=\"\u002Fimages\u002Fen\u002Fintegrations.jpg\" alt=\"The “Import tickets” window: Jira tickets filtered by “Assigned to me”, with their detected criteria\" width=\"1920\" height=\"960\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fp>\n\u003Ch2 id=\"connecting-a-service\">Connecting a service\u003C\u002Fh2>\n\u003Cp>Accounts are connected in Settings › Integrations, “Connected accounts” group (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fsettings-integrations\u002F\">Integrations settings\u003C\u002Fa>). For each service, “Connect…” opens a form. “Connect” checks the credentials with the service (“Checking…”), then the line reads “Connected · ” followed by who you are there (for example \u003Ccode>ada@atlas.dev · atlas.atlassian.net\u003C\u002Fcode>). If the service refuses, the reason shows under the form. The connection is saved at once: it does not go through “Save”.\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Service\u003C\u002Fth>\n\u003Cth>What you give\u003C\u002Fth>\n\u003Cth>Where to get it\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Jira\u003C\u002Ftd>\n\u003Ctd>“Site” (\u003Ccode class=\"key\">atlas.atlassian.net\u003C\u002Fcode>, over https), “Email”, and “API token”\u003C\u002Ftd>\n\u003Ctd>“Create an Atlassian API token”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Trello\u003C\u002Ftd>\n\u003Ctd>“API key” and “Token”\u003C\u002Ftd>\n\u003Ctd>“Get an API key”, then “Get a token for this key” (available once the key is typed: a read and write token that never expires)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>GitHub\u003C\u002Ftd>\n\u003Ctd>“Token”, optional\u003C\u002Ftd>\n\u003Ctd>“Create a GitHub token”. Left empty, Escouade uses the one from the \u003Ccode class=\"key\">gh\u003C\u002Fcode> CLI (\u003Ccode>gh auth login\u003C\u002Fcode>); the account then shows with “· via gh”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Linear\u003C\u002Ftd>\n\u003Ctd>“API key”\u003C\u002Ftd>\n\u003Ctd>“Create a Linear API key”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>“Disconnect” forgets the account and its secrets. Projects keep their links, unused until you connect again.\u003C\u002Fp>\n\u003Ch3 id=\"where-the-tokens-are-kept\">Where the tokens are kept\u003C\u002Fh3>\n\u003Cp>Tokens stay on your machine, apart from your settings, and are only used for calls to these services. Escouade stores them in the system keychain: Credential Manager on Windows, Keychain on macOS. On Linux, which has no supported keychain, they stay in \u003Ccode>~\u002F.escouade\u002Fintegrations.json\u003C\u002Fcode>, readable by you alone.\u003C\u002Fp>\n\u003Cp>When the keychain refuses a token on Windows or macOS, it stays in that file and the tab says so: “System keychain unavailable: the token stays in ~\u002F.escouade\u002Fintegrations.json.” If the keychain exists but cannot be read, the tab says “System keychain unreadable: restart Escouade or reconnect the account.” and no call goes out without the tokens. For GitHub through \u003Ccode class=\"key\">gh\u003C\u002Fcode>, Escouade keeps no token.\u003C\u002Fp>\n\u003Ch2 id=\"linking-a-project-to-a-source\">Linking a project to a source\u003C\u002Fh2>\n\u003Cp>A project links to one place per service: a Jira project, a Trello board, a GitHub repository, or a Linear team. In Settings › Integrations, the “Sources linked to \u003Ccode class=\"key\">&lt;project&gt;\u003C\u002Fcode>” group offers, for each connected service, a list: “Jira project”, “Trello board”, “GitHub Issues repository”, “Linear team”. “None” unlinks the service. For GitHub, the project’s own repository, when its remote is on GitHub, comes first (“(the project’s repository)”).\u003C\u002Fp>\n\u003Cp>Choosing a source loads its statuses and pre-fills the status mapping (see below). Then save the settings.\u003C\u002Fp>\n\u003Cp>From the Kanban, “Import” with no linked source shows “No source linked to this project” and “Link a source”, which opens this same tab.\u003C\u002Fp>\n\u003Ch2 id=\"importing-tickets\">Importing tickets\u003C\u002Fh2>\n\u003Cp>In the \u003Ca href=\"\u002Fen\u002Fdocs\u002Fboard\u002F\">Kanban\u003C\u002Fa>, “Import” (⤓) opens the “Import tickets” window. It adds the tickets you pick to the end of “To do”.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>One tab per linked and connected source (the service, the source’s name, and the number of tickets you picked in it). “⚙ Manage sources” opens the settings.\u003C\u002Fli>\n\u003Cli>The search field searches the chosen source. The search runs 300 ms after the last keystroke.\u003C\u002Fli>\n\u003Cli>Filter chips are clicked to turn on or off. The field and the chips depend on the service:\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Service\u003C\u002Fth>\n\u003Cth>Search field\u003C\u002Fth>\n\u003Cth>Chips\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Jira\u003C\u002Ftd>\n\u003Ctd>“Search by key or text…”\u003C\u002Ftd>\n\u003Ctd>“Assigned to me”, “Active sprint”, “To do”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Trello\u003C\u002Ftd>\n\u003Ctd>“Search for a card…”\u003C\u002Ftd>\n\u003Ctd>“My cards”, then one chip per list of the board\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>GitHub\u003C\u002Ftd>\n\u003Ctd>“Search for an issue…” (a number, \u003Ccode class=\"key\">42\u003C\u002Fcode> or \u003Ccode class=\"key\">#42\u003C\u002Fcode>, finds the issue)\u003C\u002Ftd>\n\u003Ctd>“Assigned to me”, then the repository’s labels (twelve at most)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Linear\u003C\u002Ftd>\n\u003Ctd>“Search by identifier (ENG-42) or title…”\u003C\u002Ftd>\n\u003Ctd>“My issues”, then one chip per workflow state that is neither completed nor canceled\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Only open tickets are offered: not those in Jira’s “Done” category, nor closed GitHub issues (pull requests are left out), nor completed or canceled Linear issues.\u003C\u002Fp>\n\u003Cp>Each row shows the key, the title, the type (Bug, Story, Task, Card, Issue), the priority, the assignee, and the state, plus “✓ 2 criteria detected” (on hover: which ones). A ticket already in the Kanban is grayed out (“Already in the Kanban”) and cannot be picked. Tickets arrive in pages; “Show more” loads the next one, and the line above the list says “50 shown of 312” when the service counts more tickets than it has sent.\u003C\u002Fp>\n\u003Cp>To import:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Check the tickets (one click, or \u003Ccode class=\"key\">Space\u003C\u002Fcode> or \u003Ccode class=\"key\">Enter\u003C\u002Fcode> on a row), or “Select all” for those in the list that are not already imported. The selection is kept from one search, one page, and one source to the next.\u003C\u002Fli>\n\u003Cli>Choose “Max loops” (3, 5, or 8): the same number for every imported ticket.\u003C\u002Fli>\n\u003Cli>Click “Import 3 tickets”.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Each imported ticket has its own Escouade key (\u003Ccode class=\"key\">DEM-7\u003C\u002Fcode>) and keeps, on its card, the badge of its service with its key there (\u003Ccode class=\"key\">ATL-1294\u003C\u002Fcode>): a click opens it in the service. Its description takes over the external ticket’s, and ends with a line “Jira ticket ATL-1294: \u003Ccode class=\"key\">&lt;address&gt;\u003C\u002Fcode>”. A message confirms (“3 tickets imported from Jira and Trello”). With the autopilot on, imported tickets start on their own (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fautopilot\u002F\">The autopilot\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"the-acceptance-criteria\">The acceptance criteria\u003C\u002Fh3>\n\u003Cp>With “Extract the acceptance criteria” on (the default), Escouade looks for the criteria in the ticket:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Jira and GitHub: the list items under a heading or a line that names them (“Acceptance criteria”, “Definition of done”, “AC”, “DoD”, or the French “Critères d’acceptation”), otherwise the checkboxes (\u003Ccode>- [ ]\u003C\u002Fcode>) of the description;\u003C\u002Fli>\n\u003Cli>Trello: the items of the checklist that goes by this name, otherwise those of all the checklists, otherwise those the description lists;\u003C\u002Fli>\n\u003Cli>Linear: as for Jira and GitHub, in the description.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>It keeps twenty criteria at most, of 300 characters at most. With no criterion found, or with the setting off, the ticket gets the two default criteria. A Jira description is converted to Markdown before it is searched.\u003C\u002Fp>\n\u003Ch2 id=\"importing-by-label\">Importing by label\u003C\u002Fh2>\n\u003Cp>Settings › Integrations › “Automatic import” lets Escouade import on its own:\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Setting\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>“Import labeled tickets”\u003C\u002Ftd>\n\u003Ctd>The open tickets of the linked sources that carry the label arrive in “To do”\u003C\u002Ftd>\n\u003Ctd>Off\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>“Label”\u003C\u002Ftd>\n\u003Ctd>The Jira, Trello, GitHub, or Linear label\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">claude-ready\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>“Check every”\u003C\u002Ftd>\n\u003Ctd>The interval between two passes: 5, 15, or 60 min\u003C\u002Ftd>\n\u003Ctd>15 min\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>A pass looks, in each project, at the linked sources whose account is connected. Tickets arrive with 5 loops at most, and a message announces them (“3 tickets imported from Jira into demo”). A ticket the project has already imported is never brought back, even if you have deleted it from the Kanban since. The first pass happens shortly after you turn it on.\u003C\u002Fp>\n\u003Ch2 id=\"status-and-comments-follow-the-ticket\">Status and comments follow the ticket\u003C\u002Fh2>\n\u003Cp>When an imported ticket changes column, Escouade updates the external ticket. The links, the status mapping, and the comments are set per project; the three settings of the “Sync” group apply to every project.\u003C\u002Fp>\n\u003Ch3 id=\"status-mapping\">Status mapping\u003C\u002Fh3>\n\u003Cp>The “Status mapping” group (once a source is linked) has one row per Kanban column and, for each linked service, a list of statuses. “— unchanged” leaves the external ticket as it is. Choosing a source pre-fills the columns like this:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>“In progress” and “To review”: the status that looks like “in progress” (\u003Ccode>In Progress\u003C\u002Fcode>, \u003Ccode>En cours\u003C\u002Fcode>, \u003Ccode class=\"key\">Doing\u003C\u002Fcode>, \u003Ccode class=\"key\">WIP\u003C\u002Fcode>, \u003Ccode>In development\u003C\u002Fcode>, \u003Ccode class=\"key\">Started\u003C\u002Fcode>…);\u003C\u002Fli>\n\u003Cli>“Done”: the status that looks like “to review” (\u003Ccode>To test\u003C\u002Fcode>, \u003Ccode class=\"key\">Testing\u003C\u002Fcode>, \u003Ccode class=\"key\">QA\u003C\u002Fcode>, \u003Ccode>In Review\u003C\u002Fcode>, \u003Ccode class=\"key\">Review\u003C\u002Fcode>, \u003Ccode class=\"key\">Recette\u003C\u002Fcode>, \u003Ccode>À valider\u003C\u002Fcode>, \u003Ccode class=\"key\">Validation\u003C\u002Fcode>, \u003Ccode class=\"key\">Test\u003C\u002Fcode>…);\u003C\u002Fli>\n\u003Cli>“To do”: unchanged.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>What “status” means depends on the service: a workflow transition for Jira, the list the card sits in for Trello, a workflow state for Linear. For GitHub, they are “Open”, “Closed”, or a label of the repository (marked ◆): “Closed” closes the issue, a label reopens it if needed and removes the other labels of the mapping.\u003C\u002Fp>\n\u003Cp>The last column, “Comment”, chooses the columns whose arrival writes a comment (by default “To review” and “Done”). The comment says where the ticket stands:\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Column\u003C\u002Fth>\n\u003Cth>Comment\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>“To do”\u003C\u002Ftd>\n\u003Ctd>“Escouade: DEM-5 is back in “To do”.”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>“In progress”\u003C\u002Ftd>\n\u003Ctd>“Escouade: DEM-5 is picked up by an agent (branch ticket\u002Fdem-5).”\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>“To review”\u003C\u002Ftd>\n\u003Ctd>“Escouade: DEM-5 is ready to review.” (with “(partial goal)” where it applies), the criteria (✓ or ○, with the agent’s note), and “What was done”.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>“Done”\u003C\u002Ftd>\n\u003Ctd>“Escouade: DEM-5 is done — ” followed by the outcome (“⤵ Merged into main · squash”), and the pull request’s link if there is one.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch3 id=\"sync-settings\">Sync settings\u003C\u002Fh3>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Setting\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>“Update the external status”\u003C\u002Ftd>\n\u003Ctd>When an imported ticket changes column, its external ticket takes the status of the mapping\u003C\u002Ftd>\n\u003Ctd>On\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>“Post a summary on every loop”\u003C\u002Ftd>\n\u003Ctd>At each new loop, a comment gives the criteria met and the agent’s notes (“Escouade: DEM-5, loop 2\u002F5 — 1\u002F3 criteria met.”)\u003C\u002Ftd>\n\u003Ctd>Off\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>“Extract the acceptance criteria”\u003C\u002Ftd>\n\u003Ctd>See above\u003C\u002Ftd>\n\u003Ctd>On\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch3 id=\"the-language-of-comments\">The language of comments\u003C\u002Fh3>\n\u003Cp>Comments are published for your team: they are written in the “Language of texts written by Claude” (Settings › Application, see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fsettings-application\u002F\">Application settings\u003C\u002Fa>), not in the interface’s language. The outcome of a done ticket is quoted there in that same language.\u003C\u002Fp>\n\u003Ch2 id=\"failed-syncs\">Failed syncs\u003C\u002Fh2>\n\u003Cp>Every change to pass on is kept in a queue, \u003Ccode>~\u002F.escouade\u002Fsync-queue.json\u003C\u002Fcode>, until the service has taken it. A ticket’s changes go in order, one after the other: a change that fails holds back the next ones of the same ticket, not those of other tickets. A status transition replaces the ticket’s one that has not gone out yet, and a ticket that goes back to an earlier column cancels the transition that had not gone out.\u003C\u002Fp>\n\u003Cp>A card whose sync failed shows a ⚠. A click on it shows the reason (“Jira refuses these credentials (401)”, “Jira: no transition from “In progress” to “Done” for ATL-1294”…) and the “Resync” button.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>When the service can’t be reached, is down or overloaded, or refuses the credentials (which you can fix), the failure may pass later: Escouade tries again on its own, after 1, 5, 15, then 60 minutes, the last wait being repeated, for 24 hours from the first failure.\u003C\u002Fli>\n\u003Cli>A refusal that trying again would not change (a request refused as it is, a ticket gone, no transition to the status) is set aside at once, like anything that still fails after a day. It no longer holds back the ticket’s next changes.\u003C\u002Fli>\n\u003Cli>When Escouade starts, everything that was waiting goes again (except what was set aside).\u003C\u002Fli>\n\u003Cli>“Resync” sends again right away, set-aside changes included. When nothing is left to send, it gives the external ticket the status of its column again (without writing a comment twice). The ⚠ goes as soon as everything has gone through.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Deleting the ticket from the Kanban drops whatever was waiting for it.\u003C\u002Fp>\n\u003Ch2 id=\"see-also\">See also\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fen\u002Fdocs\u002Fboard\u002F\">The Kanban\u003C\u002Fa>: the card of an imported ticket.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fen\u002Fdocs\u002Fsettings-integrations\u002F\">Integrations settings\u003C\u002Fa>: the complete list of settings.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fen\u002Fdocs\u002Fmcp\u002F\">The MCP server\u003C\u002Fa>: a ticket’s external ticket is read with \u003Ccode class=\"key\">get_ticket\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n",[8,12,16,19,22,25,28,31,34,37,40,43],{"id":9,"text":10,"depth":11},"connecting-a-service","Connecting a service",2,{"id":13,"text":14,"depth":15},"where-the-tokens-are-kept","Where the tokens are kept",3,{"id":17,"text":18,"depth":11},"linking-a-project-to-a-source","Linking a project to a source",{"id":20,"text":21,"depth":11},"importing-tickets","Importing tickets",{"id":23,"text":24,"depth":15},"the-acceptance-criteria","The acceptance criteria",{"id":26,"text":27,"depth":11},"importing-by-label","Importing by label",{"id":29,"text":30,"depth":11},"status-and-comments-follow-the-ticket","Status and comments follow the ticket",{"id":32,"text":33,"depth":15},"status-mapping","Status mapping",{"id":35,"text":36,"depth":15},"sync-settings","Sync settings",{"id":38,"text":39,"depth":15},"the-language-of-comments","The language of comments",{"id":41,"text":42,"depth":11},"failed-syncs","Failed syncs",{"id":44,"text":45,"depth":11},"see-also","See also",1791926756381]