Files
ObsiGate/ROADMAP.md
T
bruno 8819d04cf2
CI / lint (push) Failing after 7s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / security (push) Successful in 9s
fix: indexation inversée non-bloquante — run_in_executor
L'étape 'Building inverted index...' au démarrage bloquait l'event loop
asyncio, empêchant le serveur de répondre aux requêtes HTTP (navigation,
refresh) jusqu'à la fin de l'indexation.

- init_inverted_index() exécuté dans ThreadPoolExecutor via run_in_executor
- get_inverted_index() ne fait plus de rebuild auto bloquant
- Le serveur répond immédiatement, même pendant l'indexation
2026-06-04 07:33:50 -04:00

11 KiB
Raw Blame History

ObsiGate — Roadmap

Version : 1.8.0 | Dernière mise à jour : 2026-06-03 Voir aussi CHANGELOG.md, docs/ROADMAP.md, AUDIT_TECHNIQUE.md


✅ Complété (v1.0.0 → v1.7.0)

AI Editor (v1.7.0)

  • Toolbar dropdown menus : Edit, Tone, Translate, Generate, Rewrite, Toolbox
  • Multi-provider : DeepSeek, OpenRouter, Gemini
  • 16 endpoints REST /api/ai/{action} + backend ai.py / ai_routes.py
  • Auto-save silencieux (2s debounce), loading toasts, cache toolbar si pas de clé API
  • Messages d'erreur clairs (401 → clé invalide, etc.)

Vue graphe — Phases 3 & 4 (v1.6.0)

  • Filtre par type (dossier/fichier/.md/autre), mode focus, plein écran, export PNG
  • Barnes-Hut O(n log n), cache graphe
  • Header flat design, sticky panels, navigation historique ← → ↑
  • Ctrl+survol → aperçu contenu formaté

Performance & CI/CD (v1.6.0)

  • sortedcontainers — O(log n) insert/remove dans l'index inversé
  • CI/CD Pipeline Gitea Actions (lint → test → security → build)
  • Ruff linting — 0 erreur
  • Mypy type checking — 0 erreur
  • Pytest — 284 tests, 70% coverage (main.py 61%, router.py 67%, watcher.py 62%)
  • Tests API main.py (84 tests), Auth API (13 tests), Watcher mocké (14 tests)
  • Bandit SAST + Pip-audit + Docker build + coverage artifact

Split app.js en modules ES (v1.5.1)

  • 8 875 lignes → 16 modules dans frontend/js/
  • Validateur imports/exports CI
  • Tests unitaires frontend (Node.js)

Stemming français (v1.5.1)

  • snowballstemmer — recherche accent-insensitive et morphologique
  • Performance O(T) au lieu de O(S×T), crash guard IndexError

Fonctionnalités avancées (v1.5.0)

  • Publication publique de documents (lien partageable avec token)
  • Webhooks HTTP avec signature HMAC-SHA256
  • Dashboard statistiques (fichiers, tags, taille, vaults)
  • Documentation OpenAPI enrichie (Swagger + Redoc)
  • Gestion des conflits Syncthing
  • Index inversé incrémental (hook pattern)

Sécurité (v1.4.0)

  • JWT + Argon2id
  • Rate limiting login (IP + compte)
  • Audit log avec rotation
  • Backup automatique avant écriture
  • Redaction de secrets
  • Headers CSP
  • Protection path traversal
  • Utilisateur non-root Docker

UX / Qualité

  • .dockerignore, .env → .env.example, Ruff config, Mypy config
  • Compression GZip (SSE-safe), Cache-Control immutable
  • Recherche sans I/O disque
  • Backlinks panel
  • Fichiers non-supportés (UI download)

🔜 Prochaines étapes (par priorité)

✅ 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

  • WeasyPrint déjà intégré ✅
  • Route API /api/file/{vault_name}/pdf ✅
  • Bouton UI "PDF" dans les actions fichier ✅
  • Export dans la vue publique /s/{token}/pdf ✅
  • GTK/Pango installé dans le Dockerfile ✅

