chore: mise à jour ROADMAP, CHANGELOG et version v0.2.0

- ROADMAP: phases 3 et 6 marquées complétées avec tests et statuts
- CHANGELOG: v0.2.0 documentée (phases 3/6, fix thumbnails, navigation, tests)
- Cargo.toml: version bump 0.1.0 → 0.2.0
This commit is contained in:
2026-06-25 10:47:53 -04:00
parent 898117cad8
commit 8e4743b6da
4 changed files with 90 additions and 123 deletions
+64 -104
View File
@@ -2,121 +2,81 @@
Toutes les modifications notables de imagod-web sont documentées ici.
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
et ce projet adhère au [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
---
## [0.1.0] — 2026-06-23
## [v0.2.0] — 2026-06-25
### 🎯 Vision
imagod-web est un **daemon + dashboard web embarqué** pour Imago, le backend intelligent de gestion d'images. Il capture automatiquement les screenshots, les envoie à Imago pour analyse (OCR, AI vision, EXIF), et offre un dashboard responsive pour les consulter.
---
### 🏗️ Architecture
| Composant | Technologie | Statut |
|-----------|-------------|--------|
| **Daemon** | Rust (tokio, clap, rusqlite) | ✅ Partiel |
| **Serveur web** | axum 0.8 + tower-http | ✅ Complet |
| **Frontend** | Vanilla JS (rust-embed) | ✅ Complet |
| **Client API** | reqwest (rustls) → Imago v2 | ✅ Complet |
| **Dédoublonnage** | SHA-256 + SQLite | ✅ Complet |
| **Temps réel** | WebSocket (broadcast) | ✅ Complet |
| **Cross-platform** | Windows (arboard, tray) + Linux (notify) | 🏗️ Partiel |
---
### ✨ Fonctionnalités
#### Dashboard Web (`serve`)
- **Authentification** par clé API Imago (login/logout, localStorage)
- **Galerie responsive** — grille adaptative desktop/mobile, breakpoints 768px et 400px
- **Upload par drag & drop** — zone de drop avec feedback visuel
- **Raccourcis clavier** — `Ctrl+U` pour upload, `Ctrl+V` pour coller depuis le presse-papier
- **Recherche** plein texte (nom, tags, description, texte OCR)
- **Pagination** — navigation par pages de 24 images
- **Modale détail** — aperçu pleine résolution, métadonnées EXIF, texte OCR, description AI
- **Suppression** — bouton 🗑️ par carte + boîte de dialogue de confirmation
- **Gestion des tags** — ajout (+), suppression (×), édition inline des tags
- **Statistiques** — nombre d'images, stockage total, nombre de tags, statut en ligne
- **Notifications toast** — succès/erreur avec code couleur
- **FAB mobile** — bouton d'upload flottant en bas à droite sur mobile
- **WebSocket** — mises à jour en temps réel quand de nouveaux screenshots sont uploadés
- **Thème sombre** — design moderne, palette cohérente
#### Client API Imago v2
- `GET /api/v1/images` — liste paginée
- `GET /api/v1/images/search` — recherche plein texte
- `GET /api/v1/images/{id}` — détail complet (EXIF, OCR, AI, métadonnées)
- `POST /api/v1/images/upload` — upload multipart
- `GET /api/v1/images/{id}/thumbnail-url` — thumbnail signé → proxy binaire
- `GET /api/v1/images/{id}/download-url` — fichier original signé → proxy binaire
- `DELETE /api/v1/images/{id}` — suppression
- `PUT /api/v1/images/{id}/tags` — mise à jour des tags
#### CLI
- `imagod-web serve` — démarre le dashboard web sur `0.0.0.0:9199`
- `imagod-web watcher` — lance le daemon de capture (stub)
- `imagod-web install` — installation comme service Windows (stub)
- `imagod-web uninstall` — désinstallation du service (stub)
- Flags : `--host`, `--port`, `--api-key`, `--api-url`
#### Dédoublonnage
- Hash SHA-256 des images
- Base SQLite locale (`imagod.db`)
- Cache LRU configurable
#### Configuration
- Fichier TOML (`~/.config/imagod-web/imagod.toml`)
- Sections : `[imago]`, `[watcher]`, `[dedup]`, `[server]`
- Variables d'environnement supportées
---
### 🚀 Ajouts majeurs
- **Phase 3 — Clipboard Watcher (Windows)** : Module `clipboard.rs` avec capture d'image via `arboard`, conversion BGRA→PNG, hachage SHA-256 pour dédoublonnage
- **Phase 6 — Boucle Watcher** : Polling unifié Windows (clipboard) / Linux-macOS (dossier), dédoublonnage SQLite persistant, pipeline complet détection → upload → nettoyage
- **Navigation dashboard** : Barre d'onglets 🖼️ Galerie | 📋 Changelog | ❓ Aide
- **Badge version** : Affichage `v0.2.0` dans l'en-tête du dashboard
- **Pages statiques** : `changelog.html` et `help.html` générées depuis le markdown, encastrées dans le binaire
- **Endpoint version** : `GET /api/version` retourne la version, le build, l'OS et l'architecture
### 🐛 Corrections
- **Thumbnails 404** : Les miniatures échouaient car les balises `<img>` n'envoyaient pas le header `X-API-Key`. Correction : `get_thumbnail()` utilise toujours la clé serveur configurée, pas le header utilisateur
- **Clé API expirée** : Mise à jour de la configuration avec la clé valide
- **Structs Imago v2** — `ExifData`, `OcrData`, `AiData` corrigés pour matcher l'API réelle (champs imbriqués camera/gps, `has_text`, nouveaux champs AI)
- **Affichage des images** — passage aux URLs signées (`thumbnail-url`/`download-url`) car les endpoints directs `/thumbnail` et `/file` n'existent pas dans Imago
- **Fallback placeholder** — remplacement du data URI SVG cassé par un placeholder DOM (emoji + texte)
- **Erreur de décodage Rust** — champ `tags` manquant dans les structs, corrigé avec `Option<Vec<String>>`
### 🧪 Tests
- **Watcher Linux validé** : Polling dossier fonctionnel, upload réussi vers Imago (image test ID=13), dédoublonnage confirmé
- **Phase 3 compilée** : Code clipboard compilé et prêt, test Windows à venir
### 📚 Documentation
- **ROADMAP.md** : Créé avec planification complète des phases 3 à 15
- **CHANGELOG.md** : Ce fichier
---
### ⚠️ Limitations connues
## [v0.1.0] — 2026-06-23
| Problème | Impact | Solution |
|----------|--------|----------|
| Clé API sans scope `images:delete` | DELETE → 403 Forbidden | Ajouter le scope dans l'admin Imago |
| Endpoint `PUT /tags` absent d'Imago | Tags non persistants | Déployer la v2.1 d'Imago |
| Stockage Imago partiellement cassé | Upload 500, file_size=0 | Correction backend Imago |
| Pas de support Linux desktop natif | Watcher clipboard inactif | Alternative `wl-clipboard` / `xclip` |
| Pas de cross-compilation testée | Binaire Linux seulement | CI/CD + tests multi-plateformes |
### 🏗️ Architecture
- Structure du projet Rust (Cargo, modules)
- CLI avec `clap` : commandes `start`, `serve`, `stop`, `status`, `config`, `logs`, `install`, `uninstall`
- Configuration TOML (`imagod.toml`) avec auto-génération
- Serveur web `axum` avec frontend vanilla JS embarqué via `rust-embed`
- Multiplateforme : Windows, Linux, macOS (x86_64, ARM64)
### 🎨 Dashboard Web (Phase 7-9)
- Interface sombre moderne, responsive mobile/desktop
- **Authentification** : Login par clé API, validation immédiate, persistence localStorage
- **Galerie d'images** : Affichage responsive avec thumbnails, recherche textuelle, stats (nombre, stockage)
- **Upload** : Zone drag & drop, sélection de fichier, barre de progression
- **Suppression** : Bouton corbeille avec confirmation, toast notification
- **Tags** : Édition inline, ajout/suppression, enregistrement automatique
- **WebSocket** : Connexion temps réel avec indicateur de statut
- **Modale** : Détail complet (EXIF, OCR, description AI, tags, taille)
- **Filtrage** : Recherche par nom, tags, description AI
### 🔌 Client Imago v2
- **Endpoints** : `list_images`, `search_images`, `upload_image`, `delete_image`, `update_tags`
- **`get_thumbnail()`** : Appel `thumbnail-url` + suivi URL signée + fallback `download-url` si 404
- **`get_file()`** : Appel `download-url` + suivi URL signée
- **Auth** : Header `X-API-Key` dynamique (clé serveur ou utilisateur)
- **Multi-tenant** : Support header `X-Tenant-ID`
### 🗄️ Dédoublonnage
- Base SQLite locale pour le cache SHA-256
- Table `dedup_hashes` avec horodatage
- Nettoyage automatique du cache (limite configurable, défaut 10 000 entrées)
### 🔧 Configuration
- `imagod.toml` : sections `[imago]`, `[watcher]`, `[dedup]`, `[ui]`, `[logging]`
- Paramètres watcher : `capture_images`, `poll_interval_ms`, `watch_dir`, `filters`
- Gestion multi-environnement : développement (dev.lab.home) et production
---
### 📦 Dépendances clés
## Légende des tags
| Crate | Version | Usage |
|-------|---------|-------|
| axum | 0.8 | Serveur HTTP + WebSocket |
| reqwest | 0.12 | Client HTTP Imago (rustls) |
| serde / serde_json | 1.x | Serialization JSON |
| rusqlite | 0.32 | Base de dédoublonnage |
| rust-embed | 8 | Frontend embarqué dans le binaire |
| clap | 4 | CLI |
| tokio | 1 | Runtime async |
| sha2 | 0.10 | Hashing SHA-256 |
| dashmap | 6 | État partagé thread-safe |
| chrono | 0.4 | Formatage dates |
---
### 🔗 Liens
- **Code source** : https://git.dracodev.net/Projets/imagod-web
- **Backend Imago** : https://git.dracodev.net/Projets/Imago
- **Auteur** : Bruno Charest <bruno.charest@gmail.com>
- **Licence** : MIT
| Tag | Signification |
|-----|--------------|
| 🚀 | Nouvelle fonctionnalité majeure |
| 🐛 | Correction de bug |
| 🧪 | Tests et validation |
| 📚 | Documentation |
| 🎨 | Interface utilisateur |
| 🔌 | Intégration API |
| 🔧 | Configuration / DevOps |
| 🗄️ | Base de données / Stockage |
| 🏗️ | Architecture / Structure |
Generated
+1 -1
View File
@@ -1267,7 +1267,7 @@ dependencies = [
[[package]]
name = "imagod-web"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"anyhow",
"arboard",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "imagod-web"
version = "0.1.0"
version = "0.2.0"
edition = "2021"
description = "Imago Daemon + Dashboard — Service de capture automatique de screenshots + Dashboard web embarqué"
authors = ["Bruno Charest <[email protected]>"]
+24 -17
View File
@@ -32,36 +32,42 @@ Les phases sont ordonnées par priorité et dépendances.
---
## 🟡 Phase 3 — Clipboard Watcher (Windows)
## 🟢 Phase 3 — Clipboard Watcher (Windows) ✅ *Complété*
**Objectif** : Capture automatique des screenshots depuis le presse-papier Windows.
| Fichier | Action | Détail |
|---------|--------|--------|
| `src/clipboard.rs` | Implémenter | Remplacer les `todo!()` par arboard |
| | `has_image()` | Détecter si le clipboard contient une image |
| | `get_image_bytes()` | Extraire l'image en `Vec<u8>` (PNG/BMP) |
| `src/clipboard.rs` | ✅ Implémenté | Capture d'image via arboard (BGRA→PNG) |
| | ✅ `has_image()` | Détecte si le clipboard contient une image |
| | ✅ `get_image_bytes()` | Extrait l'image en `Vec<u8>` (PNG) |
| | ✅ SHA-256 | Hachage pour dédoublonnage |
| | ⚠️ À tester | Test Windows réel (compilation OK, logique validée) |
**Notes techniques** :
- Utiliser `arboard::Clipboard::new()` → `get_image()`
- Convertir `ImageData` en bytes PNG via le crate `image`
- Gérer le cas où le clipboard est vide ou contient du texte
- ✅ Utiliser `arboard::Clipboard::new()` → `get_image()`
- ✅ Convertir `ImageData` en bytes PNG via le crate `image`
- ✅ Gérer le cas où le clipboard est vide ou contient du texte
- ⚠️ Testé uniquement sous Linux (headless) — validation Windows à faire
**Dépendances estimées** : crate `image` (si pas déjà présent)
---
## 🟡 Phase 6 — Boucle principale du Watcher
## 🟢 Phase 6 — Boucle principale du Watcher ✅ *Complété*
**Objectif** : Assembler clipboard + dédoublonnage + upload dans une boucle de polling.
| Fichier | Action | Détail |
|---------|--------|--------|
| `src/watcher.rs` | Implémenter | Remplacer le stub `loop` commenté |
| | Polling | Intervalle configurable (`watcher.poll_interval_ms`) |
| | Pipeline | Détection → hash → dédoublonnage → upload → notification WS |
| | Windows | Appeler `clipboard::has_image()` + `clipboard::get_image_bytes()` + `window_info::get_active_window_title()` |
| | Linux | Fallback : détection via `notify` sur `~/Pictures/Screenshots/` |
| `src/watcher.rs` | ✅ Implémenté | Boucle polling unifiée (clipboard + dossier) |
| | ✅ Polling | Intervalle configurable (`watcher.poll_interval_ms`) |
| | ✅ Pipeline | Détection → hash → dédoublonnage → upload → nettoyage |
| | ✅ Windows | Appeler `clipboard::has_image()` + `clipboard::get_image_bytes()` |
| | ✅ Linux | Polling dossier configurable (`watch_dir`) |
| | ✅ SQLite | Dédoublonnage persistant |
| | ✅ Testé Linux | Upload réussi vers Imago (ID=13) |
| | ⚠️ Test Windows | Validation clipboard réel à faire |
**Pipeline détaillé** :
```
@@ -214,8 +220,8 @@ Ces tâches dépendent du backend Imago, pas d'imagod-web directement :
|-------|--------|----------|---------------|
| 1–2 Fondations | ✅ Complété | — | — |
| 7–9 Dashboard | ✅ Complété | — | — |
| 3 Clipboard | 🟡 À faire | Haute | 2–3h |
| 6 Watcher | 🟡 À faire | Haute | 2–4h |
| 3 Clipboard | 🟢 ✅ Complété | Haute | — |
| 6 Watcher | 🟢 ✅ Complété | Haute | — |
| Correctifs Imago | 🟡 Bloquant | Critique | Variable |
| 10 Service NSSM | 🟠 À faire | Moyenne | 3–4h |
| 11 Intégration Ditto | 🟠 À faire | Moyenne | 4–8h |
@@ -231,5 +237,6 @@ Ces tâches dépendent du backend Imago, pas d'imagod-web directement :
1. **Corriger le scope `images:delete`** dans l'admin Imago → débloque la suppression
2. **Corriger le stockage Imago** (upload 500) → débloque les tests
3. **Implémenter Phase 3** (clipboard watcher) → cœur du produit
4. **Implémenter Phase 6** (watcher loop) → premier flux complet fonctionnel
3. ~~**Implémenter Phase 3** (clipboard watcher)~~ ✅ — 25 juin 2026
4. ~~**Implémenter Phase 6** (watcher loop)~~ ✅ — 25 juin 2026
5. **Corriger le backend Imago** (thumbnails, upload, stockage)