docs: refonte ROADMAP — numerotation, effort/impact, P3/P4 explosés en 15 items détaillés
CI / lint (push) Successful in 14s
CI / security (push) Successful in 9s
CI / test (push) Successful in 25s
CI / build (push) Successful in 1s

This commit is contained in:
2026-06-05 08:45:53 -04:00
parent 28ced406bc
commit 027eab1368
+296 -166
View File
@@ -1,206 +1,336 @@
# ObsiGate — Roadmap
> **Version :** 2.0.0-dev | **Dernière mise à jour :** 2026-06-04
> Voir aussi [CHANGELOG.md](./CHANGELOG.md), [docs/ROADMAP.md](./docs/ROADMAP.md), [AUDIT_TECHNIQUE.md](./docs/AUDIT_TECHNIQUE_2026-05-27.md)
> **Version :** 2.0.0-dev | **Dernière mise à jour :** 2026-06-05
> Voir aussi [CHANGELOG.md](./CHANGELOG.md), [AUDIT_TECHNIQUE.md](./docs/AUDIT_TECHNIQUE_2026-05-27.md)
---
## ✅ Complété (v1.0.0 → v1.9.0)
## Légende
| Icône | Signification |
|---|---|
| ✅ | Terminé |
| 🔵 | En cours |
| ⚪ | Prévu / Backlog |
| 🔴 Impact | Critique / Bloquant |
| 🟡 Impact | Utile / Attendu |
| 🟢 Impact | Nice-to-have / Confort |
---
## ✅ Complété (v1.0.0 → v2.0.0-dev)
### Fondations (v1.0.0 → v1.4.0)
| # | Feature | Effort | Impact |
|---|---|---|---|
| 1 | FastAPI backend — CRUD fichiers, vaults, recherche full-text | 5j | 🔴 |
| 2 | Moteur TF-IDF + stemming français (`snowballstemmer`) | 2j | 🔴 |
| 3 | Watchdog — indexation temps réel avec debounce | 1j | 🟡 |
| 4 | Interface SPA vanilla JS — sidebar, viewer, éditeur CodeMirror | 8j | 🔴 |
| 5 | Sécurité : JWT + Argon2id, rate limiting, audit log, CSP headers | 3j | 🔴 |
| 6 | Protection path traversal, utilisateur non-root Docker | 0.5j | 🔴 |
| 7 | Compression GZip SSE-safe, Cache-Control immutable | 0.5j | 🟢 |
| 8 | PWA : manifest, service worker, mode standalone | 1j | 🟡 |
### UX & Productivité (v1.5.0 → v1.6.0)
| # | Feature | Effort | Impact |
|---|---|---|---|
| 9 | Publication publique de documents (lien partageable, token) | 1j | 🟡 |
| 10 | Webhooks HTTP avec signature HMAC-SHA256 | 1j | 🟡 |
| 11 | Dashboard statistiques (fichiers, tags, taille, vaults) | 0.5j | 🟡 |
| 12 | Gestion des conflits Syncthing | 0.5j | 🟢 |
| 13 | Index inversé incrémental (hook pattern) | 1j | 🟡 |
| 14 | Backlinks panel dans le viewer | 0.5j | 🟡 |
| 15 | Fichiers non-supportés → UI download | 0.3j | 🟢 |
| 16 | Redaction de secrets (`secret_redactor.py`) | 0.5j | 🟡 |
| 17 | Backup automatique avant écriture, restauration | 1j | 🟡 |
| 18 | Vue graphe — Barnes-Hut, focus, plein écran, export PNG | 3j | 🟡 |
| 19 | Header flat design, sticky panels, navigation historique ← → ↑ | 1j | 🟢 |
| 20 | Ctrl+survol → aperçu contenu formaté | 0.5j | 🟢 |
### Architecture (v1.5.1)
| # | Feature | Effort | Impact |
|---|---|---|---|
| 21 | Split `app.js` (8 875 lignes) → 16 modules ES | 3j | 🔴 |
| 22 | Validateur imports/exports CI + tests unitaires frontend Node.js | 0.5j | 🟡 |
### CI/CD & Qualité (v1.6.0)
| # | Feature | Effort | Impact |
|---|---|---|---|
| 23 | Pipeline Gitea Actions : lint → test → security → build | 1j | 🔴 |
| 24 | Ruff (0 erreur) + Mypy (0 erreur) + Bandit SAST + Pip-audit | 0.5j | 🟡 |
| 25 | Pytest : 285 tests, 63% coverage | 3j | 🔴 |
### AI Editor (v1.7.0)
- [x] Toolbar dropdown menus : Edit, Tone, Translate, Generate, Rewrite, Toolbox
- [x] Multi-provider : DeepSeek, OpenRouter, Gemini
- [x] 16 endpoints REST `/api/ai/{action}` + backend `ai.py` / `ai_routes.py`
- [x] Auto-save silencieux (2s debounce), loading toasts, cache toolbar si pas de clé API
- [x] Messages d'erreur clairs (401 → clé invalide, etc.)
### Vue graphe — Phases 3 & 4 (v1.6.0)
- [x] Filtre par type (dossier/fichier/.md/autre), mode focus, plein écran, export PNG
- [x] Barnes-Hut O(n log n), cache graphe
- [x] Header flat design, sticky panels, navigation historique ← → ↑
- [x] Ctrl+survol → aperçu contenu formaté
| # | Feature | Effort | Impact |
|---|---|---|---|
| 26 | Toolbar : Edit, Tone, Translate, Generate, Rewrite, Toolbox | 2j | 🟡 |
| 27 | Multi-provider : DeepSeek, OpenRouter, Gemini | 1j | 🟡 |
| 28 | 16 endpoints REST `/api/ai/{action}` + backend `ai.py` / `ai_routes.py` | 2j | 🟡 |
| 29 | Auto-save silencieux (2s debounce), loading toasts | 0.5j | 🟢 |
### Performance & CI/CD (v1.6.0)
- [x] `sortedcontainers` — O(log n) insert/remove dans l'index inversé
- [x] CI/CD Pipeline Gitea Actions (lint → test → security → build)
- [x] Ruff linting — 0 erreur
- [x] Mypy type checking — 0 erreur
- [x] Pytest — **284 tests, 70% coverage** (main.py 61%, router.py 67%, watcher.py 62%)
- [x] Tests API main.py (84 tests), Auth API (13 tests), Watcher mocké (14 tests)
- [x] Bandit SAST + Pip-audit + Docker build + coverage artifact
### Fonctionnalités avancées (v1.8.0 → v1.9.0)
### Split app.js en modules ES (v1.5.1)
- [x] 8 875 lignes → 16 modules dans `frontend/js/`
- [x] Validateur imports/exports CI
- [x] Tests unitaires frontend (Node.js)
| # | Feature | Effort | Impact |
|---|---|---|---|
| 30 | Export PDF via WeasyPrint (endpoint API + lien share public) | 1j | 🟡 |
| 31 | Palette de commandes `Ctrl+Alt+Space` | 1j | 🟡 |
| 32 | Barre d'outils mobile + palette fichiers/commandes 📱 | 1j | 🟡 |
| 33 | Drag & drop de fichiers | 1j | 🟡 |
| 34 | Filtres recherche avancés : `created:`, `modified:`, `size:` | 0.5j | 🟡 |
| 35 | Fichiers récents par vault | 0.5j | 🟡 |
| 36 | Indicateur AI Actif (header + toast) | 0.3j | 🟢 |
| 37 | Page d'accueil de vault (liste récursive par date, style recherche) | 0.5j | 🟡 |
| 38 | Indexation non-bloquante (background thread) | 0.5j | 🟡 |
| 39 | Git tags semver (v1.8.0, v1.9.0) | 0.2j | 🟢 |
### Stemming français (v1.5.1)
- [x] `snowballstemmer` — recherche accent-insensitive et morphologique
- [x] Performance O(T) au lieu de O(S×T), crash guard IndexError
### Gestion des Backups (v1.9.0)
### Fonctionnalités avancées (v1.5.0)
- [x] Publication publique de documents (lien partageable avec token)
- [x] Webhooks HTTP avec signature HMAC-SHA256
- [x] Dashboard statistiques (fichiers, tags, taille, vaults)
- [x] Documentation OpenAPI enrichie (Swagger + Redoc)
- [x] Gestion des conflits Syncthing
- [x] Index inversé incrémental (hook pattern)
| # | Feature | Effort | Impact |
|---|---|---|---|
| 40 | Diff viewer : unifié + côte à côte, restauration depuis backup | 1j | 🟡 |
| 41 | Gestionnaire de backups : page complète, filtre, suppression, purge | 1.5j | 🟡 |
| 42 | Purge par vault avec confirmation, preview contenu (100 Ko) | 0.5j | 🟡 |
| 43 | Compression gzip des vieux backups (niveau 6) | 0.5j | 🟢 |
| 44 | Backup automatique périodique (`POST /api/backups/auto`) | 1j | 🟡 |
| 45 | Restauration depuis le gestionnaire (extraction timestamp, confirmation) | 0.5j | 🟡 |
| 46 | Auto-nettoyage : `max_backups_per_file` (défaut 10) | 0.5j | 🟡 |
### Sécurité (v1.4.0)
- [x] JWT + Argon2id
- [x] Rate limiting login (IP + compte)
- [x] Audit log avec rotation
- [x] Backup automatique avant écriture
- [x] Redaction de secrets
- [x] Headers CSP
- [x] Protection path traversal
- [x] Utilisateur non-root Docker
### Mermaid.js (v2.0.0-dev)
### UX / Qualité
- [x] `.dockerignore`, `.env` → `.env.example`, Ruff config, Mypy config
- [x] Compression GZip (SSE-safe), Cache-Control immutable
- [x] Recherche sans I/O disque
- [x] Backlinks panel
- [x] Fichiers non-supportés (UI download)
| # | Feature | Effort | Impact |
|---|---|---|---|
| 47 | CDN mermaid@11, `securityLevel: strict`, `startOnLoad: false` | 0.5j | 🟡 |
| 48 | `renderMermaidBlocks()` — parse, rendu SVG, bloc d'erreur stylisé | 1j | 🟡 |
| 49 | 22 templates (flowchart → sankey-beta) | 0.5j | 🟡 |
| 50 | Live preview dans l'éditeur (debounce 500ms, panneau `#mermaid-live-preview`) | 1j | 🟡 |
| 51 | Thème dark/light synchronisé, export SVG + PNG | 1j | 🟡 |
| 52 | Rendu inline dans le viewer Markdown | 0.5j | 🟡 |
| 53 | Zoom molette + drag + boutons +/- | 0.5j | 🟢 |
| 54 | Mode plein écran avec header bar (icônes zoom, copy, download, close) | 0.5j | 🟢 |
| 55 | Focus mode — clic diagramme → panneau latéral 480px | 0.3j | 🟡 |
| 56 | Pré-processeur Obsidian (`[[liens]]`, `![[img]]`, `==highlight==`) | 0.3j | 🟡 |
| 57 | Header bar : type de diagramme + toggle Code/Preview + copy SVG + download PNG | 1j | 🟡 |
---
## 🔜 Prochaines étapes (P1/P2)
## 🔵 En cours (P1)
### ✅ 1. Tests & Couverture — FAIT
- Coverage **49% → 70%** ✅
- ~~Cibles : main.py (26%), watcher.py (23%), router.py (37%)~~ — **FAIT**
- ~~Tests E2E Playwright (fondations)~~ — reste à faire
### ✅ 2. Export PDF — FAIT
### ✅ 3. Palette de commandes (Ctrl+ALT+SPACE) — FAIT
### ✅ 4. Barre d'outils mobile + Palette fichiers/commandes 📱 — FAIT
### ✅ 5. Drag & drop de fichiers — FAIT
### ✅ 6. Diff viewer backups — FAIT (v1.9.0)
- Comparer versions sauvegardées, diff unifié + côte à côte, restauration
- Backups créés uniquement sur sauvegarde manuelle (Ctrl+S), pas sur auto-save
- Gestionnaire de backups : page complète avec filtre, suppression, purge
- Auto-nettoyage : limite configurable `max_backups_per_file` (défaut 10)
### ✅ 7. Fichiers récents par vault — FAIT
### ✅ 8. Git tags semver — FAIT (v1.8.0, v1.9.0 à venir)
### ✅ 9. Filtres search avancés — FAIT
- Opérateurs `created:`, `modified:`, `size:`
### ✅ 10. Déduplication IGNORED_DIRS — FAIT
### ✅ 11. Indicateur AI Actif — FAIT
### ✅ 12. Page d'accueil de voute — FAIT (récursif)
### ✅ 13. Indexation non-bloquante — FAIT
### 58. Tests E2E Playwright
- **Effort :** 2-3 jours | **Impact :** 🔴
- **Description :** Tests navigateur automatisés pour les flows critiques : login, navigation vault, recherche full-text, ouverture/édition/sauvegarde de fichier, rendu Mermaid, export PDF.
- **Sous-tâches :**
- [ ] Installation Playwright + config (`playwright.config.ts`)
- [ ] Fixtures : vault de test avec 5-10 fichiers .md variés
- [ ] Test : login admin → dashboard → liste vaults
- [ ] Test : navigation sidebar → ouverture fichier → viewer Markdown
- [ ] Test : recherche full-text → résultats triés par pertinence
- [ ] Test : éditeur CodeMirror → modification → Ctrl+S → backup créé
- [ ] Test : rendu Mermaid (flowchart + sequence) dans le viewer
- [ ] Test : export PDF → téléchargement vérifié
- [ ] Test : mode sombre → toggle → persistence localStorage
- [ ] Test : responsive mobile → toolbar + sidebar repliée
- [ ] Intégration CI : job `e2e` dans `.gitea/workflows/ci.yml`
---
## 📋 Reste à faire (P2/P3)
## ⚪ Backlog — Priorité 3 (P3)
### ✅ 15. Visualisation backup dans le gestionnaire — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟡
- [x] Clic sur un backup → panneau latéral avec aperçu du contenu (limité à 100 Ko)
- [x] Endpoint `GET /api/backups/content?path=...`
- [x] Panneau refermable avec bouton X
### 59. Mode hors-ligne PWA complet
- **Effort :** 3-4 jours | **Impact :** 🟡
- **Description :** Service worker avancé avec IndexedDB pour permettre la navigation et la recherche en mode hors-ligne, avec file de synchronisation au retour réseau.
- **Sous-tâches :**
- [ ] IndexedDB : stockage local de l'index des fichiers (paths, titles, tags)
- [ ] Moteur de recherche offline via IndexedDB (cursor + filtre)
- [ ] Cache des fichiers markdown récemment ouverts (derniers 50)
- [ ] Stratégie de cache : Network First avec fallback IndexedDB
- [ ] File de synchronisation : modifications offline → appliquées au retour réseau
- [ ] UI indicateur : badge « Hors-ligne » + compteur de modifications en attente
- [ ] Gestion des conflits : détection et résolution manuelle (choix version locale vs serveur)
### ✅ 16. Purge par vault dans le gestionnaire — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟡
- [x] Bouton rouge « Vider » par vault dans le gestionnaire
- [x] Confirmation avant suppression
### 60. OAuth2 / OIDC — Authentification SSO
- **Effort :** 2-3 jours | **Impact :** 🟡
- **Description :** Support de fournisseurs OAuth2/OIDC externes pour permettre l'authentification via Google, GitHub, ou tout provider compatible. Complément à l'auth JWT existante (pas de remplacement).
- **Sous-tâches :**
- [ ] Configuration par provider : `OBSIGATE_OAUTH_GOOGLE_CLIENT_ID`, `OBSIGATE_OAUTH_GITHUB_CLIENT_ID`, etc.
- [ ] Endpoint `GET /api/auth/oauth/login?provider=google` → redirection
- [ ] Endpoint `GET /api/auth/oauth/callback` → échange code → token OIDC → création/liaison compte local
- [ ] Mapping roles : config `OBSIGATE_OAUTH_DEFAULT_ROLE` (défaut `user`)
- [ ] UI : boutons « Se connecter avec Google / GitHub » sur la page login
- [ ] Sécurité : state parameter anti-CSRF, PKCE, nonce validation
- [ ] Stockage : liaison `oauth_provider` + `oauth_sub` dans `users.json`
### ✅ 17. Compression des backups — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟢
- [x] Endpoint `POST /api/backups/compress` avec params `older_than_days` et `dry_run`
- [x] Compression gzip niveau 6, suppression du .bak original si plus petit
- [x] Skip si la compression n'aide pas (fichier déjà petit)
### 61. Plugins système — Extensions utilisateur
- **Effort :** 4-5 jours | **Impact :** 🟢
- **Description :** Système de plugins permettant aux utilisateurs d'étendre ObsiGate avec des renderers personnalisés, des opérateurs de recherche, et des hooks d'UI. Inspiré du modèle de plugins Obsidian.
- **Sous-tâches :**
- [ ] Spécification du format de plugin : `plugin.json` (name, version, hooks, permissions)
- [ ] API de hooks : `onFileRender`, `onSearchFilter`, `onEditorAction`, `onSidebarItem`
- [ ] Sandbox d'exécution : Web Worker isolé pour le code plugin
- [ ] UI : page « Plugins » dans les paramètres (installer, activer/désactiver, désinstaller)
- [ ] Distribution : dépôt de plugins communautaire (fichier JSON index)
- [ ] Hot-reload : activation/désactivation sans rechargement de page
- [ ] Sécurité : manifest de permissions, validation de signature, CSP restrictif
### ✅ 18. Backup automatique périodique — FAIT
- **Effort** : 1 jour | **Impact** : 🟡
- [x] Endpoint `POST /api/backups/auto` avec param `since_hours` (défaut 24)
- [x] Backup de tous les fichiers modifiés depuis N heures, tous vaults
- [x] Utilisable via cron job externe ou appel manuel
### 62. Collaboration temps réel — Édition simultanée
- **Effort :** 5-7 jours | **Impact :** 🟢
- **Description :** Édition collaborative de fichiers markdown via WebSocket + CRDT (Yjs). Plusieurs utilisateurs peuvent éditer le même fichier simultanément avec résolution automatique des conflits.
- **Sous-tâches :**
- [ ] Serveur WebSocket : endpoint `/ws/collab/{vault}/{path}` avec gestion des rooms
- [ ] Intégration Yjs : `Y.Doc` partagé, `Y.Text` pour le contenu markdown
- [ ] Awareness : curseurs colorés par utilisateur, sélections visibles
- [ ] Synchro backend : persistance périodique du document (debounce 2s)
- [ ] Gestion des droits : vérification `check_vault_access` par connexion WS
- [ ] UI : indicateur de présence (avatars dans la barre d'outils éditeur)
- [ ] UI : curseurs distants dans CodeMirror (extension collaborative)
- [ ] Gestion des déconnexions : reconnexion automatique, merge state au retour
- [ ] Tests de charge : 5+ utilisateurs simultanés sur le même fichier
### ✅ 19. Restauration depuis le gestionnaire — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟡
- [x] Bouton « Restaurer » (icône rotate-ccw) sur chaque backup dans le gestionnaire
- [x] Extraction automatique du timestamp depuis le nom du fichier backup
- [x] Confirmation avant restauration, toast de succès
### 63. Internationalisation (i18n) — Multilingue
- **Effort :** 2-3 jours | **Impact :** 🟡
- **Description :** Support de l'anglais et du français via un système de clés de traduction. L'interface est actuellement en français uniquement. L'anglais est nécessaire pour une adoption plus large.
- **Sous-tâches :**
- [ ] Extraction des chaînes : inventaire de toutes les chaînes UI (~300)
- [ ] Format : JSON `fr.json` + `en.json` dans `frontend/locales/`
- [ ] Fonction `t(key, fallback)` → détection `navigator.language`
- [ ] Sélecteur de langue dans les paramètres (persisté localStorage)
- [ ] Traduction des messages backend (erreurs API, toasts)
- [ ] Documentation multilingue (README.fr.md, README.md)
### 64. MFA — Authentification multi-facteurs
- **Effort :** 2 jours | **Impact :** 🟡
- **Description :** Ajout de TOTP (Time-based One-Time Password) et WebAuthn (clés de sécurité) comme second facteur d'authentification pour les comptes admin.
- **Sous-tâches :**
- [ ] TOTP : génération de secret, QR code, vérification code 6 chiffres
- [ ] WebAuthn : enregistrement de clé, assertion, attestation
- [ ] UI : page « Sécurité du compte » avec activation/désactivation MFA
- [ ] Flow login : mot de passe → challenge TOTP si activé
- [ ] Recovery codes : 8 codes de backup à usage unique
- [ ] Stockage : `totp_secret` + `webauthn_credential_id` dans `users.json`
### 65. Thèmes personnalisés — CSS variables
- **Effort :** 1-2 jours | **Impact :** 🟢
- **Description :** Exposition de variables CSS pour permettre aux utilisateurs de créer des thèmes personnalisés. Presets inclus : light, dark, high-contrast, sepia.
- **Sous-tâches :**
- [ ] Audit des variables CSS existantes → liste des 30+ variables
- [ ] Fichier `themes.json` avec presets (light, dark, high-contrast, sepia)
- [ ] UI : sélecteur de thème dans les paramètres (aperçu live)
- [ ] Import/export de thème personnalisé (JSON)
- [ ] Application dynamique sans rechargement (`document.documentElement.style.setProperty`)
### 66. Export multi-formats
- **Effort :** 1-2 jours | **Impact :** 🟢
- **Description :** Export de notes individuelles ou de vaults entiers en HTML standalone, bundle Markdown (.zip), et ePub pour liseuses.
- **Sous-tâches :**
- [ ] Export HTML standalone : CSS inliné, images en base64, navigation inter-fichiers
- [ ] Export MD bundle : ZIP du vault avec structure préservée
- [ ] Export ePub : conversion markdown → ePub via `markdown` + `ebooklib`
- [ ] UI : bouton « Exporter » dans le viewer (fichier unique) + dans le menu vault (export complet)
- [ ] Endpoints : `GET /api/export/html`, `GET /api/export/md-bundle`, `GET /api/export/epub`
---
## 📋 Reste à faire (P1/P2)
## ⚪ Backlog — Priorité 4 (P4)
### ✅ 20. Mermaid.js — Initialisation et Sécurité — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟡
- [x] CDN mermaid@11 depuis jsdelivr
- [x] Module `mermaid-viewer.js` avec `securityLevel: 'strict'` et `startOnLoad: false`
### 67. Notifications web — Push API
- **Effort :** 2 jours | **Impact :** 🟢
- **Description :** Notifications push navigateur pour les changements de vault (fichier modifié, ajouté, supprimé). Utilise la Push API et le service worker existant.
- **Sous-tâches :**
- [ ] Souscription Push : endpoint `POST /api/push/subscribe` (stockage `subscription` + `vault`)
- [ ] Envoi : webhook interne `on_file_change` → dispatch notification via Web Push
- [ ] Configuration VAPID : clés publique/privée dans `config.json`
- [ ] UI : permission navigateur + toggle activer/désactiver par vault
- [ ] Payload : titre du fichier, vault, action (created/modified/deleted)
- [ ] Clic sur notification → ouvre le fichier dans ObsiGate
### ✅ 21. Mermaid.js — Moteur de Rendu Dynamique — FAIT
- **Effort** : 1 jour | **Impact** : 🟡
- [x] `renderMermaidBlocks(container)` cible `<code class="language-mermaid">`
- [x] Validation via `mermaid.parse()` en try/catch
- [x] Succès → injection SVG, échec → bloc d'erreur stylisé
### 68. Health check enrichi
- **Effort :** 1 jour | **Impact :** 🟢
- **Description :** Endpoint `/api/health` étendu avec métriques détaillées : état de l'index, consommation mémoire, uptime, connexions SSE actives, nombre de backups, dernière indexation.
- **Sous-tâches :**
- [ ] Métriques index : nombre de fichiers, nombre de tokens, génération courante
- [ ] Métriques mémoire : RSS, heap used (via `psutil` ou `/proc/self/status`)
- [ ] Métriques uptime : `time.time() - server_start_time`
- [ ] Métriques backups : nombre total, âge du plus vieux, espace disque
- [ ] Format réponse JSON structuré : `{ status, uptime, index, memory, backups, connections }`
- [ ] Endpoint séparé `GET /api/health/detailed` (protégé admin)
### ✅ 22. Mermaid.js — Templates — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟡
- [x] `MERMAID_TEMPLATES` avec 22 types (core + avancés + beta)
### 69. Éditeur mobile natif — Interface tactile optimisée
- **Effort :** 2-3 jours | **Impact :** 🟢
- **Description :** Refonte de l'expérience mobile pour l'édition : barre d'outils contextuelle, presse-papiers optimisé, gestes tactiles (swipe pour actions rapides), mode lecture plein écran.
- **Sous-tâches :**
- [ ] Barre d'outils mobile flottante : **bold**, *italic*, `code`, liste, lien (inspirée de l'éditeur Obsidian mobile)
- [ ] Raccourcis swipe : gauche → backlinks, droite → table des matières
- [ ] Mode lecture : cache sidebar + header, plein écran, swipe horizontal pour page suivante
- [ ] Presse-papiers : bouton « Coller » persistant (iOS contourne restriction clipboard)
- [ ] Adaptation CodeMirror : hauteur ajustable, police agrandissable (pinch zoom)
### ✅ 23. Mermaid.js — UX Éditeur — FAIT
- **Effort** : 1 jour | **Impact** : 🟡
- [x] Live preview avec debounce 500ms dans l'éditeur
- [x] Mise à jour automatique au changement de contenu
### 70. Recherche sémantique — Embeddings vectoriels
- **Effort :** 4-5 jours | **Impact :** 🟢
- **Description :** Moteur de recherche sémantique utilisant des embeddings (sentence-transformers) pour trouver des notes par similarité de sens, au-delà des mots-clés exacts.
- **Sous-tâches :**
- [ ] Génération d'embeddings : modèle `all-MiniLM-L6-v2` via `sentence-transformers` (Python) ou appel API externe
- [ ] Stockage : index vectoriel avec `numpy` + `faiss` (ou `usearch` pour performance)
- [ ] Indexation : embedding par chunk de 512 tokens avec recouvrement
- [ ] Recherche hybride : combinaison TF-IDF + similarité cosinus (RRF — Reciprocal Rank Fusion)
- [ ] UI : toggle « Recherche sémantique » dans la barre de recherche
- [ ] UI : score de similarité dans les résultats
### ✅ 24. Mermaid.js — Thème, Export, Obsidian — FAIT
- **Effort** : 1 jour | **Impact** : 🟡
- [x] `updateMermaidTheme(isDark)` pour synchronisation dark/light
- [x] Export SVG + PNG (via canvas)
- [x] Pré-processeur Obsidian : `[[liens]]`, `![[img]]`, `==highlight==`
### 71. Tableau de bord administrateur
- **Effort :** 2 jours | **Impact :** 🟢
- **Description :** Page d'administration dédiée avec monitoring en temps réel, gestion des utilisateurs avancée, et logs d'audit visualisables.
- **Sous-tâches :**
- [ ] Widgets temps réel : CPU, mémoire, espace disque, requêtes/min (rafraîchissement SSE)
- [ ] Gestion utilisateurs : tableau triable, création/édition/suppression, filtre par rôle
- [ ] Logs d'audit : visualisation des 500 dernières entrées, filtre par utilisateur/action/date
- [ ] Backup stats : graphique d'évolution (taille totale, nombre par vault, âge moyen)
- [ ] Protection : accès restreint au rôle `admin` uniquement
### ✅ 25. Mermaid.js — Rendu inline viewer — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟡
- [x] `renderMermaidBlocks()` appelé après rendu Markdown dans viewer.js
### 72. API publique documentée — OpenAPI 3.1
- **Effort :** 1-2 jours | **Impact :** 🟢
- **Description :** Documentation OpenAPI complète et interactive (Swagger UI + Redoc) pour l'API REST, avec exemples de requêtes, descriptions en anglais, et schémas Pydantic exposés.
- **Sous-tâches :**
- [ ] Audit des endpoints existants → compléter les docstrings manquants
- [ ] Ajout de `response_model` sur tous les endpoints (40+ actuellement, ~15 sans modèle)
- [ ] Exemples dans les schémas : `examples=[...]` pour les endpoints clés
- [ ] Tagging des endpoints par catégorie (Files, Vaults, Search, Auth, AI, Backups)
- [ ] Serveur mock : `prism` ou `openapi-generator` pour tests sans backend
- [ ] Page de documentation intégrée : lien dans le menu header (« API »)
### ✅ 26. Mermaid.js — Live preview — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟡
- [x] Panneau `#mermaid-live-preview` sous l'éditeur, debounce 500ms
- [x] Extraction auto des blocs ````mermaid` du contenu
### ✅ 27. Mermaid.js — Zoom et Pan — FAIT
- **Effort** : 0.5 jour | **Impact** : 🟢
- [x] Zoom molette, drag (grab/grabbing), boutons +/- et Reset
### ✅ 28. Mermaid.js — Mode plein écran — FAIT
- **Effort** : 0.3 jour | **Impact** : 🟢
- [x] Overlay plein écran, touche Échap, clic fond pour fermer
### ✅ 29. Mermaid.js — Mode focus — FAIT
- **Effort** : 0.3 jour | **Impact** : 🟡
- [x] `setupFocusMode()` — clic sur diagramme → panneau latéral 480px
- [x] Bouton X pour fermer, mise à jour au re-clic
### 14. Tests E2E Playwright
- **Effort** : 2-3 jours | **Impact** : 🟢
- Tests navigateur automatises (login, navigation, recherche, sauvegarde)
### 73. Synchronisation multi-appareils — Obsidian Sync compatible
- **Effort :** 6-8 jours | **Impact :** 🟢
- **Description :** Synchronisation des vaults entre plusieurs instances d'ObsiGate via un protocole de synchronisation décentralisé ou compatible Obsidian Sync. Alternative self-hosted à Obsidian Sync.
- **Sous-tâches :**
- [ ] Protocole : évaluation CRDT vs OT vs diff/patch pour fichiers markdown
- [ ] Transport : WebSocket ou polling HTTPS avec compression
- [ ] Merge strategy : LWW (Last Writer Wins) avec historique des deux versions
- [ ] Détection de changements : hash SHA-256 par fichier, journal des modifications
- [ ] UI : page « Synchronisation » avec statut par appareil, historique des syncs
- [ ] Conflits : UI de résolution manuelle (diff côte à côte entre version locale et distante)
- [ ] Chiffrement : optionnel, chiffrement AES-256-GCM avant transmission
- [ ] Pairing : échange de clé publique + code QR pour appairage des appareils
---
## 📋 Backlog (P3/P4 — Long terme)
## 📊 Résumé des efforts
- **Mode hors-ligne PWA complet** : IndexedDB pour recherche offline + synchro
- **OAuth2/OIDC** : Google, GitHub, authentification SSO
- **Plugins système** : Extensions utilisateur (custom renderers, search operators)
- **Collaboration temps réel** : WebSocket + CRDT (Yjs) pour édition simultanée
- **i18n** : Support anglais + français
- **MFA** : TOTP/WebAuthn
- **Thèmes personnalisés** : CSS variables exposées
- **Export multi-formats** : HTML, MD bundle, ePub
- **Notifications web** : Push API pour changements de vault
- **Health check enrichi** : État de l'index, mémoire, uptime, clients SSE
| Priorité | Items | Effort total estimé |
|---|---|---|
| ✅ Complété | #1 → #57 | ~65 jours |
| 🔵 P1 | #58 (Playwright) | 2-3 jours |
| ⚪ P3 | #59 → #66 (8 items) | 20-27 jours |
| ⚪ P4 | #67 → #73 (7 items) | 18-23 jours |
| **Total restant** | **16 items** | **40-53 jours** |
---
## Notes
- Les items P3/P4 ne sont pas ordonnés par priorité interne — à raffiner selon les retours utilisateurs.
- L'effort inclut le développement + tests unitaires + intégration CI, mais pas la documentation utilisateur.
- Les items marqués 🟢 (nice-to-have) sont de bons candidats pour des contributions externes.
- Le mode hors-ligne (#59) et l'i18n (#63) sont les P3 ayant le meilleur rapport effort/valeur.