=== branch ===
tom/perte-sessions
=== HANDOFF.md exists? ===
-rw-r--r-- 1 dev dev 29532 Jun 26 10:39 HANDOFF.md
--- current content ---
# HANDOFF — Paf-Studio Code

*Derniere mise a jour : 2026-06-04 par Tom (branche tom/amelioration-globales)*

## Projet en 30 secondes

Paf-Studio Code est un **environnement de developpement partage sur VPS** (Hostinger, France) pour 4 developpeurs (Tom Assous, Pierre Bost, Nicolas Pommereuil, Clara Girard — surnommee Graziella pour son bagout). C'est un binaire Go (`cc`) qui fournit un TUI psychedelique (Bubble Tea) autour de Claude Code : gestion de projets, branches (git worktrees), previews HTTPS automatiques, systeme de gamification a 200 grades, mascotte Archibald (vieux magicien fou), partage d'images clipboard Mac/Windows → VPS, et switch transparent entre comptes Claude quand rate-limited (429).

**Stack** : Go 1.22 + Bubble Tea + Lipgloss + go-colorful. VPS : Debian, Caddy (reverse proxy HTTPS), tmux (sessions persistantes), Mosh (connexion resiliente), Filebrowser (file manager web), Claude Code CLI (2.1.111, Opus 4.7 par defaut).

**Repo** : `github.com/Tomassous-38/paf-studio-code` (prive). VPS : `srv1583438.hstgr.cloud` (82.29.170.28), port SSH 2222, user `dev`.

## Ou on en est

### Etat actuel — 2026-06-04

- **PR #48 mergée** : UX/UI launcher, choix **Code / Automator**, stabilisation terminal web, previews, base skills Automator.
- **PR #49 mergée** : les conversations Code sont maintenant filtrées par `project + user + branch`; une branche neuve ne voit plus les conversations d'autres branches.
- **Nettoyage mémoire/disque implémenté sur cette branche** :
  - `scripts/cleanup.sh` doit rester en mode équilibré : pas de suppression automatique des branches git, uniquement worktrees locaux propres/inactifs, conversations archivées, caches/temp, node_modules inactifs.
  - Toujours tester avec `DRY_RUN=1 /opt/claude-code/cleanup.sh` avant une première exécution réelle après modification.
  - Les conversations >30 jours sur branche/workspace sans tmux actif sont archivées dans `~/.config/claude-code/conversation-archives/YYYY-MM.json` avant retrait de `sessions.json`.
  - Les fichiers temporaires/caches >14 jours peuvent être nettoyés ; les sessions tmux actives, previews actives et worktrees sales doivent être conservés.
- **Dev servers / previews** :
  - `kill-idle-servers.sh` peut tuer les dev servers sans session tmux active pour libérer de la RAM.
  - Les MCP lances par des agents actifs et les MCP geres par une unite systemd directe (`*.service`) doivent etre conserves.
  - Une preview tuée se relance depuis son worktree avec `preview restart`, qui réutilise le port existant et met à jour le PID.
  - Ne pas redémarrer `ttyd` / `ttyd-attach` pour ces nettoyages.
- **npm / installs rapides** :
  - `/home/dev/.npmrc` est volontaire et partagé : `audit=false`, `fund=false`, `prefer-offline=true`, `progress=false`.
  - Cette config accélère les `npm install` / `npm ci` sur nouvelles branches/worktrees en évitant audit/fund et en privilégiant le cache local.
  - Elle ne sert pas à updater les packages globaux root.
- **Claude CLI auto-update** :
  - Le vieux cron user `npm update -g @anthropic-ai/claude-code` provoque `EACCES` sur `/usr/lib/node_modules`.
  - Il faut le retirer ; l'update globale doit passer uniquement par le cron root `/opt/claude-code/update-claude.sh`.

### Etat actuel — branche `tom/amelioration-globales` / PR #48

- **PR ouverte** : https://github.com/Tomassous-38/paf-studio-code/pull/48 vers `main`.
- Le launcher a maintenant un **choix racine obligatoire : `Code` ou `Automator`**.
  - **Code** : projets git dans `/opt/projects`, branches/worktrees, previews HTTPS, PR, Q&A lecture seule sur main.
  - **Automator** : workspaces libres dans `/opt/automator`, non liés à git, sans branche, sans preview, pour fichiers, subagents et workflows.
