ObsiGate/ROADMAP.md
Bruno Charest 8c95899456
All checks were successful
CI / lint (push) Successful in 12s
CI / security (push) Successful in 8s
CI / test (push) Successful in 36s
CI / build (push) Successful in 3s
docs: Phase 3 graph view done
2026-05-28 14:48:46 -04:00

4.1 KiB
Raw Blame History

ObsiGate — Roadmap

Complété

CI/CD Pipeline (Gitea Actions)

  • Ruff linting — 0 erreur
  • Mypy type checking — 0 erreur (28 erreurs pré-existantes corrigées)
  • Pytest — 175 tests, 49% coverage
  • Bandit SAST — scan de sécurité
  • Pip-audit — vulnérabilités des dépendances (advisory)
  • Docker build — vérification image
  • Coverage artifact — uploadé via actions/upload-artifact@v3 (natif Gitea)
  • Runner Gitea auto-hébergé — gitea/act_runner:0.2.11 sur Alpine/Proxmox

Performance

  • sortedcontainers — O(log n) insert/remove dans l'index inversé
  • Compression GZip (SSE-safe)
  • Cache-Control immutable
  • Recherche sans I/O disque

Sécurité

  • JWT + Argon2id
  • Rate limiting
  • Audit log
  • Backup automatique
  • Redaction de secrets
  • Headers CSP
  • Protection path traversal
  • Utilisateur non-root Docker

DX / Qualité

  • .dockerignore
  • .env.env.example migration
  • Ruff config — 0 erreur
  • 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

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

  • Full-vault view : paramètre scope=full pour grapher tout le vault
  • Filtre par tag : ?tag=recette pour n'afficher que les fichiers taggés
  • Backlinks entrants : edge relation: "backlink" en plus du wikilink sortant
  • Métriques de nœud : incoming_count, outgoing_count, tag_count

Phase 2 — Frontend rendu

  • Recherche visuelle : barre de recherche qui surligne les nœuds matchants
  • Tooltips au survol : nom complet, tags, nombre de liens, chemin
  • Couleurs adaptatives : var(--bg-primary) etc. au lieu de hardcodées
  • Slider de profondeur : contrôle depth 0-3 dans l'UI

Phase 3 — Contrôles avancés

  • Filtre par type : checkbox dossier/fichier/.md/autre
  • Mode focus : centrer la vue sur un nœud spécifique
  • Vue plein écran : bouton pour passer la modale en fullscreen
  • Export PNG : bouton pour sauvegarder le graphe en image

Phase 4 — Performance

  • Barnes-Hut : O(n log n) au lieu de O(n²) pour >200 nœuds

  • Lazy loading : charger les wikilinks à la demande (pas tous au start)

  • Cache graphe : ne pas refetch si mêmes paramètres

  • 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)