Skip to content

Worker Cursor : dossier dédié <workdir>-cursor par projet + sauvegarde avant déploiement manuel - #270

Merged
bobdivx merged 1 commit into
mainfrom
feat/cursor-worktree-per-project
Oct 22, 2026
Merged

bobdivx merged 1 commit into
mainfrom
feat/cursor-worktree-per-project

Conversation

@bobdivx

@bobdivx bobdivx commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Pourquoi

Les agents Cursor travaillaient dans le checkout du projet, celui que chaque déploiement remet à origin/<branche> (fetch && checkout && reset --hard) et qui sert de contexte de build. Un déploiement pouvait effacer le travail d'un agent, et un agent qui change de branche pouvait gêner un build.

Changements

  • Worktree dédié par projet : chaque process du worker sert <workdir>-cursor, créé au démarrage par git -C <workdir> worktree add --no-track -b cursor/devforge <workdir>-cursor origin/<branche de prod> (ensure_cursor_worktree). S'il existe déjà, il n'est pas touché. Si la branche cursor/devforge existe déjà (dossier supprimé à la main), elle est reprise sans être remise à zéro. Un dossier occupé qui n'est pas un dépôt Git n'est jamais écrasé.
    • Utilisé par start_named / restart_with_dirs / autostart (leader) et par le script de démarrage d'un nœud distant (DF_WT_ERR en cas d'échec ; on ne revient jamais au checkout de déploiement).
    • list_project_workdirs / eligible_paths renvoient le dossier -cursor (champs source_path, branch, worktree_ready, note).
    • Projets sans .git : non servis, avec la note « pas encore de checkout : déployer une fois ».
    • Les noms de machine restent devforge-<dépôt> (le worktree partage le remote origin).
  • « Remettre à jour » : POST /api/v1/cursor-worker/refresh (leader). Chaque worktree repart de origin/<branche> sur cursor/devforge. Les changements non publiés sont d'abord sauvegardés sous draft-backups/<uuid>-cursor/ (séparé du brouillon du projet).
  • Sauvegarde du brouillon avant tout déploiement prod : backup_draft_before_reset est appelé dans run_real_deploy_at (manuel, auto, GitHub), plus seulement par l'auto-deploy. Un workdir vide se résout comme au déploiement.
  • UI : modale « Dépôts » qui montre le dossier -cursor avec un badge (Servi / Créé au démarrage / Pas de checkout) et un bouton « Remettre à jour… » avec confirmation.

Ce qui n'est pas touché

  • Le déploiement (reset --hard dans <workdir>), les previews et le brouillon utilisent toujours <workdir>.
  • L'environnement dev utilise <workdir>-dev.
  • Le worktree -cursor est un dossier voisin : hors du contexte de build, invisible pour git status du checkout.
  • Git refuse qu'un agent fasse un checkout de la branche de prod dans le worktree, puisqu'elle est déjà utilisée par le checkout de déploiement.

Tests

  • cursor_worktree_is_separate_from_deploy_checkout : vraie séquence de déploiement sans effet sur le worktree, refresh avec sauvegarde, recréation, dossier occupé.
  • cursor_worktree_path_and_branch_rules, e2e du script nœud avec worktree.
  • backup_dirty_checkout_before_reset, vitest repoBadge.

…vegarde du brouillon avant tout déploiement

- Chaque process du worker Cursor sert <workdir>-cursor (git worktree, branche
  cursor/devforge depuis origin/<branche de prod>), créé au démarrage s'il manque,
  jamais modifié ensuite ; plus jamais le checkout que le déploiement remet à zéro.
- Projets sans checkout : non servis (« pas encore de checkout : déployer une fois »).
- Script nœud distant : même logique (DF_WT_ERR si création impossible).
- POST /api/v1/cursor-worker/refresh (« Remettre à jour ») : worktrees sur
  origin/<branche>, changements non publiés sauvegardés d'abord.
- run_real_deploy_at sauvegarde le brouillon avant le reset --hard pour tous les
  déploiements prod (manuels compris), plus seulement l'auto-deploy.
- UI : modale Dépôts (dossier -cursor, badge, Remettre à jour) ; tests.
@bobdivx
bobdivx merged commit e47bd01 into main Oct 22, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant