Files
mqtt_explorer/prompt_claude.md

417 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Prompt Claude Code — MQTT Web Explorer (Go backend persistant + UI Monokai)
Tu es **Claude Code**. Tu dois générer un **projet complet** (code + fichiers + docker) pour un client web MQTT avancé, inspiré de **MQTT Explorer**, avec un **backend Go persistant** (toujours connecté au broker même si aucune page web nest ouverte) et une UI moderne **responsive** (laptop + smartphone/tablette) avec **thèmes Dark Monokai / Light** séparés en fichiers.
Le résultat doit être **prêt à builder et lancer** via Docker.
tu me parlera en francais et les commentaire de code en francais egalement
effectue une analyse globale du projet et tu me proposera en detail de l architecture, un dessin ascii draww de l interface web.
un plan de devellopement, un structure des dossier. les fichiers de documentation seront stocker dans un dossier doc et doc/analyse.
recherche des icones et images a utiliser dans le projet avec des propositions
---
## 0) Principes darchitecture (non négociables)
### Backend persistant
- Le backend Go doit **se connecter au(x) broker(s)** et **rester connecté** en continu.
- Les messages doivent **continuer dêtre reçus et stockés** même si :
- aucun navigateur nest ouvert,
- aucune session WebSocket nest active.
- Le frontend nest quun **client de visualisation** (il ne parle jamais directement au broker MQTT).
### Perf / ressources
- Priorité à la sobriété CPU/RAM côté serveur.
- Éviter les dépendances lourdes.
- UI fluide même avec **beaucoup de topics**.
---
## 1) Objectif fonctionnel
Créer une application web permettant de :
1. **Explorer les topics MQTT** sous forme darbre hiérarchique (type “CLI tree” pliable/dépliable).
2. **Filtrer / rechercher** efficacement (pour lisibilité).
3. **Inspecter les messages** : raw, JSON lisible, JSON tree, diff dernier/précédent.
4. **Historiser** les messages en **SQLite** avec **auto-purge** (TTL).
5. **Afficher des images** dans le payload (base64 data URL, base64 brut, champ JSONPath).
6. **Publier** des messages (topic/payload/qos/retain).
7. **Tracer** des valeurs numériques (payload brut ou JSONPath) via un graphe léger.
8. **Gérer plusieurs brokers** depuis lUI (profils), avec **test réseau** (DNS/TCP/TLS/MQTT).
9. Être utilisable sur **laptop** et **mobile/tablette** (layout adaptatif).
10. Avoir un onglet **Paramètres** complet.
11. Être dockerisé (Dockerfile multi-stage + docker-compose).
---
## 2) Stack imposée
### Backend
- Langage : **Go**
- Framework : **Fiber** ou **Gin** (choisis-en un)
- MQTT client : lib robuste Go (ex: paho)
- WebSocket : natif Go + hub
- Stockage : **SQLite obligatoire**
- Configuration : variables denvironnement + fichiers optionnels
### Frontend
- **TypeScript + Vite**
- **React** (préféré)
- UI : CSS variables + composants simples
- Icônes : **Lucide** (ou équivalent SVG, via `currentColor`)
- Graphe : **uPlot** (léger)
- Police monospace : **JetBrains Mono** (topics/payload) + option UI sans-serif (Inter)
---
## 3) Arborescence attendue (monorepo)
```
/
├─ backend/
│ ├─ cmd/server/main.go
│ ├─ internal/
│ │ ├─ api/ # routes HTTP
│ │ ├─ ws/ # hub websocket + events
│ │ ├─ mqtt/ # connexion, subscribe, reconnexion
│ │ ├─ storage/ # sqlite, migrations, purge TTL
│ │ ├─ topics/ # index/arbre, stats
│ │ ├─ images/ # helpers détection (optionnel)
│ │ └─ config/ # parsing env + validation
│ ├─ migrations/
│ └─ go.mod
├─ frontend/
│ ├─ public/
│ │ ├─ favicon/
│ │ │ ├─ favicon.svg
│ │ │ ├─ favicon-32.png
│ │ │ ├─ favicon-16.png
│ │ │ └─ apple-touch-icon.png
│ │ └─ site.webmanifest
│ ├─ src/
│ │ ├─ themes/
│ │ │ ├─ theme-dark-monokai.css
│ │ │ ├─ theme-light.css
│ │ │ ├─ index.ts
│ │ │ └─ types.ts (optionnel)
│ │ ├─ styles/
│ │ │ ├─ base.css
│ │ │ ├─ typography.css
│ │ │ └─ components.css
│ │ ├─ utils/
│ │ │ ├─ theme.ts
│ │ │ ├─ api.ts
│ │ │ └─ format.ts
│ │ ├─ components/
│ │ │ ├─ TopicTreeCli.tsx
│ │ │ ├─ TopicDetails.tsx
│ │ │ ├─ PayloadViewer.tsx
│ │ │ ├─ PublishPanel.tsx
│ │ │ ├─ ChartsDock.tsx
│ │ │ ├─ SettingsPanel.tsx
│ │ │ └─ Icons.tsx
│ │ ├─ pages/
│ │ │ └─ App.tsx
│ │ └─ main.tsx
│ ├─ index.html
│ └─ package.json
├─ docker/
│ └─ mosquitto/
│ └─ mosquitto.conf
├─ docker-compose.yml
├─ Dockerfile
└─ README.md
```
---
## 4) UI/UX — exigences de design (Monokai + responsive + CLI tree)
### 4.1 Thèmes séparés (obligatoire)
- Chaque thème dans un fichier CSS séparé (chargement dynamique).
- Thèmes requis :
- `dark-monokai` (fond principal **#272822**, palette Monokai officielle)
- `light` (clair neutre, accents cohérents)
- Stocker le choix utilisateur (localStorage) + respecter `prefers-color-scheme` au premier chargement.
**Variables minimales dans chaque thème** (au moins) :
- `--bg-main`, `--bg-panel`, `--bg-code`, `--border`
- `--text-main`, `--text-secondary`, `--text-muted`
- Accents : `--accent-blue`, `--accent-green`, `--accent-yellow`, `--accent-orange`, `--accent-red`, `--accent-purple`
- JSON : `--json-key`, `--json-string`, `--json-number`, `--json-boolean`, `--json-null`
- Tree : `--tree-guide`, `--selected-bg`, `--hover-bg`
- `--focus-ring`, `--icon`
### 4.2 Polices
- `JetBrains Mono` pour topics, payload, diff, timestamps.
- Option : `Inter` pour UI générale.
### 4.3 Layout responsive
- Desktop : 3 zones (TopicTree / Details / Graph dock).
- Tablet : tree en drawer + details plein, graphs en dessous.
- Mobile : navigation par onglets :
- **Topics | Details | Publish | Graphs | Settings**
- Zones tactiles larges, barres collantes (sticky) quand utile.
### 4.4 “CLI Topic Tree” (forte valeur ajoutée)
- Rendu monospace type terminal + glyphes :
- `▾` ouvert, `▸` fermé, `│` guides.
- Actions :
- clic: toggle
- Alt+clic: expand récursif
- Shift+clic: collapse récursif
- clavier: flèches ↑↓←→
- Boutons globaux :
- Collapse all
- Expand all (profondeur max)
- Expand to selection
- Performance :
- éviter re-render complet
- mémoriser open/closed par profil
- virtualisation si trop de topics (si faisable simplement)
### 4.5 Icônes
Utiliser des icônes SVG (Lucide) :
- copier topic, copier payload
- clear history topic
- delete retained
- publish
- afficher image (preview)
- graph
- settings
- search/focus
Tooltips obligatoires sur desktop.
---
## 5) Recherche / filtres (efficacité et lisibilité)
Zone de recherche + filtres qui doit permettre :
1. Filtre topic : texte + wildcard + mode regex
2. Filtre payload : contains + regex
3. Toggles rapides :
- retained-only
- json-only
- numeric-only
- image-only
- active-only (activité < X secondes)
4. Mode Focus : masque tout sauf résultats
5. Tri :
- activité récente
- alphabétique
- taille payload
- fréquence msgs/s
Option : auto-collapse des branches non matchées pendant filtre.
---
## 6) Payload viewer (optimisé JSON lisible + diff)
Dans `TopicDetails` :
- Onglets : **Raw | Pretty JSON | JSON Tree | Diff**
- JSON Pretty :
- indentation configurable
- wrap/nowrap
- erreurs JSON visibles
- JSON Tree :
- expand/collapse
- recherche interne
- copy value
- copy JSONPath
- Diff :
- dernier vs précédent
- diff texte (ligne à ligne)
- diff JSON si valide
Limiter le rendu si payload énorme (max bytes) + bouton “charger complet”.
---
## 7) Détection & affichage images (base64 + brut)
Détecter et afficher des images si :
- payload commence par `data:image/...;base64,`
- base64 pur décodable contenant signature PNG/JPEG/GIF/WEBP
- JSON contenant champ image via liste JSONPath configurable (ex: `$.image`, `$.snapshot`, `$.payload.image`)
Afficher :
- thumbnail dans details
- modal zoom (fit-to-panel)
- lazy-load + taille max preview configurable
---
## 8) Historique SQLite (obligatoire) + auto purge TTL
### Stockage
- Tous les messages reçus sont insérés en SQLite (asynchrone, queue).
- Ring buffer RAM optionnel pour ultra-réactivité UI.
### Auto-purge
- TTL configurable (ex: 7 jours)
- Job périodique (toutes les 515 min) :
- `DELETE FROM messages WHERE ts < now - ttl`
- `VACUUM` : pas trop fréquent (1/jour max ou bouton manuel).
### Purge par topic
- Endpoint + bouton UI : “Clear topic history”
- Efface lhistorique complet du topic en base.
### Indexation
- Index indispensable : `(topic, ts)`.
---
## 9) Multi-serveurs MQTT (profils) + test réseau
### Profils depuis lUI
CRUD profils :
- name
- host / port
- TLS (on/off)
- username / password
- clientId (stable)
- keepalive
- default subscribe (ex `#`)
- qos default
- reconnect policy
Sauvegarde :
- au minimum localStorage
- idéalement SQLite côté backend (si multi-user envisagé)
### Test réseau (obligatoire)
Depuis lUI, bouton “Test” → backend :
- DNS resolve
- TCP connect (latence + timeout)
- TLS handshake (si TLS)
- MQTT connect/auth (CONNACK)
Retour UI : statut + détails derreur.
---
## 10) Paramètres (onglet Settings) — options à afficher
Longlet Paramètres doit contenir ces sections :
1. **Profils MQTT**
- liste + CRUD + import/export JSON
- bouton Test
- bouton Connect/Disconnect
2. **Souscriptions & filtrage global**
- topic root subscribe (ex `#`)
- filtres par défaut + Focus mode par défaut
- tri par défaut
3. **Historique & rétention SQLite**
- TTL (durée conservation)
- fréquence purge
- stats DB (taille, nb lignes)
- boutons : Purge now, Vacuum now (warning)
4. **Affichage payload**
- mode par défaut (Raw/JSON/Tree)
- indentation, wrap
- diff auto (on/off)
- max bytes rendu
5. **Détection images**
- activer (on/off)
- JSONPath list
- taille max preview
6. **Graphiques**
- activer auto-plot
- JSONPath numeric list
- fenêtre (N points / X minutes)
7. **Topics tree**
- profondeur expand-all
- auto-collapse pendant filtre
- mémoriser open/closed
8. **Thème & UI**
- sélecteur de thème (dark-monokai / light)
9. **Sécurité**
- mode lecture seule (désactive publish/delete)
- masque secrets dans logs
10. **Diagnostic**
- niveau logs
- stats runtime (ws clients, msgs/s)
---
## 11) Endpoints backend requis
### HTTP
- `GET /api/health`
- `POST /api/test-connection`
- `GET /api/topics` (snapshot arbre + last message + stats)
- `GET /api/topic/:topic/history?limit=&from=&to=`
- `POST /api/topic/:topic/clear-history`
- `POST /api/publish`
- `POST /api/retained/delete` (optionnel)
- `GET/POST /api/settings` (optionnel si stockage serveur)
- `GET/POST /api/profiles` (optionnel si stockage serveur)
### WebSocket
- `GET /ws/events`
- push des events :
- message reçu (topic, ts, qos, retain, payloadPreview, type hint json/image/numeric)
- stats périodiques
---
## 12) Docker (obligatoire) + Mosquitto de test
### docker-compose
- Service `mosquitto` avec config fournie (websockets activés pour tests).
- Service `mqtt-web-explorer` :
- build multi-stage
- expose `http://localhost:8088`
- volume persistant pour SQLite (ex: `./data:/data`)
- restart: unless-stopped
### Dockerfile multi-stage
- build frontend → fichiers statiques
- build backend → binaire Go
- image finale minimale
---
## 13) Favicon / manifest / PWA basique
Prévoir :
- `public/favicon/favicon.svg`
- `favicon-16.png`, `favicon-32.png`
- `apple-touch-icon.png`
- `site.webmanifest` (name, icons, theme_color, background_color)
Icône simple lisible : ondes MQTT + node.
---
## 14) Qualité attendue
- Code propre, structuré, commenté (là où ça aide)
- Erreurs affichées clairement dans lUI
- Pas de dépendances inutiles
- Le projet doit fonctionner après :
```bash
docker compose up -d --build
```
---
## 15) Sortie attendue de Claude Code
1. Génère larborescence complète.
2. Génère le contenu complet de chaque fichier.
3. Fournis un `README.md` clair :
- configuration env
- lancement docker
- description features
- limites connues
4. Assure-toi que le projet compile et démarre.
Fin.