- Le flow UX actuel est :
  - `cc` → user/welcome → **Choisis ton portail** (`Code` / `Automator`)
  - `Code` → page projets → branches → CLI → conversations → tmux
  - `Automator` → page workspaces → CLI → conversations → tmux
- Les sessions web sur `terminal.paf-studio.dev` utilisent un id navigateur stable et une API `/terminal/api/sessions` générée en `{ "sessions": [...] }`.
- **Important déconnexions web** : les déploiements ne doivent pas redémarrer `ttyd` / `ttyd-attach` pour une simple modif de `cc`, sinon les terminaux web se coupent. `scripts/deploy.sh` ne redémarre plus ces services par défaut ; utiliser `RESTART_TTYD=1 ./scripts/deploy.sh` seulement si le service lui-même doit être redémarré.
- Le binaire live `/opt/claude-code/cc` a déjà été déployé avec le choix **Code / Automator**.

### Skills de base / injection

- Les **skills de base** sont configurables depuis la page projets Code avec `B Base skills`.
- Les **skills de base Automator** sont aussi configurables depuis la page workspaces Automator avec `B Base skills`.
- Stockage :
  - Code : clé `project_settings[].project = "<project>"`
  - Automator : clé namespacée `project_settings[].project = "automator:<workspace>"` pour éviter les collisions avec un repo Code du même nom.
- Injection :
  - Code : les skills sélectionnés sont injectés dans `CLAUDE.md` ou `AGENTS.md` selon le CLI.
  - Automator : les skills sélectionnés sont injectés dans le contexte Automator (`CLAUDE.md` / `AGENTS.md`) et doivent être appliqués automatiquement au lancement.
- Les autres skills restent chargés uniquement sur demande explicite de l'utilisateur.

### Correctifs récents inclus dans la PR #48

- Preview stop corrigé.
- Routes directes `cc resume`, `cc <project>`, `cc <project> <branch>` restaurées.
- Preview env via `.env.local` privé au lieu de hard-code par branche dans les configs versionnées.
- Q&A lecture seule renforcé.
- Sessions tmux mieux parsées pour projets avec tirets, suffixes conversation et agents.
- Reconnexions web terminal stabilisées, avec nettoyage des anciennes sessions `web-*`.
- UX/UI fantasy/rainbow clarifiée sans enlever Archibald ni l'identité décalée.
- Choix **Code / Automator** restauré et propagé dans `--session-loop --automator`.

### Etat actuel — OpenCode / Codex / Claude

- **PR #37 mergée dans `main`** : https://github.com/Tomassous-38/paf-studio-code/pull/37
- **Merge commit** : `936ed7bbcbb9e551205b7ac501c0ab64a5978684`
- **Commit feature sur branche `tom/open-code`** : `feab352 feat: add OpenCode CLI option`
- **OpenCode est maintenant une option CLI Paf-Studio**, avec Codex OAuth, modèle par défaut `openai/gpt-5.2-codex`, variante `high`, et `--dangerously-skip-permissions`.
- **OpenCode est le choix par défaut dans le sélecteur CLI**. Claude Code et Codex CLI restent disponibles.
- **Contexte agent** :
  - Claude Code lit `CLAUDE.md`.
  - Codex CLI lit `AGENTS.md`.
  - OpenCode lit `AGENTS.md`.
  - Le contenu injecté Paf-Studio est le même ; seul le fichier cible change selon le CLI.
- **Skills partagés** :
  - Source : `/opt/claude-code/library/skills`.
  - OpenCode : `~/.config/opencode/skills`.
  - Ordre de résolution OpenCode : `SKILL.opencode.md`, puis `SKILL.codex.md`, puis `SKILL.md`.
  - Etat live au moment du handoff : 63 skills matérialisés.
- **MCP partagés** :
  - Source : `~/.claude.json`.
  - OpenCode : `~/.config/opencode/opencode.json`.
  - Etat live au moment du handoff : 11 MCP synchronisés.
