# AI Artiste — Dashboard

Interface locale pour **visualiser** les artistes/tracks et **piloter** Claude Code (via le **CLI local**, pas l'API) avec des formulaires pré-remplis et un stream live.

- **Backend** (`server/`) : Node + Express + ws. Lit le dossier `artists/` du projet et lance `claude -p --output-format stream-json` en child process (auth locale, skills, CLAUDE.md). Aucune clé API.
- **Frontend** (`web/`) : React + Vite. Grille d'artistes, détail (bible éclatée), tracks, et une Console de commandes (Auto-Artist, Create Track, …) avec stream temps réel et réponses multi-tours.

> Le dossier `artists/` **est** la base de données. Pas de DB.

## Prérequis

- Node 20+
- Claude Code installé et **connecté** (`claude` dans le PATH). Vérifie : `claude --version`.

## Lancer

```bash
# 1) Backend
cd dashboard/server
npm install
npm run dev        # http://localhost:8787  (PROJECT_DIR = repo racine par défaut)

# 2) Frontend (autre terminal)
cd dashboard/web
npm install
npm run dev        # http://localhost:5173  (proxy /api et /ws vers 8787)
```

Par défaut `PROJECT_DIR` = la racine du repo (`dashboard/..`). Surcharger : `PROJECT_DIR=/chemin/vers/AI_ARTISTE V2 npm run dev`.

## Sécurité

- Backend bindé sur `127.0.0.1` uniquement (local).
- `cwd` verrouillé sur `PROJECT_DIR` ; lecture FS bornée à ce dossier (anti path-traversal).
- Permissions Claude : `--permission-mode acceptEdits` + `--allowedTools` (configurable dans `server/src/config.js`). `DANGEROUS_SKIP=1` pour tout autoriser localement (à utiliser en connaissance de cause).

## Protocole de jobs (WebSocket `/ws`)

```
→ { type:'start',  form, values }          // lance un job (formulaire pré-rempli)
→ { type:'reply',  jobId, text }           // répond à une question (multi-tours via --resume)
→ { type:'cancel', jobId }
← { type:'job',    jobId, label }          // accusé + id
← { type:'event',  jobId, kind, ... }      // kind: init|text|tool|tool_result|notice
← { type:'done',   jobId, exitCode, isError }
```

Voir `server/src/claudeCli.js` (flags CLI isolés ici → un seul endroit à ajuster si le CLI évolue).
