Le problème
Les limites 5 h et hebdomadaires de Claude Code interrompent les longues boucles agentiques. Les déconnexions SSH tuent la session. On se réveille avec une tâche à moitié finie et un terminal périmé.
Ce qu'il fait
- Enveloppe
claudepour survivre au bloc 5 h : dort jusqu'au reset, puis reprend le même UUID de session. - Tourne dans une session tmux nommée — les coupures SSH n'ont plus d'effet.
- Détection à trois couches (déterministe d'abord, LLM optionnel et opt-in).
- Gère automatiquement la nouvelle modale interactive de limite (sélectionne l'option sûre « Stop and wait »).
- Multi-session :
vibe work feature-aetvibe work bugfixcohabitent, états isolés. - Dépendances cœur : seulement
bash,jq,curl,tmux. Ni npm, ni pip.
Installation (une fois)
git clone https://github.com/zhihuiyuze/vibe-coding-auto-resume.git ~/vibe
cd ~/vibe
./install.sh
source ~/.bashrc
Idempotent. Symlink les outils dans ~/.local/bin/, ajoute une fonction shell vibe, ajoute un snippet tmux. Ne touche jamais à ~/.claude/ ; ne lance jamais sudo à votre place.
Trois scénarios — choisissez le vôtre
1. Je démarre une nouvelle tâche Claude
cd ~/dev/<votre-projet>
vibe work # cd ici + ouvre une session tmux nommée
vibe run # remplace `claude` — mêmes flags, même UI
Utilisez Claude normalement. Quand le bloc 5 h est épuisé, vibe run dort jusqu'au reset et relance le même UUID de session automatiquement. La nouvelle modale interactive (What do you want to do? 1. Stop and wait …) est auto-gérée — seule l'option sûre « Stop and wait » est jamais sélectionnée.
Détacher : Ctrl+b d. Revenir : vibe work.
2. Je veux reprendre une session démarrée plus tôt
Si vous vous souvenez du UUID :
cd ~/dev/<votre-projet>
vibe work
vibe run --resume <session-uuid>
Sinon, mais c'est la dernière session sur ce projet :
vibe run --mode continue # équivalent `claude --continue` + reprise auto
Lister les candidats depuis les noms de fichier JSONL :
ls -t ~/.claude/projects/$(pwd | sed 's|/|-|g')/*.jsonl | head -5
# nom de fichier moins `.jsonl` = UUID de session
3. SSH a sauté — comment vérifier que ça tourne encore et y revenir
tmux possède le process, pas votre shell. SSH meurt, la session vit. Étape par étape :
ssh vous@server # 1. reconnexion
tmux ls # 2. la session vibe-* est-elle toujours là ?
# attendu : ex. "vibe-default: 1 windows (...)"
vibe work # 3. rattacher (ou `vibe work <name>` si nommée)
# vous atterrissez exactement où vous étiez
Une fois rattaché, scrollback pour voir ce qui s'est passé pendant votre absence : Ctrl+b [, puis PageUp / flèches, q pour sortir. Si un rate limit est tombé, le wrapper l'a géré — vous verrez [vibe-run] Sleeping … until … et la reprise dans le scrollback.
Jeter un œil sans rattacher (depuis une autre machine, juste un check) :
ssh vous@server "tmux ls"
ssh vous@server "tmux capture-pane -t vibe-default -p | tail -50"
ssh vous@server "vibe status"
Si tmux ls répond no server running, la machine a redémarré ou tmux s'est fait OOM-killer. La session tmux est perdue mais le log JSONL de Claude non — utilisez le scénario 2 ci-dessus pour reprendre.
Découvrir et jongler avec les sessions
vibe ls liste toutes les sessions tmux vibe-* avec leur cwd, l'état d'attachement, et un marqueur ← here quand le cwd correspond au vôtre :
$ vibe ls
vibe-boldfox /home/u/dev/projectA ← here [attached]
vibe-feature-x /home/u/dev/projectA ← here
vibe-quietowl /home/u/dev/scratch
vibe work sans argument utilise désormais cette découverte avant de retomber sur le nom par hash de cwd :
- 0 correspondance → crée une nouvelle session (nom par hash de cwd).
- 1 correspondance → rattache directement, sans prompt.
- N correspondances → picker interactif (
1..Npour choisir,npour une nouvelle).
vibe work <name> explicite saute la découverte — le nom gagne toujours. Pour les projets fréquents, donnez un nom explicite (vibe work projectA) — ça résiste aux renommages de chemin et c'est lisible dans vibe ls.
Optionnel : détection LLM plus intelligente
L1 (parsing JSONL) et L2 (regex sur le pane) couvrent les rate limits courants sans appel externe. Pour gérer les changements de wording du TUI et extraire les heures de reset que la regex manque, activez L3 :
echo 'DEEPSEEK_API_KEY=sk-...' >> ~/.config/vibe/env # chmod 600, créé par l'installeur
chmod 600 ~/.config/vibe/env
source ~/.bashrc
Providers : DeepSeek (~0,05 $/bloc), Anthropic Claude Haiku, OpenAI gpt-4o-mini, Ollama (local, [untested]). Avec L3 off (défaut tant qu'aucune clé n'est ajoutée), rien ne quitte votre machine.
Comment marche la détection
Quand claude termine, trois signaux décident de la suite :
| Couche | Lit | Quand elle brille |
|---|---|---|
| L1 | ~/.claude/projects/<cwd>/*.jsonl — le log natif de Claude | Toujours actif. Suit l'usage de tokens et début/fin du bloc. |
| L2 | tmux capture-pane + scrollback | Message de limite visible dans le panneau principal. |
| L2.5 | Scan texte du tail JSONL | Messages de sous-agent qui ont défilé hors du panneau visible. |
| L3 | Classifieur LLM (DeepSeek / Claude Haiku / OpenAI / Ollama) | Opt-in. Robuste aux changements de formulation ; extrait l'heure de reset sémantiquement. |
L1 et L2/L2.5 sont 100 % locales. L3 est opt-in et coûte environ 0,05 $/bloc avec DeepSeek.
Flags CLI
vibe run [...args]
--resume <uuid> reprendre une session spécifique (passé une fois, utilisé pour tous les cycles)
--threshold <0..1> plafond souple opt-in (off par défaut — brûle le bloc)
--max-cycles <n> cycles de reprise par invocation (0 = illimité, défaut 1)
--mode auto|session-id|continue
--provider deepseek|claude|openai|ollama
--no-l3 force L1+L2 seulement
--dangerously-skip-permissions
-p "prompt"
... tous les autres flags passent tels quels à claude
Configuration
| Où | Quoi |
|---|---|
~/.config/vibe/env | Clés LLM + paramètres (chmod 600). Sourcé par le bloc bashrc avec set -a. |
~/.local/state/vibe/<name>/ | Cache UUID par session. Isolé entre vibe work foo et vibe work bar. |
<votre-projet>/HANDOFF.md | Fichier de continuité inter-session. Créé seulement si vous lancez vibe setup-workspace depuis ce projet. |
Ce qu'il ne fait jamais
- Toucher d'autres répertoires projet sans un
vibe setup-workspaceexplicite depuis l'intérieur. - Sourcer le
.env/.env.localde votre projet. Les identifiants outils vivent dans~/.config/vibe/env; votre env projet vous appartient. - Exécuter
sudo. L'installeur imprime les une ou deux commandes qui en ont besoin et s'arrête. - Envoyer quoi que ce soit hors machine quand L3 est désactivé (le défaut tant qu'aucune clé n'est ajoutée).
- Auto-sélectionner une option payante sur la modale de limite. Seulement « Stop and wait » — jamais « Switch to usage credits » ni « Upgrade your plan ».
Docs
- AGENTS.md — architecture, guide contributeur, workflow spec-first.
- docs/architecture.md — schéma complet du flux de données.
- docs/design/ — un doc de design accepté par fonctionnalité.