[{"data":1,"prerenderedAt":82},["ShallowReactive",2],{"doc:fr:escouade-yml":3},{"title":4,"lede":5,"html":6,"headings":7},".escouade.yml","Un fichier .escouade.yml à la racine du dépôt porte les réglages du projet que toute l’équipe partage. Cette page est la référence de son format : chaque clé, ses valeurs, ses règles de lecture, et ce qu’Escouade en fait.","\u003Ch2 id=\"a-quoi-il-sert\">À quoi il sert\u003C\u002Fh2>\n\u003Cp>Le fichier se commite avec le code. Chaque personne qui ajoute le dépôt dans Escouade retrouve la même façon de travailler : un worktree par agent, les mêmes préfixes de branches, les mêmes commandes de préparation, la même validation des tickets. Escouade le lit à l’ouverture du projet, le relit quand il change, et sait l’écrire depuis un projet déjà réglé.\u003C\u002Fp>\n\u003Ch2 id=\"un-exemple-complet\">Un exemple complet\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yaml\"># yaml-language-server: $schema=https:\u002F\u002Fescouade.dev\u002Fschemas\u002Fescouade.schema.json\nversion: 1\nagents:\n  engine: claude\nprivate: false\nworktrees:\n  per_agent: true\n  at_first_message: true\n  base: target\n  dir: ..\u002Fapp-worktrees\n  copy:\n    - &#39;.env*&#39;\n    - config\u002Flocal.json\n  setup:\n    - npm ci\n    - command: cargo fetch\n      cwd: src-tauri\n  teardown:\n    - command: docker compose down\n      shell: bash\nlaunch:\n  - name: web\n    command: npm run dev\n    cwd: web\n  - name: api\n    command: cargo run\n    cwd: api\ngit:\n  agent_branch_prefix: agent\u002F\n  ticket_branch_prefix: ticket\u002F\n  commit_mode: agent\n  conventional_commits: true\nboard:\n  on_approve: merge\n  target_branch: main\n  merge_strategy: squash\n  draft_pr: false\n  test_command: npm test\n  tests_before_approve: true\n  on_conflict: agent\n  remove_worktree: true\n  model: sonnet\n  effort: medium\n  mode: auto\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Un fichier minimal ne dit que ce qu’il veut régler :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">version: 1\nworktrees:\n  per_agent: true\nboard:\n  merge_strategy: rebase\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"les-regles-du-format\">Les règles du format\u003C\u002Fh2>\n\u003Ch3 id=\"le-style-des-cles\">Le style des clés\u003C\u002Fh3>\n\u003Cp>Les clés sont en anglais, en \u003Ccode class=\"key\">snake_case\u003C\u002Fcode> (mots en minuscules séparés par \u003Ccode class=\"key\">_\u003C\u002Fcode>), rangées en groupes par thème : \u003Ccode class=\"key\">agents\u003C\u002Fcode>, \u003Ccode class=\"key\">worktrees\u003C\u002Fcode>, \u003Ccode class=\"key\">git\u003C\u002Fcode> et \u003Ccode class=\"key\">board\u003C\u002Fcode> regroupent leurs clés en retrait ; \u003Ccode class=\"key\">version\u003C\u002Fcode> et \u003Ccode class=\"key\">launch\u003C\u002Fcode> sont au premier niveau. L’ordre des groupes et des clés est libre. Le fichier est du YAML 1.2 : un \u003Ccode class=\"key\">#\u003C\u002Fcode> commence un commentaire, et les commentaires sont gardés quand Escouade réécrit le fichier.\u003C\u002Fp>\n\u003Ch3 id=\"la-cle-version\">La clé version\u003C\u002Fh3>\n\u003Cp>\u003Ccode class=\"key\">version\u003C\u002Fcode> est le numéro du format du fichier, un entier : \u003Ccode class=\"key\">1\u003C\u002Fcode> aujourd’hui. Escouade l’écrit en tête de chaque fichier qu’il crée. Elle n’est pas obligatoire : sans elle, le fichier est lu comme la version 1, et le groupe « .escouade.yml » de Réglages › Projets le signale (« pas de clé « version » : lu comme la version 1 »). Une valeur qui n’est pas un entier d’au moins 1 (\u003Ccode class=\"key\">one\u003C\u002Fcode>, \u003Ccode class=\"key\">'1'\u003C\u002Fcode>, \u003Ccode class=\"key\">0\u003C\u002Fcode>) est signalée de la même façon, et le fichier est lu comme la version 1.\u003C\u002Fp>\n\u003Ch3 id=\"une-version-plus-ancienne-ou-plus-recente\">Une version plus ancienne ou plus récente\u003C\u002Fh3>\n\u003Cp>Le format peut évoluer : chaque version d’Escouade sait lire celles qu’elle connaît. Un fichier d’une version plus ancienne est migré vers la version actuelle à la lecture, d’une version à la suivante, sans être réécrit sur le disque : il reste valable tel quel. Un fichier d’une version plus récente que celle qu’Escouade connaît est lu au mieux : les clés connues s’appliquent, les autres sont signalées comme inconnues, avec l’avertissement « fait pour une version plus récente d’Escouade (version 2 du fichier, 1 connue ici) : lu au mieux ». Escouade ne réécrit pas un tel fichier : « Exporter vers .escouade.yml » le refuse.\u003C\u002Fp>\n\u003Ch3 id=\"une-cle-absente\">Une clé absente\u003C\u002Fh3>\n\u003Cp>Toutes les clés sont facultatives, \u003Ccode class=\"key\">version\u003C\u002Fcode> comprise. Une clé absente ne change rien : le projet garde sa valeur. La colonne « Absente » des tableaux ci-dessous donne celle d’un projet neuf, la valeur par défaut d’Escouade. Retirer une clé du fichier ne remet pas le projet à cette valeur : il garde la dernière que le fichier lui a donnée.\u003C\u002Fp>\n\u003Ch3 id=\"une-cle-inconnue\">Une clé inconnue\u003C\u002Fh3>\n\u003Cp>Une clé qu’Escouade ne connaît pas (une faute de frappe, ou une clé d’une version plus récente) n’empêche pas la lecture : elle est ignorée et signalée avec sa ligne. Quand elle ressemble à une clé connue du même groupe, ou porte le nom d’une clé d’un autre groupe, Escouade propose la bonne :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">worktrees.per_agnet\u003C\u002Fcode> : « clé inconnue : worktrees.per_agnet (voulais-tu dire worktrees.per_agent ?), ignorée » ;\u003C\u002Fli>\n\u003Cli>\u003Ccode>worktrees.test_command\u003C\u002Fcode> : « clé inconnue : worktrees.test_command (voulais-tu dire board.test_command ?), ignorée » ;\u003C\u002Fli>\n\u003Cli>un groupe inconnu, \u003Ccode class=\"key\">bord:\u003C\u002Fcode> par exemple, est signalé de la même façon (« voulais-tu dire board ? »), et tout ce qu’il contient est ignoré.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"une-valeur-invalide\">Une valeur invalide\u003C\u002Fh3>\n\u003Cp>Une valeur du mauvais type ou hors des valeurs permises est ignorée et signalée avec sa ligne et ce qui est attendu ; le reste du fichier s’applique : « valeur invalide pour board.merge_strategy : « fast » (attendu : merge, squash, rebase) (ignorée) ». Dans une liste d’étapes ou de commandes, seule l’entrée invalide est ignorée, les autres restent. Un groupe qui n’est pas une suite de clés (\u003Ccode>board: true\u003C\u002Fcode>) est ignoré entier.\u003C\u002Fp>\n\u003Cp>Un fichier qui n’est pas du YAML lisible (un crochet non fermé, une indentation cassée), ou dont le premier niveau n’est pas une suite de clés, n’applique rien : le message dit pourquoi et à quelle ligne.\u003C\u002Fp>\n\u003Ch2 id=\"les-types-de-valeurs\">Les types de valeurs\u003C\u002Fh2>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Forme YAML\u003C\u002Fth>\n\u003Cth>Exemple\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode> ou \u003Ccode class=\"key\">false\u003C\u002Fcode>, sans guillemets (la casse est libre)\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>per_agent: true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Texte\u003C\u002Ftd>\n\u003Ctd>Une valeur seule, avec ou sans guillemets ; \u003Ccode class=\"key\">''\u003C\u002Fcode> ou \u003Ccode class=\"key\">~\u003C\u002Fcode> vaut un texte vide\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>target_branch: main\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>Un texte, exactement l’une des valeurs permises\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>merge_strategy: squash\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Liste de textes\u003C\u002Ftd>\n\u003Ctd>Une liste YAML, en lignes \u003Ccode>- …\u003C\u002Fcode> ou entre crochets ; une valeur seule vaut une liste d’un élément ; \u003Ccode class=\"key\">[]\u003C\u002Fcode> ou \u003Ccode class=\"key\">~\u003C\u002Fcode> vaut une liste vide\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>copy: config\u002Flocal.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Chemin relatif\u003C\u002Ftd>\n\u003Ctd>Un texte, relatif au dépôt ; un chemin complet (\u003Ccode class=\"key\">\u002F…\u003C\u002Fcode>, \u003Ccode class=\"key\">\\…\u003C\u002Fcode>, \u003Ccode class=\"key\">C:…\u003C\u002Fcode>) ou qui part du dossier personnel (\u003Ccode class=\"key\">~…\u003C\u002Fcode>) est refusé\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>dir: ..\u002Fapp-worktrees\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Préfixe de branche\u003C\u002Ftd>\n\u003Ctd>Un texte qui peut commencer un nom de branche git : ni espace, ni \u003Ccode class=\"key\">..\u003C\u002Fcode>, \u003Ccode class=\"key\">~\u003C\u002Fcode>, \u003Ccode class=\"key\">^\u003C\u002Fcode>, \u003Ccode class=\"key\">:\u003C\u002Fcode>, \u003Ccode class=\"key\">?\u003C\u002Fcode>, \u003Ccode class=\"key\">*\u003C\u002Fcode>, \u003Ccode class=\"key\">[\u003C\u002Fcode>, \u003Ccode class=\"key\">\\\u003C\u002Fcode> ou \u003Ccode class=\"key\">@{\u003C\u002Fcode>, ni \u003Ccode class=\"key\">-\u003C\u002Fcode> ou \u003Ccode class=\"key\">\u002F\u003C\u002Fcode> au début, ni \u003Ccode class=\"key\">\u002F\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>agent_branch_prefix: agent\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode class=\"key\">'true'\u003C\u002Fcode> entre guillemets est un texte, pas un booléen, et \u003Ccode class=\"key\">yes\u003C\u002Fcode>, \u003Ccode class=\"key\">no\u003C\u002Fcode>, \u003Ccode class=\"key\">on\u003C\u002Fcode>, \u003Ccode class=\"key\">off\u003C\u002Fcode> ne sont pas des booléens (YAML 1.2). Un nombre est lu comme un texte là où un texte est attendu (\u003Ccode>target_branch: 2024\u003C\u002Fcode> donne la branche \u003Ccode class=\"key\">2024\u003C\u002Fcode>). Un motif qui commence par \u003Ccode class=\"key\">*\u003C\u002Fcode> s’écrit entre guillemets (\u003Ccode class=\"key\">'*.local'\u003C\u002Fcode>) : sans eux, YAML y lit un alias.\u003C\u002Fp>\n\u003Ch2 id=\"les-cles\">Les clés\u003C\u002Fh2>\n\u003Ch3 id=\"agents\">agents\u003C\u002Fh3>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Clé\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Valeurs\u003C\u002Fth>\n\u003Cth>Absente\u003C\u002Fth>\n\u003Cth>Exemple\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">agents.engine\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">claude\u003C\u002Fcode>, \u003Ccode class=\"key\">codex\u003C\u002Fcode>, \u003Ccode class=\"key\">copilot\u003C\u002Fcode>, \u003Ccode class=\"key\">opencode\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">claude\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>engine: codex\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Le harness des nouveaux agents et des tickets du projet qui n’en choisissent pas un autre (« Harness par défaut »).\u003C\u002Fp>\n\u003Ch3 id=\"private\">private\u003C\u002Fh3>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Clé\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Valeurs\u003C\u002Fth>\n\u003Cth>Absente\u003C\u002Fth>\n\u003Cth>Exemple\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">private\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>le réglage de chaque machine\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>private: true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>« Projet privé » : les agents des autres projets ne le voient pas par le serveur MCP d’Escouade et ne lisent pas ses fichiers (voir \u003Ca href=\"\u002Fdocs\u002Fsettings-projects\u002F\">Réglages › Projets\u003C\u002Fa>). Le dépôt est sensible pour toute l’équipe, d’où sa place dans le fichier ; les comptes réservés au projet, eux, restent ceux de chaque machine.\u003C\u002Fp>\n\u003Cp>Le fichier peut rendre un projet privé, jamais le rendre public : sur une machine où le projet est privé, \u003Ccode>private: false\u003C\u002Fcode> n’est pas appliqué, le réglage devient un réglage local de cette machine et un avertissement le dit (« private: false ignoré : ce projet est privé sur cette machine, décoche « Projet privé » pour le rendre public »). Pour le rendre public, décoche « Projet privé » toi-même.\u003C\u002Fp>\n\u003Ch3 id=\"worktrees\">worktrees\u003C\u002Fh3>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Clé\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Valeurs\u003C\u002Fth>\n\u003Cth>Absente\u003C\u002Fth>\n\u003Cth>Exemple\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">worktrees.per_agent\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>per_agent: true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>worktrees.at_first_message\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>at_first_message: false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">worktrees.base\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Texte\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">head\u003C\u002Fcode>, \u003Ccode class=\"key\">target\u003C\u002Fcode> ou un nom de branche\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">head\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>base: origin\u002Frelease\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">worktrees.dir\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Chemin relatif\u003C\u002Ftd>\n\u003Ctd>Un dossier relatif au dépôt\u003C\u002Ftd>\n\u003Ctd>vide : \u003Ccode class=\"key\">.claude\u002Fworktrees\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>dir: .worktrees\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">worktrees.copy\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Liste de textes\u003C\u002Ftd>\n\u003Ctd>Des motifs de fichiers (\u003Ccode class=\"key\">*\u003C\u002Fcode>, \u003Ccode class=\"key\">**\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">['.env*']\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>copy: ['.env*', config\u002Flocal.json]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">worktrees.setup\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Liste d’étapes\u003C\u002Ftd>\n\u003Ctd>Voir \u003Ca href=\"#les-etapes-de-worktree\">les étapes de worktree\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>aucune\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>setup: npm ci\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">worktrees.teardown\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Liste d’étapes\u003C\u002Ftd>\n\u003Ctd>Voir \u003Ca href=\"#les-etapes-de-worktree\">les étapes de worktree\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>aucune\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>teardown: [docker compose down]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">per_agent\u003C\u002Fcode> : « Un worktree par agent », chaque nouvel agent dans un worktree à lui (voir \u003Ca href=\"\u002Fdocs\u002Fworktrees\u002F\">les worktrees\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">at_first_message\u003C\u002Fcode> : « Créer le worktree au premier message, au nom de l’agent ». Le worktree d’un nouvel agent attend son premier message, qui le nomme : sa branche et son dossier prennent ce nom (voir \u003Ca href=\"\u002Fdocs\u002Fworktrees\u002F#au-premier-message\">au premier message\u003C\u002Fa>). \u003Ccode class=\"key\">false\u003C\u002Fcode> le crée tout de suite, en \u003Ccode class=\"key\">agent-N\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">base\u003C\u002Fcode> : « Branche de départ des nouveaux worktrees », la branche dont part le worktree d’un nouvel agent, sa base : \u003Ccode class=\"key\">head\u003C\u002Fcode> (la branche du dossier), \u003Ccode class=\"key\">target\u003C\u002Fcode> (la branche cible du Kanban) ou le nom d’une branche, locale ou distante (\u003Ccode class=\"key\">origin\u002Frelease\u003C\u002Fcode>). Une branche qui s’appelle \u003Ccode class=\"key\">head\u003C\u002Fcode> ou \u003Ccode class=\"key\">target\u003C\u002Fcode> s’écrit \u003Ccode class=\"key\">refs\u002Fheads\u002Ftarget\u003C\u002Fcode>. Voir \u003Ca href=\"\u002Fdocs\u002Fworktrees\u002F#la-branche-de-depart\">la branche de départ\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">dir\u003C\u002Fcode> : « Dossier des worktrees ». Il ne peut pas être le dossier du projet, un dossier qui le contient, ni un dossier dans \u003Ccode class=\"key\">.git\u003C\u002Fcode> : un tel chemin est signalé et ignoré.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">copy\u003C\u002Fcode> : « Fichiers copiés dans les worktrees », les fichiers non suivis par git copiés dans chaque nouveau worktree.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">setup\u003C\u002Fcode> : « À l’ouverture d’un worktree », lancées l’une après l’autre dans chaque nouveau worktree, avant le premier message de son agent. Des commandes : elles attendent ton accord.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">teardown\u003C\u002Fcode> : « Avant sa suppression », lancées dans un worktree avant qu’Escouade le supprime. Des commandes : elles attendent ton accord.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"launch\">launch\u003C\u002Fh3>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Clé\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Valeurs\u003C\u002Fth>\n\u003Cth>Absente\u003C\u002Fth>\n\u003Cth>Exemple\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">launch\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Liste de commandes de lancement\u003C\u002Ftd>\n\u003Ctd>Voir \u003Ca href=\"#les-commandes-de-lancement\">les commandes de lancement\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>aucune\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>- name: web\u003C\u002Fcode> puis \u003Ccode>command: npm run dev\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Les commandes de « Lancement » du projet (serveurs de développement, watchers), chacune dans son terminal (voir \u003Ca href=\"\u002Fdocs\u002Flaunch\u002F\">le lancement\u003C\u002Fa>). Des commandes : elles attendent ton accord.\u003C\u002Fp>\n\u003Ch3 id=\"git\">git\u003C\u002Fh3>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Clé\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Valeurs\u003C\u002Fth>\n\u003Cth>Absente\u003C\u002Fth>\n\u003Cth>Exemple\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>git.agent_branch_prefix\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Préfixe de branche\u003C\u002Ftd>\n\u003Ctd>Un début de nom de branche\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">escouade\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>agent_branch_prefix: agent\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>git.ticket_branch_prefix\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Préfixe de branche\u003C\u002Ftd>\n\u003Ctd>Un début de nom de branche\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">ticket\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>ticket_branch_prefix: tickets\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">git.commit_mode\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">agent\u003C\u002Fcode>, \u003Ccode class=\"key\">direct\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">agent\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>commit_mode: direct\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>git.conventional_commits\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>conventional_commits: false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">agent_branch_prefix\u003C\u002Fcode> : la branche d’un nouvel agent s’appelle \u003Ccode class=\"key\">&lt;préfixe&gt;&lt;nom&gt;\u003C\u002Fcode>. Vide (\u003Ccode class=\"key\">''\u003C\u002Fcode>), c’est son nom seul.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">ticket_branch_prefix\u003C\u002Fcode> : la branche d’un ticket s’appelle \u003Ccode class=\"key\">&lt;préfixe&gt;&lt;clé&gt;\u003C\u002Fcode> (\u003Ccode class=\"key\">ticket\u002FDEM-12\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">commit_mode\u003C\u002Fcode> : « Commit », qui écrit les commits demandés depuis le panneau des fichiers : \u003Ccode class=\"key\">agent\u003C\u002Fcode> (« Rédigé par l’agent ») ou \u003Ccode class=\"key\">direct\u003C\u002Fcode> (« Direct, avec un message proposé »).\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">conventional_commits\u003C\u002Fcode> : « Message de commit généré », les messages au format Conventional Commits.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"board\">board\u003C\u002Fh3>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Clé\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Valeurs\u003C\u002Fth>\n\u003Cth>Absente\u003C\u002Fth>\n\u003Cth>Exemple\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.on_approve\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">merge\u003C\u002Fcode>, \u003Ccode class=\"key\">pr\u003C\u002Fcode>, \u003Ccode class=\"key\">push\u003C\u002Fcode>, \u003Ccode class=\"key\">keep\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">merge\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>on_approve: pr\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.target_branch\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Texte\u003C\u002Ftd>\n\u003Ctd>Un nom de branche\u003C\u002Ftd>\n\u003Ctd>vide : la branche du dossier au premier ticket\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>target_branch: develop\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.merge_strategy\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">merge\u003C\u002Fcode>, \u003Ccode class=\"key\">squash\u003C\u002Fcode>, \u003Ccode class=\"key\">rebase\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">squash\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>merge_strategy: rebase\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.draft_pr\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>draft_pr: true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.test_command\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Texte\u003C\u002Ftd>\n\u003Ctd>Une commande\u003C\u002Ftd>\n\u003Ctd>vide : aucune\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>test_command: npm test\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>board.tests_before_approve\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tests_before_approve: true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.on_conflict\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">ask\u003C\u002Fcode>, \u003Ccode class=\"key\">agent\u003C\u002Fcode>, \u003Ccode class=\"key\">abort\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">ask\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>on_conflict: agent\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>board.remove_worktree\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Booléen\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>remove_worktree: false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.model\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Texte\u003C\u002Ftd>\n\u003Ctd>Un modèle, tel que le harness le nomme\u003C\u002Ftd>\n\u003Ctd>vide : celui du compte\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>model: opus\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.effort\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">low\u003C\u002Fcode>, \u003Ccode class=\"key\">medium\u003C\u002Fcode>, \u003Ccode class=\"key\">high\u003C\u002Fcode>, \u003Ccode class=\"key\">xhigh\u003C\u002Fcode>, \u003Ccode class=\"key\">max\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>vide : celui du compte\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>effort: high\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">board.mode\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Valeur parmi une liste\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">auto\u003C\u002Fcode>, \u003Ccode class=\"key\">default\u003C\u002Fcode>, \u003Ccode class=\"key\">plan\u003C\u002Fcode>, \u003Ccode class=\"key\">acceptEdits\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>vide : celui du compte\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>mode: plan\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Ccode class=\"key\">on_approve\u003C\u002Fcode> : « Quand je valide un ticket « À tester » » : merger sa branche dans la branche cible (\u003Ccode class=\"key\">merge\u003C\u002Fcode>), ouvrir une pull request (\u003Ccode class=\"key\">pr\u003C\u002Fcode>), pousser sa branche (\u003Ccode class=\"key\">push\u003C\u002Fcode>), ou la garder telle quelle (\u003Ccode class=\"key\">keep\u003C\u002Fcode>) (voir \u003Ca href=\"\u002Fdocs\u002Fboard\u002F\">le Kanban\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">target_branch\u003C\u002Fcode> : « Branche cible », où les tickets se mergent, et la base de leur branche et de leur pull request.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">agents_from_target\u003C\u002Fcode> : l’ancienne clé de \u003Ccode class=\"key\">worktrees.base\u003C\u002Fcode>, encore lue quand le fichier n’a pas \u003Ccode class=\"key\">worktrees.base\u003C\u002Fcode> (\u003Ccode class=\"key\">true\u003C\u002Fcode> vaut \u003Ccode class=\"key\">target\u003C\u002Fcode>, \u003Ccode class=\"key\">false\u003C\u002Fcode> vaut \u003Ccode class=\"key\">head\u003C\u002Fcode>), avec un avertissement. « Exporter vers .escouade.yml » la remplace par \u003Ccode class=\"key\">worktrees.base\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">merge_strategy\u003C\u002Fcode> : « Stratégie » du merge : commit de merge, squash ou rebase.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">draft_pr\u003C\u002Fcode> : « PR en brouillon ».\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">test_command\u003C\u002Fcode> : « Commande de tests ». Une commande : elle attend ton accord.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">tests_before_approve\u003C\u002Fcode> : « Relancer les tests avant » la validation d’un ticket ; sans commande de tests, rien ne se relance.\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">on_conflict\u003C\u002Fcode> : « En cas de conflit » au merge : te demander (\u003Ccode class=\"key\">ask\u003C\u002Fcode>), laisser l’agent le résoudre (\u003Ccode class=\"key\">agent\u003C\u002Fcode>), ou abandonner (\u003Ccode class=\"key\">abort\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">remove_worktree\u003C\u002Fcode> : « Supprimer le worktree d’un ticket terminé ou supprimé ».\u003C\u002Fli>\n\u003Cli>\u003Ccode class=\"key\">model\u003C\u002Fcode>, \u003Ccode class=\"key\">effort\u003C\u002Fcode>, \u003Ccode class=\"key\">mode\u003C\u002Fcode> : le modèle, l’effort et le mode des agents des tickets (Réglages › Kanban, groupe « Agents »). Une valeur vide (\u003Ccode>model: ''\u003C\u002Fcode>) laisse ceux du compte. \u003Ccode class=\"key\">bypassPermissions\u003C\u002Fcode> n’est jamais dans le fichier : un dépôt ne lève pas les autorisations de qui l’ouvre. Lu, il est refusé (« bypassPermissions ne se partage pas : il se règle sur chaque machine ») ; réglé dans la fenêtre, il reste un réglage local, que l’export n’écrit pas.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"les-etapes-de-worktree\">Les étapes de worktree\u003C\u002Fh2>\n\u003Cp>Chaque élément de \u003Ccode class=\"key\">worktrees.setup\u003C\u002Fcode> et de \u003Ccode class=\"key\">worktrees.teardown\u003C\u002Fcode> est une étape, de l’une de ces deux formes :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">setup:\n  # La commande seule, en texte : lancée par le shell par défaut, à la racine du worktree.\n  - npm ci\n  # Ou ses champs :\n  - command: cargo fetch\n    shell: bash\n    cwd: src-tauri\n\u003C\u002Fcode>\u003C\u002Fpre>\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\">command\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>oui\u003C\u002Ftd>\n\u003Ctd>La ligne de commande, telle que le shell la lit.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">shell\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Le shell qui la lance (voir \u003Ca href=\"#les-shells\">les shells\u003C\u002Fa>). Absent : le shell par défaut du système.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">cwd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Un sous-dossier du worktree, relatif. Absent ou \u003Ccode class=\"key\">.\u003C\u002Fcode> : la racine du worktree.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Une étape sans \u003Ccode class=\"key\">command\u003C\u002Fcode>, ou dont \u003Ccode class=\"key\">cwd\u003C\u002Fcode> est un chemin complet, est signalée et ignorée ; un autre champ (\u003Ccode class=\"key\">env:\u003C\u002Fcode>, \u003Ccode class=\"key\">name:\u003C\u002Fcode>) est signalé comme clé inconnue. Les étapes tournent dans l’ordre du fichier. Une étape seule peut s’écrire sans liste : \u003Ccode>setup: npm ci\u003C\u002Fcode> vaut une liste d’une étape.\u003C\u002Fp>\n\u003Ch2 id=\"les-commandes-de-lancement\">Les commandes de lancement\u003C\u002Fh2>\n\u003Cp>Chaque élément de \u003Ccode class=\"key\">launch\u003C\u002Fcode> est une commande nommée :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">launch:\n  - name: web\n    command: npm run dev -- --port 5173\n    cwd: web\n  - name: docs\n    command: npm run docs\n    shell: pwsh\n\u003C\u002Fcode>\u003C\u002Fpre>\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\">name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Le nom affiché de la commande et de son terminal. Absent : la commande sert de nom.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">command\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>oui\u003C\u002Ftd>\n\u003Ctd>La ligne de commande.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">shell\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Le shell qui la lance. Absent : le shell par défaut du système.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode class=\"key\">cwd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>non\u003C\u002Ftd>\n\u003Ctd>Un sous-dossier du projet, relatif. Absent : la racine du projet.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Contrairement aux étapes, une commande de lancement n’a pas de forme courte : un texte seul est signalé comme valeur invalide. Une commande seule peut s’écrire sans liste (\u003Ccode class=\"key\">launch:\u003C\u002Fcode> suivi directement de \u003Ccode class=\"key\">name:\u003C\u002Fcode> et \u003Ccode class=\"key\">command:\u003C\u002Fcode> en retrait) : elle vaut une liste d’une commande.\u003C\u002Fp>\n\u003Ch2 id=\"les-shells\">Les shells\u003C\u002Fh2>\n\u003Cp>\u003Ccode class=\"key\">shell\u003C\u002Fcode> prend l’identifiant d’un shell qu’Escouade détecte sur la machine :\u003C\u002Fp>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Système\u003C\u002Fth>\n\u003Cth>Identifiants\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Windows\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">pwsh\u003C\u002Fcode> (PowerShell 7), \u003Ccode class=\"key\">powershell\u003C\u002Fcode> (Windows PowerShell), \u003Ccode class=\"key\">bash\u003C\u002Fcode> (Git Bash), \u003Ccode class=\"key\">wsl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>macOS et Linux\u003C\u002Ftd>\n\u003Ctd>\u003Ccode class=\"key\">zsh\u003C\u002Fcode>, \u003Ccode class=\"key\">bash\u003C\u002Fcode>, \u003Ccode class=\"key\">fish\u003C\u002Fcode>, \u003Ccode class=\"key\">sh\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Un shell absent de la machine qui lit le fichier (\u003Ccode class=\"key\">pwsh\u003C\u002Fcode> sur un Mac, \u003Ccode class=\"key\">zsh\u003C\u002Fcode> sous Windows) n’est pas une erreur : la commande tourne dans le shell par défaut de ce système. Pour un fichier partagé entre systèmes, omets \u003Ccode class=\"key\">shell\u003C\u002Fcode> et écris des commandes que tous les shells comprennent.\u003C\u002Fp>\n\u003Ch2 id=\"le-schema-json-et-l-autocompletion\">Le schéma JSON et l’autocomplétion\u003C\u002Fh2>\n\u003Cp>Le schéma JSON du format est publié à l’adresse \u003Ccode>https:\u002F\u002Fescouade.dev\u002Fschemas\u002Fescouade.schema.json\u003C\u002Fcode>. Il suit chaque version d’Escouade : il décrit chaque clé, son type et ses valeurs permises.\u003C\u002Fp>\n\u003Cp>Pour l’autocomplétion, mets en tête du fichier la ligne que les fichiers écrits par Escouade ont déjà :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\"># yaml-language-server: $schema=https:\u002F\u002Fescouade.dev\u002Fschemas\u002Fescouade.schema.json\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Les éditeurs qui lisent les schémas YAML (VS Code avec l’extension YAML de Red Hat, les IDE JetBrains, Neovim avec \u003Ccode class=\"key\">yaml-language-server\u003C\u002Fcode>) complètent alors les clés, montrent leur description au survol, et signalent une clé inconnue ou une valeur hors liste pendant la frappe.\u003C\u002Fp>\n\u003Ch2 id=\"ce-qui-reste-hors-du-fichier\">Ce qui reste hors du fichier\u003C\u002Fh2>\n\u003Cp>Le fichier est commité et lu par toute l’équipe, et un dépôt public le montre à n’importe qui. Il ne porte donc que ce qui vaut pour tout le monde, jamais ce qui est propre à une personne, à une machine, ou secret :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>le nom et la couleur du projet : un choix d’affichage de chacun, dans sa propre barre d’onglets ;\u003C\u002Fli>\n\u003Cli>le compte préféré, les comptes réservés à un projet privé et « Comptes partagés à la limite » : chacun a ses comptes ;\u003C\u002Fli>\n\u003Cli>le remote control : un choix personnel, qui rend ses agents accessibles depuis ton claude.ai ;\u003C\u002Fli>\n\u003Cli>« En parallèle » et le pilote auto : ils dépensent ton quota ; une personne qui ne fait que relire ne veut pas que des tickets démarrent seuls chez elle ;\u003C\u002Fli>\n\u003Cli>le mode \u003Ccode class=\"key\">bypassPermissions\u003C\u002Fcode> des agents des tickets : un dépôt ne lève pas les autorisations de qui l’ouvre ;\u003C\u002Fli>\n\u003Cli>la clé des tickets : chaque machine a son Kanban et numérote ses propres tickets, et la clé est fixée par le premier ticket ;\u003C\u002Fli>\n\u003Cli>les intégrations (Jira, Trello, GitHub, Linear, ClickUp, GitLab, Azure Boards) : elles tiennent à tes comptes connectés ;\u003C\u002Fli>\n\u003Cli>les chemins complets : ils ne valent que sur une machine (d’où le refus d’un \u003Ccode class=\"key\">dir\u003C\u002Fcode> ou d’un \u003Ccode class=\"key\">cwd\u003C\u002Fcode> complet) ;\u003C\u002Fli>\n\u003Cli>les jetons et mots de passe : aucune clé n’en prend, et « Exporter vers .escouade.yml » n’en écrit jamais.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"a-l-ouverture-du-projet\">À l’ouverture du projet\u003C\u002Fh2>\n\u003Cp>Quand le dossier ajouté a un \u003Ccode class=\"key\">.escouade.yml\u003C\u002Fcode>, l’assistant « Nouveau projet » propose « Réglages de .escouade.yml » comme point de départ, au-dessus de « Configuration recommandée », et le choisit tout seul. Une fois le projet créé (ou rouvert), Escouade applique le fichier et le dit : « réglages lus dans .escouade.yml ».\u003C\u002Fp>\n\u003Cp>Le fichier est relu dès qu’il change : après un \u003Ccode>git pull\u003C\u002Fcode>, un changement de branche ou une modification à la main. Les réglages changés s’appliquent et un message le dit.\u003C\u002Fp>\n\u003Ch2 id=\"les-commandes-attendent-ton-accord\">Les commandes attendent ton accord\u003C\u002Fh2>\n\u003Cp>Un dépôt cloné peut venir de n’importe qui. Les commandes du fichier (\u003Ccode class=\"key\">worktrees.setup\u003C\u002Fcode>, \u003Ccode class=\"key\">worktrees.teardown\u003C\u002Fcode>, \u003Ccode class=\"key\">launch\u003C\u002Fcode> et \u003Ccode class=\"key\">board.test_command\u003C\u002Fcode>) ne tournent jamais avant ton accord, et la lecture du fichier n’en lance aucune. Tant que tu ne les as pas approuvées, le projet garde les siennes, et le Kanban affiche « Les commandes de .escouade.yml attendent ton accord : elles ne tournent pas encore. ».\u003C\u002Fp>\n\u003Cp>« Les lire » ouvre Réglages › Projets, groupe « .escouade.yml », qui montre chaque commande en entier, avec son shell et son dossier. « Faire confiance à ces commandes » les applique. Si le fichier les change ensuite (une commande, son shell ou son dossier, une commande ajoutée ou retirée), Escouade te redemande ton accord ; d’ici là, celles que tu avais approuvées restent en place. Des commandes identiques à celles que le projet a déjà n’ont rien à approuver.\u003C\u002Fp>\n\u003Cdiv class=\"callout warning\">\u003Cp class=\"callout-title\">Attention\u003C\u002Fp>\u003Cp>Lis chaque commande avant de lui faire confiance : la préparation tourne dans chaque nouveau worktree, avant le premier message de son agent.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Ch2 id=\"les-reglages-marques\">Les réglages marqués\u003C\u002Fh2>\n\u003Cp>Dans Réglages › Projets et Réglages › Kanban, un réglage défini par le fichier le dit sous son libellé : « Défini par .escouade.yml ». Le modifier et enregistrer en fait un réglage local de cette machine, qui passe devant le fichier, même quand il est relu : « Réglage local de cette machine : il passe devant .escouade.yml. ». Sous le réglage, « Écrire dans .escouade.yml » met ta valeur dans le fichier (à commiter), et « Reprendre la valeur du fichier » rend la main au fichier.\u003C\u002Fp>\n\u003Ch2 id=\"exporter-les-reglages-d-un-projet\">Exporter les réglages d’un projet\u003C\u002Fh2>\n\u003Cp>Pour partager un projet déjà réglé, Réglages › Projets › « Exporter vers .escouade.yml » écrit le fichier à la racine du dépôt depuis les réglages enregistrés du projet : toutes les clés, dans l’ordre de l’exemple complet (une branche cible encore vide est omise, le mode \u003Ccode class=\"key\">bypassPermissions\u003C\u002Fcode> aussi). Un fichier existant garde ses commentaires, l’ordre de ses clés et les clés qu’Escouade ne connaît pas ; un nouveau fichier commence par la ligne du schéma et \u003Ccode>version: 1\u003C\u002Fcode>. Les commandes exportées sont celles du projet : elles n’ont pas besoin de ton accord. Il reste à commiter le fichier.\u003C\u002Fp>\n",[8,12,15,18,22,25,28,31,34,37,40,43,45,47,49,51,53,55,58,61,64,67,70,73,76,79],{"id":9,"text":10,"depth":11},"a-quoi-il-sert","À quoi il sert",2,{"id":13,"text":14,"depth":11},"un-exemple-complet","Un exemple complet",{"id":16,"text":17,"depth":11},"les-regles-du-format","Les règles du format",{"id":19,"text":20,"depth":21},"le-style-des-cles","Le style des clés",3,{"id":23,"text":24,"depth":21},"la-cle-version","La clé version",{"id":26,"text":27,"depth":21},"une-version-plus-ancienne-ou-plus-recente","Une version plus ancienne ou plus récente",{"id":29,"text":30,"depth":21},"une-cle-absente","Une clé absente",{"id":32,"text":33,"depth":21},"une-cle-inconnue","Une clé inconnue",{"id":35,"text":36,"depth":21},"une-valeur-invalide","Une valeur invalide",{"id":38,"text":39,"depth":11},"les-types-de-valeurs","Les types de valeurs",{"id":41,"text":42,"depth":11},"les-cles","Les clés",{"id":44,"text":44,"depth":21},"agents",{"id":46,"text":46,"depth":21},"private",{"id":48,"text":48,"depth":21},"worktrees",{"id":50,"text":50,"depth":21},"launch",{"id":52,"text":52,"depth":21},"git",{"id":54,"text":54,"depth":21},"board",{"id":56,"text":57,"depth":11},"les-etapes-de-worktree","Les étapes de worktree",{"id":59,"text":60,"depth":11},"les-commandes-de-lancement","Les commandes de lancement",{"id":62,"text":63,"depth":11},"les-shells","Les shells",{"id":65,"text":66,"depth":11},"le-schema-json-et-l-autocompletion","Le schéma JSON et l’autocomplétion",{"id":68,"text":69,"depth":11},"ce-qui-reste-hors-du-fichier","Ce qui reste hors du fichier",{"id":71,"text":72,"depth":11},"a-l-ouverture-du-projet","À l’ouverture du projet",{"id":74,"text":75,"depth":11},"les-commandes-attendent-ton-accord","Les commandes attendent ton accord",{"id":77,"text":78,"depth":11},"les-reglages-marques","Les réglages marqués",{"id":80,"text":81,"depth":11},"exporter-les-reglages-d-un-projet","Exporter les réglages d’un projet",1793283950251]