- **Imagegen OpenCode** :
  - Ajout de `configs/skills/imagegen/SKILL.opencode.md`.
  - La skill OpenCode privilégie le MCP `gpt-image-2`.
  - Python/API reste un fallback explicite seulement, car il utilise des credentials/billing séparés de Codex OAuth.
- **Tests / validation** :
  - `git diff --check` OK.
  - `npx -y opencode-ai@latest --model openai/gpt-5.2-codex --variant high --dangerously-skip-permissions --dir /tmp --version` OK, version OpenCode `1.15.10`.
  - `go test ./...` non exécuté : `go` n'est pas installé sur cet environnement (`/bin/bash: line 1: go: command not found`).
- **Point local à connaître** :
  - `AGENTS.md` existe en untracked local dans le worktree `tom/open-code`. Il n'a pas été inclus dans la PR, volontairement, car c'est un contexte généré/local de session.

### Ce qui marche

- **TUI complet** avec 14 ecrans : Splash → User Select → Welcome (anime) → Tutorial (7 etapes narratives par Archibald) → Projects → Branches → Branch Input → Conversation (new/resume) → Launching (5 etapes animees) → Previews → Tools/Library → Tool Detail → Onboarding → Stats
- **Clone de repos** avec touche N : URL → nom auto-derive → clone SSH → proposition CLAUDE.md si absent
- **Creation de repos GitHub** avec touche C : nom → description → visibility (prive/public) → partage equipe (checkboxes membres) → `gh repo create` + ajout collaborateurs automatique
- **Detection templates GitHub** : quand l'URL d'un template est collee, detection automatique via `gh api repos/OWNER/REPO` → propose "creer depuis ce template" ou "cloner tel quel"
- **Branches** : listing (les tiennes, les autres, mergees), creation de worktrees isolees, archivage des mergees
- **Mode Q&A lecture seule sur main** : touche Q ou entree selectable, lance Claude avec `--allowed-tools` whitelistant uniquement Read/Grep/Glob + git/gh read-only. Claude ne peut pas editer/commiter/modifier. CLAUDE.md injecte specifique "MODE LECTURE SEULE"
- **Previews HTTPS** : Caddy reverse proxy, une URL par branche (`<projet>-<branche>.paf-studio.dev`), port auto-alloue
- **CLAUDE.md injection** : contexte Paf-Studio injecte avant chaque session (user, projet, branche, preview URL, port, regles git, partage images, /handoff, permissions). Bloc entre markers HTML, replace atomique
- **Gamification** : 200 grades (10 paliers x 20 adjectifs), de "Apprenti Timide 🌱" a "Divinite Supreme 👑". XP gagne par session, commit, PR, tools installes. 6 medailles. Barre XP rainbow animee dans le header. Ecran Stats dedie
- **Mascotte Archibald** : ASCII art anime, citations aleatoires par ecran, ton "vieux bibliothecaire fou de RPG"
- **Partage d'images** : Cmd+Shift+V sur Mac → Hammerspoon → scp vers VPS → path auto-type dans Claude Code. Support Finder files + clipboard screenshots. Script `clipboard-to-vps.lua`
- **Install scripts** : `install.sh` (Mac/Linux) + `install.ps1` (Windows) avec mot de passe `archibald`, installe SSH key, Hammerspoon, pngpaste, Tabby, alias `cc`, drop zone
- **Partage comptes Claude** : `~/.claude-users/{name}/` par dev, `~/.claude/` symlinke au login. Menu post-session option "Switch 429" pour basculer sur le compte d'un autre membre
- **Slash command /handoff** : cree/complete HANDOFF.md en mode append-in-place (journal antichrono), commit sans push. Deploye via `/opt/claude-code/commands/handoff.md` → symlinke dans chaque `~/.claude/commands/`. Aussi triggerable en tapant juste "handoff" (instruction dans CLAUDE.md injecte)
- **Auto-update Claude Code** : cron root quotidien 4h UTC (`update-claude.sh`), compare versions npm, update si nouvelle version dispo. Log dans `/var/log/claude-code/update-claude.log`
- **Theme rainbow** : couleurs par user (Tom=cyan, Pierre=jaune, Nico=rose), rainbow HSL anime (offset ticker 100ms), `RainbowString` (couleur unique shiftante) vs `RainbowLine` (par caractere pour logos)
- **File manager** : Filebrowser a `files.paf-studio.dev` (password a resetter — `filebrowser users update` necessaire)
- **Outils/library** : ecran Tools avec skills, MCP servers, plugins. Install via mode Archibald. Stocke dans `/opt/claude-code/library/library.json`

