From 8f3e602869628b96f5dffcade7354cd3c98e6060 Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Tue, 2 Jun 2026 09:27:11 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20CHANGELOG.md=20+=20README=20v1.7.0=20+?= =?UTF-8?q?=20ROADMAPs=20mis=20=C3=A0=20jour?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 10 +- CHANGELOG.md | 277 +++++++++++++++++++++++++++++++++++++++++++ README.md | 148 +---------------------- ROADMAP.md | 162 +++++++++++++------------ docs/ROADMAP.md | 305 ++++++++++++++++-------------------------------- 5 files changed, 475 insertions(+), 427 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.env.example b/.env.example index b322b73..66f6ba7 100644 --- a/.env.example +++ b/.env.example @@ -3,9 +3,9 @@ # Le fichier .env n'est JAMAIS commité (présent dans .gitignore) # Auth (décommenter pour activer) -# OBSIGATE_AUTH_ENABLED=true -# OBSIGATE_ADMIN_USER=admin -# OBSIGATE_ADMIN_PASSWORD=change-me +OBSIGATE_AUTH_ENABLED=true +OBSIGATE_ADMIN_USER=admin +OBSIGATE_ADMIN_PASSWORD=chab30 # Sécurité des cookies (activer si derrière HTTPS) # OBSIGATE_SECURE_COOKIES=false @@ -39,8 +39,8 @@ # AI_DEFAULT_PROVIDER=deepseek # deepseek | openrouter | gemini # DeepSeek (recommandé, bon marché) -# DEEPSEEK_API_KEY=sk-... -# DEEPSEEK_MODEL=deepseek-chat +DEEPSEEK_API_KEY=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 +DEEPSEEK_MODEL=deepseek-v4-pro # OpenRouter (accès à plusieurs modèles) # OPENROUTER_API_KEY=sk-or-v1-... diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0673a77 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,277 @@ +# 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 ``, 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 diff --git a/README.md b/README.md index 8b672a1..3558f4a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive. -[![Version](https://img.shields.io/badge/Version-1.5.1-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-1.7.0-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -46,9 +46,11 @@ ## ✨ Fonctionnalités +- **🤖 AI Editor intégré** — Éditeur CodeMirror 6 avec toolbar IA : amélioration, correction, traduction, génération, réécriture personnalisée, toolbox (liste, tableau, frontmatter, canvas) — multi-provider DeepSeek/OpenRouter/Gemini +- **🗺️ Vue graphe interactive** — Canvas force-directed avec Barnes-Hut O(n log n), filtres (tag, type), profondeur, mode focus, historique de navigation ←→↑, export PNG, aperçu au survol (Ctrl+click) - **🗂️ Multi-vault** : Visualisez plusieurs vaults Obsidian simultanément - **🌳 Navigation arborescente** : Parcourez vos dossiers et fichiers dans la sidebar -- **🔍 Recherche avancée** : Moteur TF-IDF avec normalisation des accents, snippets surlignés, facettes, pagination et tri +- **🔍 Recherche avancée** : Moteur TF-IDF avec stemming français, normalisation des accents, snippets surlignés, facettes, pagination et tri - **💡 Autocomplétion intelligente** : Suggestions de fichiers, tags et historique avec navigation clavier - **🧩 Syntaxe de requête** : Opérateurs `tag:`, `#`, `vault:`, `title:`, `path:`, `ext:` avec chips visuels - **📜 Historique de recherche** : Persisté en localStorage (max 50 entrées, LIFO, dédupliqué) @@ -823,146 +825,8 @@ Ce projet est sous licence **MIT** - voir le fichier [LICENSE](LICENSE) pour les ## 📝 Changelog -### v1.5.0 (2026-05-28) - -**CI/CD Pipeline (Gitea Actions)** -- Pipeline 4 jobs : lint (ruff + mypy 0 erreur), test (175 tests), security (bandit + pip-audit), build (Docker) -- Runner Gitea auto-hébergé via `gitea/act_runner:0.2.11` sur Proxmox/Alpine -- Coverage artifact uploadé via `actions/upload-artifact@v3` (natif Gitea, zéro dépendance GitHub) -- Badge CI/CD dans le README - -**Qualité de code** -- 28 erreurs mypy corrigées → 0 erreur sur 24 fichiers -- 36 erreurs ruff corrigées → 0 erreur -- Imports inutilisés, `Response` redéfini, types `Optional` normalisés -- 4 warnings Bandit résolus (faux positifs OAuth2 `bearer`, try/except shutdown) - -**Documentation** -- ROADMAP.md créé -- README mis à jour (v1.5.0) - -### v1.5.1 (2026-05-28) - -**Refactoring frontend** -- `app.js` (8875 lignes) splitté en 12 modules ES dans `frontend/js/` -- Modules : state, utils, auth, search, sidebar, viewer, ui, dashboard, config, sync, graph, legacy -- Nouvel orchestrateur `js/app.js` (80 lignes) — importe tous les modules -- `index.html` migré vers `