✅ 3. Palette de commandes (Ctrl+ALT+SPACE) — FAIT

  • Navigation rapide fichiers + commandes (> prefix) ✅
  • Module frontend/js/palette.js + intégré dans app.js ✅

✅ 4. Barre d'outils mobile + Palette fichiers/commandes 📱 — FAIT

  • Effort : 3-5 jours | Impact : 🟡 UX mobile
  • Fichiers : frontend/js/mobile-toolbar.js, frontend/index.html, frontend/style.css, frontend/js/app.js

✅ Phase 1 — Barre de navigation persistante

  • Bottom bar fixe : barre collée en bas de l'écran sur mobile/tablette (responsive, breakpoint < 768px)
  • Icônes : explorateur 📂, recherche 🔍, palette ⌨️, onglets 📑
  • Compteur d'onglets : badge indiquant le nombre de fichiers ouverts
  • safe-area-inset-bottom pour les iPhone avec notch
  • backdrop-filter blur pour l'effet vitré

✅ Phase 2 — Page d'accueil vault (quand aucun fichier ouvert)

  • Dashboard existant réutilisé : showWelcome() affiche stats + récents + bookmarks
  • Palette accessible depuis la barre pour ouvrir/créer des fichiers

✅ Phase 3 — Palette de fichiers (Ctrl+P style)

  • Recherche rapide via /api/suggest avec opérateurs +include -exclude
  • Raccourci : bouton ⌨️ dans la barre du bas + tap pour fichiers, long-press pour commandes
  • Résultats avec preview du chemin (vault/path)
  • Navigation clavier : flèches ↑↓ + Entrée pour ouvrir, browse répertoires

✅ Phase 4 — Palette de commandes (Ctrl+Shift+P style)

  • Liste des actions : 12 commandes (créer/supprimer fichier/dossier, thème, réindex, etc.)
  • Long-press sur le bouton palette → palette de commandes
  • Clic droit sur le bouton palette → palette de commandes
  • Fuzzy search : filtrer les commandes en tapant

✅ Phase 5 — Gestion des fichiers ouverts (tabs)

  • Indicateur d'onglets dans la barre du bas : badge compteur
  • Switcher rapide : bottom sheet animé avec liste des fichiers ouverts
  • Fermeture : bouton ✕ par onglet dans le switcher
  • Overlay : tap à l'extérieur pour fermer le sheet

✅ 5. Drag & drop de fichiers — FAIT

  • Effort : 1-2 jours | Impact : 🟡
  • Déplacer/réorganiser dans l'arborescence ✅
  • Fichiers : backend/main.py (endpoint POST /api/move/{vault_name}), frontend/js/dragdrop.js, frontend/js/app.js, frontend/style.css
  • Endpoint backend : POST /api/move/{vault_name} — déplace fichiers et dossiers vers un autre répertoire parent, même vault
  • Drag & drop frontend : glisser-déposer les .tree-item (fichiers et dossiers) vers les dossiers ou la racine d'un vault
  • Indicateurs visuels : opacité réduite sur l'élément source, outline en pointillé sur les cibles valides, surbrillance sur la cible active
  • Protection : pas de drop sur soi-même, pas de drop dans un enfant, pas de cross-vault
  • SSE + index : mise à jour de l'index et broadcast SSE après move

✅ 6. Diff viewer backups — FAIT

  • Effort : 1 jour | Impact : 🟢
  • Comparer versions sauvegardées dans .obsigate-backup/ ✅
  • Fichiers : backend/main.py (3 endpoints + helpers), frontend/js/backups.js, frontend/js/ui.js, frontend/style.css
  • GET /api/file/{vault}/backups — liste tous les backups horodatés d'un fichier (triés plus récent d'abord)
  • GET /api/file/{vault}/diff — diff unifié entre deux versions (backup vs backup, ou backup vs actuel)
  • POST /api/file/{vault}/restore — restaure une version backup (backup automatique de la version actuelle avant restauration)
  • UI modale : panneau avec sélecteur gauche (backup) / droite (version actuelle ou autre backup), diff coloré (vert/rouge), bouton Restaurer avec confirmation
  • Menu contextuel : clic droit sur un fichier → "Backups / Versions"
  • Coloration syntaxique diff : lignes ajoutées en vert, supprimées en rouge, en-têtes hunk en accent