### Historique ancien — changes locaux sur main de 2026-05-26

Ce bloc vient du handoff `tom/open-code` du 2026-05-26. Il est conservé comme historique, mais **ce n'est plus l'état actuel** de `tom/amelioration-globales`. Pour l'état actuel, se référer aux sections `Etat actuel — branche tom/amelioration-globales / PR #48` et `Skills de base / injection` ci-dessus.

Ancien état rapporté : 12 fichiers modifies + 3 nouveaux, non commites :

| Fichier | Changement |
|---|---|
| `internal/theme/colors.go` | `RainbowString` simplifie (1 couleur HSL au lieu de per-char) — fix bug lettres doublees |
| `internal/theme/ascii.go` | `HeaderBanner` compact sans espaces entre lettres |
| `internal/tui/projects.go` | +300 lignes : flow "Create repo" (C key), detection templates, partage equipe, 6 nouveaux cloneSteps |
| `internal/tui/branches.go` | Mode Q&A lecture seule (entree + touche Q), `launchAskOnly()`, `renderAskOnlyLine()` |
| `internal/tui/launching.go` | `newLaunchingAskOnly()` + `runStepAskOnly()` (3 etapes au lieu de 5) |
| `internal/tui/messages.go` | `askOnly bool` ajoute a `branchChosenMsg` |
| `internal/tui/app.go` | `askOnly` field, routing ask-only → skip conversation → launching direct |
| `internal/claude/claude.go` | `AskOnly bool` dans LaunchOpts, whitelist `--allowed-tools` (git/gh read-only + Read/Grep/Glob) |
| `internal/claude/context.go` | `InjectAskOnlyContext()`, bloc "MODE LECTURE SEULE" avec regles detaillees, section Passation /handoff |
| `main.go` | `--ask-only` flag session-loop, `ensureSharedCommands()` pour symlinker `/opt/claude-code/commands/*.md` |
| `scripts/provision.sh` | mkdir commands/, copie commands/*.md, cron root update-claude |
| `configs/commands/handoff.md` | **NOUVEAU** — slash command /handoff (append-in-place HANDOFF.md) |
| `scripts/deploy-commands.sh` | **NOUVEAU** — sync configs/commands/ vers VPS |
| `scripts/update-claude.sh` | **NOUVEAU** — auto-update Claude Code CLI npm |

Ancienne note : tout était déjà déployé sur le VPS (`cc` binaire + `handoff.md` + cron) mais pas commité dans git à cette date.

## Problematiques / Blockers

- **Config dev server pollue main** : quand Claude configure le dev server pour les previews paf-studio, il edite `vite.config.js`/`next.config.js` en dur avec les hosts paf-studio. Quand la branche merge → main a des configs paf-studio en dur. **Solution identifiee mais pas encore implementee** : pattern `.env.local` (gitignore) + config prod qui lit les env vars. Le CLAUDE.md injecte doit etre reecrit pour ne plus dire "edit vite.config.js" mais plutot "ecris .env.local + verifie que la config lit les env vars".
- **Filebrowser password perdu** : `files.paf-studio.dev` — la DB est lockee par le process en cours. Pour reset : `sudo systemctl stop filebrowser`, `sudo filebrowser users update admin -p <newpassword> --database /etc/filebrowser/filebrowser.db`, `sudo systemctl start filebrowser`.
- **1M context indisponible sur subscription** : le flag `--betas context-1m-2025-08-07` est bloque pour les auth OAuth (subscription Max). 1M uniquement via cle API (pay-per-token). Pas critique — 200K + compact auto suffit.
- **Erreurs 500 API intermittentes** : Anthropic renvoie parfois 500 cote serveur. Rien a faire de notre cote — transitoire.

## Structure du code

```
paf-studio-code/
├── main.go                          # Entry point : TUI mode OU session-loop (dans tmux)
│   ├── switchCredentials()          # Symlink ~/.claude → ~/.claude-users/{name}
│   ├── ensureSharedCommands()       # Symlink /opt/claude-code/commands/*.md → ~/.claude/commands/
│   ├── runSessionLoop()             # Boucle claude + post-session menu (dans tmux)
│   ├── postSessionMenu()            # Menu 1-5 apres /exit
│   └── toolInstallerPrompt()        # System prompt Archibald pour install tools
│
├── internal/
│   ├── tui/                         # 14 ecrans Bubble Tea
│   │   ├── app.go                   # AppModel principal, routing pages, header, mascotte
│   │   ├── messages.go              # Types de messages entre composants
│   │   ├── splash.go                # Ecran de chargement anime (detection user SSH)
│   │   ├── userselect.go            # Choix manuel de l'utilisateur
│   │   ├── welcome.go               # Animation welcome (logos ASCII, Archibald)
│   │   ├── tutorial.go              # Tutoriel 7 etapes narratif
│   │   ├── projects.go              # Liste projets + clone + create repo + templates
│   │   ├── branches.go              # Branches (mine/others/merged) + Q&A read-only
│   │   ├── branchinput.go           # Saisie nom nouvelle branche
│   │   ├── conversation.go          # Choix new/resume session
│   │   ├── launching.go             # 5 etapes launch (worktree, npm, preview, claude.md, tmux)
│   │   ├── sessions.go              # Sessions tmux actives (reattach)
│   │   ├── previews.go              # Liste previews HTTPS
│   │   ├── tools.go                 # Bibliotheque skills/MCP/plugins
│   │   ├── tooldetail.go            # Detail + rating d'un tool
│   │   ├── onboarding.go            # Checklist (Claude login, gh login, Vercel)
│   │   ├── stats.go                 # Ecran stats/grade/medailles du user
│   │   └── mascot.go                # Archibald : ASCII art + citations aleatoires
│   │
│   ├── claude/
│   │   ├── claude.go                # LaunchOpts, BuildCommand, RunClaude, AskOnlyAllowedTools
│   │   └── context.go               # InjectContext / InjectAskOnlyContext (CLAUDE.md markers)
│   │
│   ├── config/
│   │   ├── types.go                 # Account, Preview, LibraryItem, MCPServer, Config
│   │   ├── paths.go                 # Chemins VPS (/opt/claude-code, /opt/projects, etc.)
│   │   └── loader.go                # Load/Save JSON, DetectUser, LogActivity
│   │
│   ├── theme/
│   │   ├── colors.go                # UserColors, Rainbow(), RainbowString(), RainbowLine()
│   │   ├── styles.go                # Lipgloss styles (Active, Dim, Bold, Error, ShortcutBar)
│   │   └── ascii.go                 # HeaderBanner, WelcomeLogo (PAF/STUDIO/CODE), CenterBlock
│   │
│   ├── gamification/
│   │   └── gamification.go          # 200 grades, 10 tiers, 6 medailles, XP, barre rainbow
│   │
│   ├── git/
│   │   └── git.go                   # ListBranches, EnsureWorktree, MergedBranches, FetchPrune
│   │
│   ├── preview/
│   │   └── preview.go               # EnsurePreview (Caddy config gen), StopPreview
│   │
│   └── tmux/
│       └── tmux.go                  # CreateSession, SessionExists, SetStatusBar, SendKeys
│
├── configs/
│   ├── accounts.example.json        # Template config comptes
│   ├── Caddyfile                    # Config Caddy (reverse proxy + previews)
│   └── commands/
│       └── handoff.md               # Slash command /handoff (source versionnee)
│
├── scripts/
│   ├── install.sh                   # Installeur Mac/Linux (password "archibald")
│   ├── install.ps1                  # Installeur Windows (PowerShell + WSL)
│   ├── provision.sh                 # Setup VPS from scratch (Node, Claude, Caddy, SSH, crons)
│   ├── onboarding.sh                # Check statuts services (Claude, gh, Vercel)
│   ├── preview.sh                   # Gestion previews CLI
│   ├── cleanup.sh                   # Nettoyage hebdo (node_modules, worktrees, images)
│   ├── backup.sh                    # Backup quotidien
│   ├── update-claude.sh             # Auto-update Claude Code CLI (cron root)
│   ├── deploy-commands.sh           # Sync configs/commands/ → VPS
│   └── clipboard/
│       └── macos/
│           └── clipboard-to-vps.lua # Hammerspoon script Cmd+Shift+V
│
├── GUIDE-INSTALLATION.md            # Guide complet install + usage (ton Archibald)
├── TUTO-CLAUDE-CODE.md              # "Le Grand Grimoire" — tuto Claude Code 1000+ lignes
├── MANUEL-CLAUDE-CODE.md            # Manuel court Claude Code (commandes essentielles)
└── QUICK-START-PIERRE.md            # Quick start dedie a Pierre (10 etapes)
```

## Prochaines etapes

- [ ] **Valider cleanup mémoire en dry-run** : `DRY_RUN=1 /opt/claude-code/cleanup.sh`, vérifier qu'aucune session active, preview active ou worktree sale n'est ciblé.
- [ ] **Valider relance preview** : depuis un worktree avec preview, tuer le dev server puis lancer `preview restart`; l'URL doit reprendre le même port.
- [ ] **Corriger crons live** : retirer le cron user `npm update -g @anthropic-ai/claude-code`; conserver uniquement l'update Claude root.
- [ ] **Tester end-to-end Code / Automator dans le TUI live** : `cc` → Code → projet, puis `cc` → Automator → workspace. Vérifier que le retour Esc est cohérent et que `B Base skills` fonctionne dans les deux pages.
- [ ] **Tester l'injection de skills Automator** : sélectionner une skill sur un workspace Automator, lancer Claude/Codex/OpenCode, vérifier que le contenu est injecté dans `CLAUDE.md` ou `AGENTS.md`.
- [ ] **Surveiller les déconnexions web au prochain deploy** : un deploy classique ne doit plus redémarrer `ttyd` / `ttyd-attach`. Si une déconnexion se reproduit, inspecter Caddy/ttyd logs avant de relancer les services.
- [ ] **Reset password filebrowser** : `files.paf-studio.dev` — stop service, `filebrowser users update admin`, restart.
- [ ] **Tester /handoff end-to-end** : lancer une session `cc`, taper `/handoff`, verifier que HANDOFF.md est cree, que le journal s'append, que le commit passe.
- [ ] **Tester Q&A read-only** : lancer `cc` → projet → Q → verifier que Claude peut `git log`, `gh pr list` mais pas `Edit`/`Write`/`Bash(rm)`.
- [ ] **Tester create repo + templates** : creer un repo test, verifier collaborateurs ajoutes, tester avec une URL template GitHub.
- [ ] **Claude Code Desktop via SSH** : le user a exprime l'envie de pouvoir utiliser Claude Code Desktop connecte au VPS. Un mode `cc --setup-only` qui prepare worktree/CLAUDE.md/preview sans lancer tmux permettrait l'integration hybride.

## Commandes utiles

```bash
# Connexion VPS
ssh vps                              # alias configure par install.sh (port 2222)
mosh --ssh="ssh -p 2222" dev@82.29.170.28  # connexion resiliente

# Lancer le TUI
cc                                    # alias → /opt/claude-code/cc

# Build + deploy depuis le Mac
go build -o /tmp/cc-test .            # build local (test)
GOOS=linux GOARCH=amd64 go build -o cc-linux .  # cross-compile VPS
scp cc-linux vps:/opt/claude-code/cc.new && ssh vps 'mv /opt/claude-code/cc /opt/claude-code/cc.prev && mv /opt/claude-code/cc.new /opt/claude-code/cc && chmod +x /opt/claude-code/cc'

# Deploy slash commands
./scripts/deploy-commands.sh          # sync configs/commands/ → VPS

# Sessions tmux actives
ssh vps 'tmux ls'

# Logs debug
ssh vps 'tail -50 /tmp/cc-debug.log'
ssh vps 'tail -20 /var/log/claude-code/update-claude.log'

# Claude Code version
ssh vps 'claude --version'

# Rollback binaire
ssh vps 'mv /opt/claude-code/cc.prev /opt/claude-code/cc'
```

## Pour reprendre (agent suivant)

1. `git pull` (ou `git status` si tu travailles sur le meme clone)
2. Lire ce HANDOFF.md entierement
3. Vérifier la PR #48 et l'état live de `/opt/claude-code/cc`
4. Commencer par la premiere tache "Prochaines etapes"
5. Ne pas redémarrer `ttyd` / `ttyd-attach` pendant un deploy courant sauf besoin explicite (`RESTART_TTYD=1`)

## Journal

### 2026-05-26 — Tom (branche tom/open-code)

**Objectif** : ajouter OpenCode comme option Paf-Studio par défaut, avec connexion Codex OAuth, partage des MCP, partage des skills, et support imagegen via un outil compatible OpenCode.

**Actions réalisées** :

1. **Ajout OpenCode comme CLI supporté** :
   - nouveau type CLI `opencode`
   - parsing `--cli opencode`
   - commandes de lancement OpenCode interactif
   - sessions tmux suffixées `-opencode`
   - OpenCode sélectionné par défaut dans l'écran de choix CLI

2. **Connexion Codex OAuth pour OpenCode** :
   - provisioning installe `opencode-ai`
   - provisioning prépare `opencode-openai-codex-auth`
   - onboarding ajoute une entrée OpenCode auth/install
   - action onboarding `__opencode_login__` lance le flow auth OpenCode/Codex

3. **Contexte agent partagé** :
   - Claude continue d'utiliser `CLAUDE.md`
   - Codex et OpenCode utilisent `AGENTS.md`
   - l'injection Paf-Studio est commune, avec même bloc de contexte et mêmes règles projet

4. **Skills partagés** :
   - `MaterializeSkills(CLIOpenCode)` écrit dans `~/.config/opencode/skills`
   - support des variantes `SKILL.opencode.md`
   - fallback OpenCode vers `SKILL.codex.md`, puis `SKILL.md`
   - installation live effectuée : 63 skills visibles côté OpenCode

5. **MCP partagés** :
   - ajout de `SyncMCPClaudeToOpenCode`
   - conversion Claude stdio → OpenCode `type: "local"`
   - conversion Claude HTTP → OpenCode `type: "remote"`
   - préservation des entrées utilisateur OpenCode
   - suivi des entrées gérées via sidecar `.paf-studio-mcp-managed.json`
   - synchronisation live effectuée : 11 MCP visibles côté OpenCode

6. **Imagegen pour OpenCode** :
   - pas de copie du tool interne Codex `image_gen`, car il est injecté par le runtime Codex et n'est pas un MCP/binaire portable
   - ajout de `configs/skills/imagegen/SKILL.opencode.md`
   - la skill demande à OpenCode d'utiliser le MCP `gpt-image-2`
   - Python/API reste fallback explicite seulement

7. **Tests ajoutés** :
   - parsing OpenCode
   - commandes OpenCode new/resume
   - résolution de skills OpenCode
   - contexte `AGENTS.md`
   - synchro MCP OpenCode
   - noms de sessions tmux Claude/Codex/OpenCode

**Validation** :

- `git diff --check` OK
- OpenCode CLI validé avec `npx -y opencode-ai@latest ... --version` → `1.15.10`
- `go test ./...` impossible localement : Go absent de l'environnement

**GitHub** :

- Commit : `feab352 feat: add OpenCode CLI option`
- PR : https://github.com/Tomassous-38/paf-studio-code/pull/37
- Merge commit : `936ed7bbcbb9e551205b7ac501c0ab64a5978684`
- PR mergée le 2026-05-26

**Reprise conseillée** :

1. Installer Go dans l'environnement ou tester depuis une machine avec Go, puis lancer `go test ./...`.
2. Déployer/rebuilder le binaire `cc` depuis `main` si le VPS doit utiliser la version mergée plutôt que les ajustements live faits manuellement.
3. Lancer `cc`, choisir OpenCode, vérifier que `~/.config/opencode/skills` et `~/.config/opencode/opencode.json` sont reconstruits automatiquement.
4. Tester un prompt imagegen dans OpenCode pour confirmer que le MCP `gpt-image-2` est bien invocable depuis OpenCode.
5. Décider quoi faire du `AGENTS.md` untracked local : supprimer s'il est juste généré, ou l'ignorer globalement si ces fichiers doivent rester locaux.

### 2026-04-17 — Tom (branche main)

**Actions depuis le dernier handoff** :

Session precedente (2026-04-15/16) — une longue session de dev couvrant :

1. **Fix display bug header** : `RainbowString()` simplifie (1 couleur HSL shiftante au lieu de per-char coloring qui causait "PPAAFF--SSTTUUDDIIOO CCOODDEE" sur certains terminaux). `HeaderBanner` compact sans espaces entre lettres.

2. **Feature : creation de repos GitHub** (touche C) : flow complet en 5 etapes (nom → desc → visibility → partage equipe avec checkboxes → `gh repo create` + ajout collaborateurs via `gh api PUT`). Detection automatique de templates GitHub via `gh api repos/OWNER/REPO` → propose "creer depuis template" ou "cloner tel quel".

3. **Feature : mode Q&A lecture seule sur main** (touche Q dans ecran branches) : lance Claude avec `--allowed-tools` whitelistant uniquement des outils de lecture (Read, Grep, Glob, git log/show/diff/blame/..., gh pr view/list/...). Pas de Edit/Write/Bash generique. CLAUDE.md injecte specifique avec bloc "MODE LECTURE SEULE" detaillant les droits. Session tmux nommee `<projet>-<branche>-ask`.

4. **Feature : slash command /handoff** : cree `configs/commands/handoff.md` (prompt Claude Code). Deploye via symlink `/opt/claude-code/commands/handoff.md` → `~/.claude/commands/handoff.md`. Ajoute `ensureSharedCommands()` dans `main.go` pour auto-symlinker au login. Mention dans CLAUDE.md injecte (trigger "handoff" sans slash). Script `deploy-commands.sh` pour syncer vers VPS.

5. **Feature : section "Passation entre agents" dans CLAUDE.md injecte** : instructions pour `/handoff` + trigger mot-cle + instruction de lire HANDOFF.md au demarrage.

6. **Auto-update Claude Code** : `scripts/update-claude.sh` deploye comme cron root quotidien. Upgrade 2.1.107 → 2.1.111 applique. `provision.sh` mis a jour pour installer le cron au provisioning initial.

7. **Upgrade Claude Code** : 2.1.107 → 2.1.111. Alias `opus` pointe maintenant sur `claude-opus-4-7`. Active par defaut pour toute nouvelle session.

**Notes** :
- Les 12 fichiers modifies ne sont PAS commites. Tout est deploye sur le VPS via scp du binaire + deploy-commands.sh. Le binaire `cc.prev` est le rollback.
- Le user a valide le plan pour le fix `.env.local` (option 2 : `cc` ecrit `.env.local` + CLAUDE.md guide Claude pour refactorer la config si elle ne lit pas les env vars). Pas encore implemente.
- Le user souhaite aussi integrer Claude Code Desktop (app GUI) via SSH remote pour ceux qui preferent un UI graphique. Un mode `cc --setup-only` est l'approche recommandee mais pas encore validee.
- Password filebrowser (`files.paf-studio.dev`) perdu — necessite un reset via CLI.
=== CHANGELOG exists? ===
NO CHANGELOG.md
=== git status ===
?? .env.local
?? CLAUDE.md
=== recent commits ===
4afacc1 fix(sessions): keep yesterday's conversations visible & resumable
df564a2 fix(migrate): Hostinger token uses ${HOSTINGER_API_TOKEN:-<shared>} fallback (#62)
036cabf feat: per-developer credential isolation (gh, Vercel, Hostinger) (#61)
d6dcb82 feat: inject AgentMail email context into generated CLAUDE.md/AGENTS.md (#60)
5da32e4 feat: auto-name conversations & fix duplicate "Conversation 1" titles (#59)
36d3f45 fix: scope switch-client to the calling launcher session's clients (#57)
38f564c feat: add scheduled action cadence presets (#56)
c601c1a fix: expose scheduled actions on branch screen (#55)
4cab9b9 feat: add scheduled actions mode (#54)
a0207ea fix: prevent direct web terminal attaches (#53)
5504471 fix: improve terminal scrolling and reconnects (#52)
dbf53db fix: generate unique web terminal ids (#51)
=== date ===
2026-06-26 11:25
