# ObsiGate — Roadmap ## ✅ Complété ### CI/CD Pipeline (Gitea Actions) - [x] Ruff linting — 0 erreur - [x] Mypy type checking — 0 erreur (28 erreurs pré-existantes corrigées) - [x] Pytest — 175 tests, 49% coverage - [x] Bandit SAST — scan de sécurité - [x] Pip-audit — vulnérabilités des dépendances (advisory) - [x] Docker build — vérification image - [x] Coverage artifact — uploadé via `actions/upload-artifact@v3` (natif Gitea) - [x] Runner Gitea auto-hébergé — `gitea/act_runner:0.2.11` sur Alpine/Proxmox ### Performance - [x] `sortedcontainers` — O(log n) insert/remove dans l'index inversé - [x] Compression GZip (SSE-safe) - [x] Cache-Control immutable - [x] Recherche sans I/O disque ### Sécurité - [x] JWT + Argon2id - [x] Rate limiting - [x] Audit log - [x] Backup automatique - [x] Redaction de secrets - [x] Headers CSP - [x] Protection path traversal - [x] Utilisateur non-root Docker ### DX / Qualité - [x] `.dockerignore` - [x] `.env` → `.env.example` migration - [x] Ruff config — 0 erreur - [x] Mypy config — 0 erreur --- ## 🔜 Prochaines étapes (par priorité) ### 1. Stemming français 🇫🇷 ✅ - **Effort** : 30 min — **FAIT** - **Impact** : 🟡 Améliore la recherche ×2 pour les termes fléchis - **Module** : `snowballstemmer` (stemmer français) - **Fichiers** : `backend/search.py` (tokenizer) ### 2. Split `app.js` en modules ES ✅ - **Effort** : 3-4h — **FAIT** - **Impact** : 🟡 Dette technique, maintenabilité - **Fichiers** : `frontend/app.js` (~8875 lignes → 12 modules dans `frontend/js/`) - **Modules** : state, utils, auth, search, sidebar, viewer, ui, dashboard, config, sync, graph, legacy ### 4. Tests d'intégration - **Effort** : 3-5 jours - **Impact** : 🟢 Couverture 49% → 70%+ - **Cibles** : `main.py` (26%), `watcher.py` (23%), `router.py` (37%), `create_admin.py` (0%), `image_processor.py` (15%) ### 5. Export PDF - **Effort** : 1 jour - **Impact** : 🟡 WeasyPrint déjà intégré (lazy import), manque GTK sur certaines plateformes - **Alternative** : Markdown → HTML → PDF via headless Chrome ### 3. Vue graphe des wikilinks ✅ FAIT **Base existante** : API `/api/graph/{vault}` + `GraphViewManager` (canvas force-directed) → **Amélioration d'une feature existante**, pas création from scratch #### Phase 1 — Backend API - [x] **Full-vault view** : paramètre `scope=full` pour grapher tout le vault - [x] **Filtre par tag** : `?tag=recette` pour n'afficher que les fichiers taggés - [x] **Backlinks entrants** : edge `relation: "backlink"` en plus du wikilink sortant - [x] **Métriques de nœud** : `incoming_count`, `outgoing_count`, `tag_count` #### Phase 2 — Frontend rendu - [x] **Recherche visuelle** : barre de recherche qui surligne les nœuds matchants - [x] **Tooltips au survol** : nom complet, tags, nombre de liens, chemin - [x] **Couleurs adaptatives** : `var(--bg-primary)` etc. au lieu de hardcodées - [x] **Slider de profondeur** : contrôle depth 0-3 dans l'UI #### Phase 3 — Contrôles avancés - [x] **Filtre par type** : checkbox dossier/fichier/.md/autre - [x] **Mode focus** : centrer la vue sur un nœud spécifique - [x] **Vue plein écran** : bouton pour passer la modale en fullscreen - [x] **Export PNG** : bouton pour sauvegarder le graphe en image #### Phase 4 — Performance - [x] **Barnes-Hut** : O(n log n) au lieu de O(n²) pour >200 nœuds - [x] **Cache graphe** : ne pas refetch si mêmes paramètres - [ ] ~~Lazy loading~~ : non nécessaire avec le cache (les wikilinks sont déjà dans l'API) - **Effort** : 2-3 jours - **Fichiers** : `backend/main.py` (API), `frontend/js/graph.js` (rendu), `frontend/index.html` (UI) --- ## 📋 Backlog - **Filtres de recherche avancés** : created:, modified:, size: - **Mode hors-ligne** : Service Worker + cache IndexedDB - **API publique documentée** : OpenAPI/Swagger amélioré - **Thèmes personnalisés** : CSS variables exposées - **Export multi-formats** : HTML, MD bundle, ePub - **Notifications web** : Push API pour changements de vault - **Multi-langue i18n** : Interface traduisible - **Plugins système** : Extensions utilisateur (similaire Obsidian)