---
tags: [VPS-IA, opencode, agent, projet, OpenCode]
date: 2026-10-18
description: "Définit vps-admin comme agent par défaut du projet opencode et nomme le projet via l'API."
nature: documentation
projects:
  - [[03_PROJETS/VPS-IA]]
type: note
---

# VPS-IA — Agent vps-admin par défaut + projet « opencode »

## Intervention (18/10/2026)

Définition de l'agent par défaut et du nom du projet dans OpenCode (V2.0.29).

## Modifications

- **Projet** `/var/lib/opencode` (config projet `opencode.json`) :
  - ajout de `"default_agent": "vps-admin"` → l'agent **vps-admin** devient l'agent principal par défaut des nouvelles sessions du projet opencode.
  - Config rechargée via `POST /api/location/reload` (service partagé, port 49374).
- **Nom du projet** : le projet git `/var/lib/opencode` (id `d0c6d4ea…`) est nommé **`opencode`** via `PATCH /api/project/{id}` `{"name":"opencode"}`.

## Comportement

- La bascule vers un autre projet ou un worktree se fait automatiquement : les sessions sont liées au projet (répertoire git canonique) ; ouvrir OpenCode ailleurs sélectionne le projet correspondant.
- Le réglage ne remplace pas l'agent déjà stocké sur une session existante (s'applique aux nouvelles sessions).

## Vérification

- `GET /api/agent` → `vps-admin` visible, mode `primary`.
- `GET /api/project` → projet `/var/lib/opencode` (vcs git) avec `name: opencode`.

---

# Suite — Doublon de projet « opencode » et nettoyage (18/10/2026 soir)

## Constat

- **2 projets pointaient vers `/var/lib/opencode`** :
  - `d0c6d4ea…` : projet git (branche `main`), **22 sessions** — le vrai projet.
  - `a17e7fe4…` : créé le **25/09** (avant la mise en place du dépôt git le 14/10), sans VCS, icône verte, **0 session** — projet fantôme résiduel.
- L'interface web affichait en double les workspaces `swift-engine` / `misty-nebula` car **les 2 projets référencent les mêmes worktrees** (doublon de métadonnées en base).
- **Piège d'affichage identifié (code `homeProjectForSession`)** : l'app web associe chaque session à un projet **par répertoire** (premier projet trouvé dans sa liste), pas par identifiant. Tant que 2 projets pointent vers le même dossier, l'étiquette peut sauter d'un projet à l'autre (après renommage, les sessions de `/var/lib/opencode` se sont affichées sous `opencode_old`).

## Modèle retenu (projets / worktrees / workspaces)

- **Projet** = un répertoire de travail reconnu par OpenCode (souvent un dépôt git) ; les sessions y sont rattachées.
- **Worktree** = copie de travail git secondaire du même dépôt (HEAD détachée, pas une branche). `swift-engine` et `misty-nebula` : pas de branche git, travail dans le working directory, non poussé tant que non commité/poussé.
- **Workspace** (interface) = un projet ouvert dans un répertoire donné (canonical ou worktree).
- Un **projet « système »** = projet accidentel créé quand une session a pour répertoire de travail un dossier système (ex. `/usr/local/bin`, `/usr/local/sbin`, `/etc/logrotate.d`, `/etc/sudoers.d`). Sans session ni worktree — inoffensif.

## Actions

1. **Renommage** `a17e7fe4` → `opencode_old` via `PATCH /api/project/{id}` (officiel).
2. **Archivage** de `opencode_old` : `UPDATE project SET time_archived = <now>` (même mécanisme que le sweep officiel) → disparaît de la liste `GET /api/project` (filtrée sur `time_archived IS NULL`). Réversible (`time_archived = NULL`).
3. **Sauvegarde** de la base avant archivage : `/tmp/opencode/opencode.db.bak-20261018-194347`.

## Résultat

- Liste des projets : **`opencode`** (git, 22 sessions) + 4 projets parasites fermés côté interface (toujours en base, sans session).
- Worktrees `swift-engine` et `misty-nebula` **conservés** (utilisés par des sessions ; état propre, aucune modification non commitée).
- Le projet archivé conserve des lignes `worktree` résiduelles en base (inoffensives ; à purger si suppression définitive).

## Leçons

- **Ne pas supprimer un workspace** tant qu'il est lié à des sessions : la suppression = `git worktree remove` (destructif).
- Le **renommage seul ne règle pas** un doublon d'affichage : seule la **suppression du doublon** (archivage) le résout.
- Il n'existe **pas de solution TUI/API officielle** pour supprimer/archiver un projet : passer par `time_archived` en base, avec sauvegarde préalable.