7. Fichiers récents par vault

  • Effort : 0.5 jour | Impact : 🟡
  • Dashboard filtré par vault actif

8. Git tags semver

  • Effort : 10 min | Impact : 🟢
  • git tag v1.7.0 && git push --tags

9. Filtres search avancés

  • Effort : 1 jour | Impact : 🟡
  • Opérateurs created:, modified:, size:

10. Déduplication IGNORED_DIRS

  • Effort : 0.5 jour | Impact : 🟢
  • indexer.py et watcher.py ont des définitions séparées → mutualiser

11. Indicateur AI Actif — FAIT

  • Effort : 0.5 jour | Impact : 🟡
  • Dans le bouton/indicateur à droite du titre, en cliquant il y a un panneau avec les statuts de syncro. Ajouter un indicateur visuel dans ce panneau pour indiquer si l'IA est active, configurée, et fonctionnelle. Durant la phase de traitement de l'IA, le bouton/indicateur devrait changer de couleur pour un blanc qui flash indiquant le statut de la tâche AI en cours. ✅
  • Fichiers : backend/main.py (/api/ai/status), frontend/js/ai.js, frontend/js/sync.js, frontend/style.css
  • Badge header flash blanc : le #sync-badge devient blanc avec animation flash quand une tâche AI est en cours
  • Événements : ai-processing-start / ai-processing-end dispatchés depuis ai.js
  • Section IA dans panneau sync : statut (configurée/non configurée/traitement en cours) avec icône et couleur
  • Endpoint /api/ai/status : vérifie si au moins un provider AI est configuré

11b. Page d'accueil de voute — FAIT

  • Effort : 1 jour | Impact : 🟡
  • Une page d'accueil qui affiche les fichiers de la voute actuelle dans l'ordre du plus récent au plus ancien. Si l'utilisateur change de répertoire dans cette voute, la liste devrait se mettre à jour automatiquement. ✅
  • Fichiers : backend/main.py (/api/vault/{vault}/files), frontend/js/vaulthome.js, frontend/js/sidebar.js, frontend/style.css
  • Endpoint /api/vault/{vault}/files?dir=... : liste les fichiers d'un répertoire triés par date de modification décroissante
  • Affichage style résultats de recherche : chaque fichier utilise le même look .search-result-item (extension, icône, titre, métadonnées)
  • Breadcrumb navigable : fil d'Ariane cliquable (vault → dossier → sous-dossier)
  • Mise à jour automatique : quand on clique sur un dossier dans l'arborescence, la page se met à jour
  • Déclenchement : affiché automatiquement quand un vault spécifique est sélectionné

✅ 12. Indexation non-bloquante — FAIT

  • Effort : 0.5 jour | Impact : 🟡
  • L'étape "Building inverted index..." au démarrage bloquait l'event loop asyncio, empêchant le serveur de répondre aux requêtes HTTP (navigation, refresh) jusqu'à la fin de l'indexation.
  • Fichiers : backend/main.py, backend/search.py
  • init_inverted_index() dans run_in_executor : exécuté dans le ThreadPoolExecutor au lieu de la boucle asyncio principale
  • get_inverted_index() sans rebuild auto : ne déclenche plus de rebuild bloquant — retourne l'index vide si pas encore prêt (les recherches retournent 0 résultats jusqu'à la fin de l'indexation)
  • Navigation + refresh fonctionnels immédiatement : le serveur répond aux requêtes HTTP dès le démarrage, même pendant l'indexation

📋 Backlog (P3/P4 — Long terme)

  • 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