ObsiGate/CHANGELOG.md

278 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog — ObsiGate
Toutes les modifications notables d'ObsiGate sont documentées dans ce fichier.
Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
---
## [1.7.0] — 2026-05-30
### Ajouté
- **AI Editor Toolbar** — Barre d'outils IA intégrée à l'éditeur CodeMirror
- Menus dropdown : Edit (improve, fix spelling, shorter, longer, simplify), Tone (professional, casual), Translate (multi-langue), Generate (explain, summarize, continue), Custom Rewrite, Toolbox (to list, to table, frontmatter, to canvas)
- Multi-provider : DeepSeek / OpenRouter / Gemini, configurable via `.env`
- 16 endpoints REST : `POST /api/ai/{edit|tone|translate|generate|rewrite|toolbox}`
- Auto-save silencieux (2s debounce) avec feedback visuel toast
- Cache toolbar si pas de clé API configurée
- Messages d'erreur clairs (401→clé invalide, etc.)
- **Graph view — Améliorations majeures**
- Header flat design 2 lignes responsives (titre flexible + recherche dédiée + barre statut)
- Navigation historique ← → + ↑ Parent
- Sticky panels : tuile info (top-left/right) avec métadonnées, preview pleine hauteur (droite)
- Ctrl+survol → aperçu contenu formaté (via `/raw`) dans tooltip
- Filtre par tag dans la vue graphe
- Boutons close ✕ sur les panneaux
- Fond hover foncé unifié
### Modifié
- **backends/ai.py** — Nouveau module IA backend
- **backends/ai_routes.py** — Routes API pour l'éditeur IA
- **frontend/js/ai.js** — Module frontend de la toolbar IA (404 lignes)
- **frontend/js/graph.js** — Refonte complète : sticky panels, nav historique, aperçu markdown
---
## [1.6.0] — 2026-05-29
### Ajouté
- **Vue graphe des wikilinks** — Canvas force-directed
- Phase 1 : Full-vault view, filtre par tag, backlinks entrants, métriques de nœud
- Phase 2 : Recherche visuelle, tooltips survol, couleurs adaptatives, slider profondeur (0-3)
- Phase 3 : Filtre par type (dossier/fichier/.md/autre), mode focus, plein écran, export PNG
- Phase 4 : Barnes-Hut O(n log n), cache graphe
- **sortedcontainers** → O(log n) insert/remove dans l'index inversé
- **CI/CD Pipeline complet** — Gitea Actions
- Ruff linting (0 erreur)
- Mypy type checking (0 erreur)
- Pytest — 175 tests, 49% coverage
- Bandit SAST — scan de sécurité
- Pip-audit — vulnérabilités dépendances
- Docker build — vérification image
- Coverage artifact — uploadé via `actions/upload-artifact@v3`
- Runner Gitea auto-hébergé (`gitea/act_runner:0.2.11` sur Alpine/Proxmox)
### Modifié
- `backend/search.py` — Remplacement bisect → SortedList pour le vocabulaire
- `.gitea/workflows/ci.yml` — Pipeline CI/CD complet
### Corrigé
- Résolution de 28 erreurs mypy pré-existantes
- Fix lint ruff + faux positifs bandit + pip-audit non-bloquant
---
## [1.5.1] — 2026-05-28
### Ajouté
- **Split `app.js` (8 875 lignes) en 16 modules ES**
- Modules : `state.js`, `utils.js`, `auth.js`, `ui.js` (76KB), `viewer.js` (47KB), `sidebar.js`, `search.js` (45KB), `config.js`, `dashboard.js`, `graph.js` (33KB), `sync.js`, `legacy.js`, `ai.js`
- Import/export validator CI (`tests/frontend/validate-imports.mjs`)
- Tests unitaires frontend (`tests/frontend/unit.test.mjs`)
- **Stemming français** — `snowballstemmer` intégré au tokenizer
- "manger" trouve "mangé", "mangeons", "mangeait"
- Performance O(T) au lieu de O(S×T) — fix freeze 15min sur gros vaults
- Crash guard : try/except snowballstemmer IndexError sur tokens exotiques
### Modifié
- `frontend/js/app.js` → entrypoint ES module important les 16 modules
- `backend/search.py` — tokenizer avec FrenchStemmer
### Corrigé
- Nombreuses régressions post-split : imports manquants, exports oubliés, shadowing de variables
- Réécriture state.js → mutable object (`export const state = {...}`) pour éviter les erreurs `assignment to constant`
- Plus de 60 correctifs d'imports/exports validés par le validator CI
- Tags de template `{{...}}` exclus du tag cloud via filtre configurable
---
## [1.5.0] — 2026-05-26
### Ajouté
- **Publication publique** — Génération de lien partageable avec token unique (64-char hex)
- Expiration configurable, lecture seule, sans authentification
- `backend/share.py` + endpoints CRUD + vue publique `/s/{token}`
- Export PDF via WeasyPrint (lazy import) dans la vue publique
- Support fichiers non-Markdown dans la vue publique
- **Webhooks** — Notifications HTTP POST vers services externes
- Signature HMAC-SHA256 optionnelle
- `backend/webhooks.py` + CRUD endpoints + UI dans Configuration
- **Dashboard statistiques** — Métriques agrégées par vault
- Widget `DashboardStatsWidget` avec 4 cartes (fichiers, tags, taille, vaults)
- Widget "Derniers fichiers ouverts" avec timestamps
- **Documentation OpenAPI enrichie** — Tous les modèles Pydantic documentés (`Field(description=...)`)
- Visible dans `/docs` (Swagger UI) et `/redoc`
- **Documentation complète** — `ANALYSE_REVIEW.md`, `AUDIT_TECHNIQUE.md`, `ROADMAP.md`
### Modifié
- `frontend/js/app.js` — Nouveau système d'onglets (TabManager), dashboard
- `frontend/style.css` — Dashboard, share view, webhooks UI
- `backend/main.py` — Nouveaux endpoints share/webhooks/dashboard
- `backend/search.py` — Index inversé incrémental (hook pattern)
---
## [1.4.0] — 2026-05-25
### Ajouté
- **Rate limiting** — IP-based (10 tentatives/15min) + lockout par compte (5 tentatives)
- `backend/ratelimit.py` — RateLimiter thread-safe avec nettoyage périodique
- Intégré à `backend/auth/router.py`
- **Secret redactor** — Masquage automatique des secrets dans les aperçus
- `backend/secret_redactor.py` — JWT, API keys, tokens GitHub, clés privées, connection strings
- **Audit log** — Traçage des écritures/suppressions/changements de config
- `backend/audit.py` — JSON lines dans `data/audit.log`, rotation 10MB
- **Backup automatique avant écriture**
- Sauvegarde du contenu original dans `.obsigate-backup/` avant PUT/DELETE
- **Backlinks panel** — Fichiers avec wikilinks pointant vers le fichier courant
- `GET /api/file/{vault}/backlinks` + index inversé dans `indexer.py`
- **Gestion des conflits Syncthing**
- Détection automatique des fichiers `.sync-conflict-*`
- Résolution : garder local, garder conflit
- `GET /api/conflicts`, `POST /api/conflicts/resolve`
- **Syncthing conflicts dashboard** — Vue dédiée dans l'UI
- **IGNORED_DIRS configurable** — `OBSIGATE_IGNORED_DIRS` (liste séparée par virgules)
- **Timeout de session configurable** — `OBSIGATE_ACCESS_TOKEN_TTL` / `OBSIGATE_REFRESH_TOKEN_TTL`
### Modifié
- `backend/main.py` — +audit, +backup, +redaction, +backlinks endpoint, +conflicts endpoint
- `backend/indexer.py` — +backlink index, +IGNORED_DIRS
- `backend/auth/router.py` — +IP rate limiting
- `backend/auth/jwt_handler.py` — +configurable TTL
- `backend/watcher.py` — +configurable IGNORED_DIRS
---
## [1.3.0] — 2026-05-23
### Ajouté
- **Authentification complète** — JWT + Argon2id
- Login/logout, refresh tokens, cookies httpOnly
- Contrôle d'accès par vault
- Interface d'administration : création/modification/suppression d'utilisateurs
- "Se souvenir de moi", sessions persistantes
- `backend/auth/` — 5 modules (~600 lignes)
- **CodeMirror 6** — Éditeur de fichiers intégré
- Syntax highlighting multi-langage
- Sauvegarde, annulation, fallback textarea si CM6 échoue
- Auto-sync frontmatter YAML
- Find-in-page (Ctrl+F) avec regex, barre de navigation
- **PWA complet** — `manifest.json`, `sw.js`, icônes multi-tailles
- Installation via bouton "Installer l'application"
- Thème synchronisé entre fenêtres popout
- Service Worker avec mise en cache
- **Synchronisation temps réel** — Watchdog + SSE
- Surveillance automatique des fichiers
- Mise à jour incrémentale de l'index
- SSE Manager avec reconnexion automatique
- `backend/watcher.py` — watchdog observer avec debounce 2s
- **Drag & drop / rename** — Menu contextuel arborescence
- Création fichier/dossier, rename inline, suppression
- Boutons d'action toujours visibles, support mobile long-press
### Modifié
- `frontend/app.js` — Refonte majeure : authentication flows, code editor, PWA, sync
- `frontend/style.css` — CodeMirror themes, auth forms, PWA UI, responsive
- `docker-compose.yml` — auth env vars, data volume, non-root user
- `backend/main.py` — auth middleware, file CRUD, code editor API, SSE, PWA
- `requirements.txt` — argon2-cffi, python-jose, python-multipart
---
## [1.2.0] — 2026-05-18
### Ajouté
- **Rendu d'images Obsidian** — Support complet de toutes les syntaxes
- Standard Markdown avec attributs HTML
- Wiki-link embed (`![[path/to/image.png]]`)
- Markdown standard (`![alt](path)`)
- Résolution multi-stratégies (7 niveaux)
- Indexation des attachements au démarrage
- Cache de résolution pour performance
- **Système de fichiers cachés** — Configuration par vault
- `includeHidden`, `hiddenWhitelist` — UI + env vars
- Filtrage côté client (hideHiddenFiles)
### Ajouté
- `backend/attachment_indexer.py` — Scan et indexation d'images
- `backend/image_processor.py` — Prétraitement Markdown pour les syntaxes d'images
- `GET /api/image/{vault}?path=` — Serve images avec MIME types
- `POST /api/attachments/rescan/{vault}` — Rescan manuel
- `HIDDEN_FILES_GUIDE.md`, `IMAGE_RENDERING_GUIDE.md`
---
## [1.1.0] — 2026-05-15
### Ajouté
- **Recherche TF-IDF avancée** — Moteur complet avec index inversé
- Opérateurs : `tag:`, `vault:`, `title:`, `path:`, `ext:`
- Autocomplétion intelligente (fichiers, tags, historique)
- Facettes, pagination, tri par pertinence
- Snippets surlignés `<mark>`, accent-insensitive
- Search history (localStorage, max 50, LIFO, dédupliqué)
- **Recherche regex** — `extractRegexSnippet()` avec surlignage
- **Recherches sauvegardées** — CRUD API + sidebar UI
- Sauvegarde/chargement/suppression de requêtes
- **Filtres de recherche** — toggles (case, mot entier, regex), chemins
- **Onglets sidebar** — vaults, tags, récents, saved searches
- **Auto-expand vault** dans le filtre sidebar
- **Tree search** — Filtrage temps réel de l'arborescence avec surlignage
### Modifié
- `backend/search.py` — Nouveau : InvertedIndex, TF-IDF, autocomplete
- `frontend/app.js` — Refonte recherche : nouveau système de requêtes, facettes, pagination, autocomplete
- `frontend/style.css` — Search results cards, autocomplete dropdown, tags
---
## [1.0.0] — 2026-05-10
### Ajouté
- **Première version stable** — Porte d'entrée web pour vaults Obsidian
- **Multi-vault** — Visualisation de plusieurs vaults simultanément
- **Arborescence** — Navigation hiérarchique avec lazy-loading
- **Rendu Markdown** — Conversion HTML via mistune (tables, task lists, footnotes, strikethrough)
- **Extraction YAML frontmatter** — Tous les champs parsés avec carte pliable, badges, tags
- **Vue Source (raw)** — Toggle markdown brut + frontmatter
- **Édition** — PUT/DELETE fichiers via API
- **Breadcrumbs** — Navigation avec auto-expand et highlight
- **TOC** — Table des matières avec scroll spy et barre de progression
- **Thème clair/sombre** — Toggle localStorage + synchronisé fenêtres popout
- **Popout** — Fenêtre détachée pour affichage standalone
- **Configuration UI** — Paramètres persistants par vault
- **Docker multi-stage** — Image ~180MB, linux/amd64 + arm64 + arm/v7 + i386
- **Healthcheck** — Endpoint `/api/health`
- **Headers sécurité** — CSP, X-Frame-Options, XSS-Protection, Referrer-Policy
- **Path traversal protection** — `_resolve_safe_path()` symlink-aware
- **Security hardening** — Utilisateur non-root (UID 1000)
- **Compression GZip** (SSE-safe), **Cache-Control immutable**
- **build.sh** — Script de build automatisé
### Architecture
- **Backend** : FastAPI 0.110.3, uvicorn 0.30.0, Python 3.11+
- **Frontend** : Vanilla JS SPA (0 dépendances npm), CSS custom properties
- **Indexation** : In-memory, mise à jour incrémentale, watcher watchdog
- **Recherche** : TF-IDF inversé, sans I/O disque