# Mises à jour & accès partagé

L'application se met à jour depuis les **GitHub Releases** du dépôt **privé** `Voxlith/ai-artiste`.
Le dashboard affiche dans la sidebar : la version actuelle, et si une nouvelle release existe,
un bouton **« Mettre à jour »** (télécharge le code source de la release, l'applique par-dessus,
puis demande un redémarrage).

> Comme le dépôt est **privé**, vérifier/télécharger une release nécessite un **token GitHub**.
> Tes artistes et tracks (`artists/`), tes données (`data/`) et `node_modules/` ne sont **jamais**
> touchés par une mise à jour.

---

## 1. Créer une release (toi, le mainteneur)

À chaque nouvelle version :

1. Mets à jour le numéro dans **`version.json`** (ex. `1.0.1`), commit & push.
2. Crée la release (le tag DOIT correspondre à `version.json`) :

   ```powershell
   gh release create v1.0.1 --title "v1.0.1" --notes "Corrections + nouveautés…"
   ```

   Pas besoin d'uploader un fichier : l'updater télécharge le **zipball source** automatiquement
   attaché à chaque release. Le tag (`v1.0.1`) est comparé à `version.json` en semver.

---

## 2. Donner l'accès à un ami

### a) L'ajouter au dépôt privé
Sur GitHub → dépôt `ai-artiste` → **Settings → Collaborators → Add people** → son compte GitHub.
Il reçoit une invitation à accepter. (Accès **lecture** suffisant pour récupérer le code et les releases.)

### b) Il récupère l'application (première installation)
Au choix :

- **Avec Git** (recommandé, permet aussi `git pull`) :
  ```powershell
  git clone https://github.com/Voxlith/ai-artiste.git
  ```
- **Sans Git** : sur la page du dépôt → **Code → Download ZIP**, puis décompresser.

Puis lancer **`start.bat`** (installe les dépendances au 1er lancement, Node 20+ requis).

### c) Configurer son token (pour les mises à jour automatiques)
L'updater cherche un token GitHub dans cet ordre :

1. **Variable d'environnement** `GITHUB_TOKEN`
2. **Fichier** `dashboard/server/.update-token` (colle juste le token dedans — il est gitignoré)
3. **GitHub CLI** : si `gh` est installé et connecté (`gh auth login`), le token est récupéré tout seul

**Le plus simple pour un ami :** créer un **Personal Access Token** et le coller dans
`dashboard/server/.update-token`.

#### Créer le token (PAT fine-grained, recommandé)
GitHub → avatar → **Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token** :
- **Resource owner** : `Voxlith`
- **Repository access** : *Only select repositories* → `ai-artiste`
- **Permissions → Repository permissions → Contents : Read-only**
- Générer, copier le token (`github_pat_…`).

(Alternative *classic token* : cocher le scope **`repo`**.)

Coller le token :
```powershell
# depuis la racine du projet
Set-Content -Path dashboard\server\.update-token -Value "github_pat_xxxxxxxx" -NoNewline -Encoding ascii
```

Relancer le dashboard → la sidebar affiche **« ✓ À jour »** ou **« Nouvelle version »**.

---

## 3. Côté technique (ce que fait « Mettre à jour »)

1. `GET /api/update/check` → API GitHub `releases/latest`, compare le tag à `version.json` (semver).
2. `POST /api/update/apply` → télécharge le **zipball** de la release (auth token, suit les redirections),
   l'extrait, puis **copie par-dessus** l'installation en sautant `.git/`, `node_modules/`, `data/`, `.update/`.
3. Si un `package.json` (server/web) a changé → `npm install` du workspace concerné.
4. `version.json` est remplacé par celui de la release → la nouvelle version s'affiche.
5. **Redémarrer** le dashboard (icône tray → *Redémarrer*, ou `stop.bat` / `start.bat`).

### Variables d'environnement (optionnel)
| Variable | Défaut | Rôle |
|----------|--------|------|
| `GITHUB_TOKEN` | — | Token d'accès au dépôt privé |
| `GITHUB_OWNER` | `Voxlith` | Propriétaire du dépôt |
| `GITHUB_REPO` | `ai-artiste` | Nom du dépôt |

### Dépannage
- **« MAJ non configurée »** : aucun token trouvé → voir §2c.
- **« Vérif. MAJ indisponible »** : token invalide/expiré, ou pas d'accès au dépôt (collaborateur ?).
- **Rien ne change après mise à jour** : il faut **redémarrer** le dashboard pour recharger le serveur.
