diff --git a/.env.example b/.env.example index 74a7436..9a0f505 100644 --- a/.env.example +++ b/.env.example @@ -129,6 +129,7 @@ DEEPSEEK_MODEL=deepseek-chat # DRACO_FLOWDECK_URL=https://flowdeck.dracodev.net # DRACO_TIKTAK_URL=https://tiktak.dracodev.net # DRACO_KANBANTE_URL=https://kanbante.dracodev.net +# DRACO_SHAARIT_URL=https://shaarit.dracodev.net # DRACO_GITEA_URL=https://git.dracodev.net # ── Fusion — émission d'événements vers le service d'agents (#220) ── diff --git a/CHANGELOG.md b/CHANGELOG.md index aaf0193..ab2b479 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). > **En cours de développement** : les changements à venir sont listés dans la section -> [Unreleased](#unreleased). La dernière version livrée est **2.83.0**. +> [Unreleased](#unreleased). La dernière version livrée est **2.83.1**. --- @@ -14,6 +14,13 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [2.83.1] — 2026-11-03 + +- **Barre commune (dracodev-commons v0.2.0 vendangée, @70c837a)** : nouvel onglet **ShaarIt** (bookmarks, réécriture Rust de Shaarli) après Kanbante et avant l'onglet Console Spark — `frontend/draco-barre.css` et `frontend/draco-barre.js` remplacés **verbatim** par la v0.2.0 (hachages vérifiés), logo `frontend/img/logos/shaarit.svg` ajouté tel quel ; le fragment porté dans `frontend/index.html` et `frontend/recherche.html` (jeton `{{URL_SHAARIT}}` remplacé par la route `/recherche`). L'URL ShaarIt suit le **même mécanisme** que les autres apps : `backend/draco_config.py` gagne la clé `shaarit` (défaut officiel `https://shaarit.dracodev.net`, variable `DRACO_SHAARIT_URL`, dérivation `-dev` → `shaarit-dev` depuis l'hôte de l'agent), servie dans `window.DRACO_URLS` et réécrite sur l'onglet comme les autres. +- **⚠️ Changement de comportement visible — garde `data-theme` (CSS v0.2.0)** : les blocs `prefers-color-scheme` du CSS vendangé sont désormais préfixés `html:not([data-theme])`. La copie précédente n'avait **pas** cette garde. ObsiGate pose toujours `data-theme` sur ``, donc sa barre ne change pas en pratique ; la garde ne s'exercerait que sur une page hôte sans `data-theme` (elle ne forcerait plus le sombre système contre un choix clair). Signalé pour arbitrage à la fusion, comme chez Flowdeck où le piège était actif. + +--- + ## [2.83.0] — 2026-11-03 - **Vaults DIR : exclusions par vault et lecture seule déclarable** (prépare le vault « Spark ») : trois nouvelles variables par vault DIR — `DIR_N_READONLY=true` (les mutations sont refusées en 403 « read_only » et l'arborescence n'affiche plus les actions d'écriture pour ce vault), `DIR_N_IGNORED_DIRS=.home,.venv,…` (noms de dossiers cachés à toute profondeur, en plus du global `IGNORED_DIRS`) et `DIR_N_IGNORED_PATHS=Executeurs/*/data,…` (motifs fnmatch sur le chemin relatif ; un dossier qui matche cache tout son sous-arbre). Les exclusions s'appliquent désormais **partout** — navigation (`/api/browse`), lecture (`/api/file`, `raw`, téléchargement : 404), liste des chemins et indexation — et plus seulement à l'indexeur. `/api/vaults` expose `readonly` pour chaque vault. Sans ces variables, comportement inchangé. Fiche : `docs/features/spark-vault-dir.md`. Tests : `tests/test_spark_vault_dir.py`. diff --git a/README.fr.md b/README.fr.md index 7143cf1..e9d38c4 100644 --- a/README.fr.md +++ b/README.fr.md @@ -4,7 +4,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-2.83.0-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.83.1-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/) @@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l ## 📝 Changelog -Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.83.0). +Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.83.1). --- -*Projet : ObsiGate | Version : 2.83.0 | Dernière mise à jour : Septembre 2026* +*Projet : ObsiGate | Version : 2.83.1 | Dernière mise à jour : Septembre 2026* diff --git a/README.md b/README.md index c448af9..db8e177 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface. -[![Version](https://img.shields.io/badge/Version-2.83.0-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.83.1-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/) @@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) ## 📝 Changelog -See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.83.0). +See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.83.1). --- -*Project: ObsiGate | Version: 2.83.0 | Last updated: September 2026* +*Project: ObsiGate | Version: 2.83.1 | Last updated: September 2026* diff --git a/VERSION b/VERSION index c0c86fb..3478b1d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.83.0 \ No newline at end of file +2.83.1 diff --git a/backend/draco_config.py b/backend/draco_config.py index eae1e65..1898ced 100644 --- a/backend/draco_config.py +++ b/backend/draco_config.py @@ -17,6 +17,7 @@ Variables (voir ``.env.example``) : - ``DRACO_FLOWDECK_URL`` — base publique de Flowdeck. - ``DRACO_TIKTAK_URL`` — base publique de TikTak. - ``DRACO_KANBANTE_URL`` — base publique de Kanbante. +- ``DRACO_SHAARIT_URL`` — base publique de ShaarIt (barre v0.2.0). - ``DRACO_GITEA_URL`` — base publique de Gitea (les cartes Kanbante *sont* des issues Gitea, contrat liens-profonds) ; distincte de ``OBSIGATE_GITEA_URL`` (source connectée de @@ -50,6 +51,7 @@ DEFAUTS: dict[str, str] = { "flowdeck": "https://flowdeck.dracodev.net", "tiktak": "https://tiktak.dracodev.net", "kanbante": "https://kanbante.dracodev.net", + "shaarit": "https://shaarit.dracodev.net", "gitea": "https://git.dracodev.net", } @@ -59,6 +61,7 @@ _VARIABLES: dict[str, str] = { "flowdeck": "DRACO_FLOWDECK_URL", "tiktak": "DRACO_TIKTAK_URL", "kanbante": "DRACO_KANBANTE_URL", + "shaarit": "DRACO_SHAARIT_URL", "gitea": "DRACO_GITEA_URL", } @@ -71,6 +74,7 @@ _SLUGS_HOTE: dict[str, str] = { "flowdeck": "flowdeck", "tiktak": "tiktak", "kanbante": "kanbante", + "shaarit": "shaarit", } # Premier label de l'hôte de l'agent : ``agent`` suivi d'un suffixe diff --git a/backend/main.py b/backend/main.py index 68d1855..ff26373 100644 --- a/backend/main.py +++ b/backend/main.py @@ -966,7 +966,8 @@ if FRONTEND_DIR.exists(): frontend/recherche.html est servi avec les jetons {{URL_*}} remplacés par urls_publiques() (même contrat que le fragment - de barre, jeton {{URL_AGENT}} inclus pour l'onglet Console + de barre, jetons {{URL_SHAARIT}} et {{URL_AGENT}} inclus pour + les onglets ShaarIt (barre v0.2.0) et Console Spark de la barre re-vendangée) et le nonce CSP frais ; la réponse pose sa propre CSP (préservée par SecurityHeadersMiddleware, qui ne la pose que si elle est @@ -992,6 +993,7 @@ if FRONTEND_DIR.exists(): ("{{URL_FLOWDECK}}", "flowdeck"), ("{{URL_TIKTAK}}", "tiktak"), ("{{URL_KANBANTE}}", "kanbante"), + ("{{URL_SHAARIT}}", "shaarit"), ("{{URL_AGENT}}", "agent"), ): html = html.replace(jeton, urls.get(cle, "")) diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index 70b24d4..698b056 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -2626,7 +2626,7 @@ dependencies = [ [[package]] name = "obsigate-desktop" -version = "2.83.0" +version = "2.83.1" dependencies = [ "chrono", "env_logger", diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 7405961..087f8cc 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "obsigate-desktop" -version = "2.83.0" +version = "2.83.1" description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian" authors = ["Bruno Charest"] edition = "2021" diff --git a/desktop/tauri.conf.json b/desktop/tauri.conf.json index f970521..0ad7cf8 100644 --- a/desktop/tauri.conf.json +++ b/desktop/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json", "productName": "ObsiGate", - "version": "2.83.0", + "version": "2.83.1", "identifier": "com.obsigate.desktop", "build": { "frontendDist": "../frontend", diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index e5c5866..517768f 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,6 @@ # ObsiGate — Roadmap -> **Version :** 2.83.0 | **Dernière mise à jour :** 2026-11-03 +> **Version :** 2.83.1 | **Dernière mise à jour :** 2026-11-03 > **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact > vers les fonctionnalités livrées. > - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)** diff --git a/frontend/draco-barre.css b/frontend/draco-barre.css index 08d574a..8c9927c 100644 --- a/frontend/draco-barre.css +++ b/frontend/draco-barre.css @@ -12,9 +12,18 @@ Alertes icône seule. v0.1.11 : marque = étoile Spark monochrome (blanche barre foncée, noire barre claire) ; anneau rouge #c00000 autour de l'avatar flottant. + v0.2.0 : nouvel onglet « ShaarIt » (data-app="shaarit", --app émeraude + #059669, logo logos/shaarit.svg via {{LOGO_SHAARIT}}) avant l'onglet + agent ; GARDE data-theme : les blocs prefers-color-scheme ne + s'appliquent que si n'a AUCUN attribut data-theme + (html:not([data-theme])) — avant ce correctif, un hôte ayant choisi + le clair via data-theme="light" héritait quand même du sombre + système (piège constaté dans les copies vendangées de + Kanbante/Flowdeck ; les re-vendanges de la v0.2.0 le corrigent). Jetons repris du prototype validé Console v7.2. Thème : clair par défaut, sombre via [data-theme="dark"] sur - ou prefers-color-scheme si l'app intégratrice ne force rien. */ + ou prefers-color-scheme si l'app intégratrice ne force rien + (aucun attribut data-theme sur ). */ .draco-bar { --bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3; @@ -27,8 +36,12 @@ background: var(--surface); border-bottom: 1px solid var(--line); font: 500 14px/1.3 system-ui, "Segoe UI", sans-serif; color: var(--ink); } +/* Garde data-theme (v0.2.0) : le sombre système ne s'applique QUE si + * l'hôte n'a posé aucun data-theme sur . Sans cette garde, un + * hôte en data-theme="light" sur un système sombre affichait la barre + * sombre malgré son choix explicite. */ @media (prefers-color-scheme: dark) { - .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f; + html:not([data-theme]) .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f; --ink:#eceee9; --ink-2:#a6aba2; --ink-3:#8b9089; --line:#2e302c; } } [data-theme="dark"] .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f; @@ -48,7 +61,7 @@ barre foncée (filtre annulé par les règles thème ci-dessous). */ .draco-brand-mark img { width: 26px; height: 26px; object-fit: cover; display: block; filter: brightness(0); } @media (prefers-color-scheme: dark) { - .draco-bar .draco-brand-mark img { filter: none; } + html:not([data-theme]) .draco-bar .draco-brand-mark img { filter: none; } } [data-theme="dark"] .draco-bar .draco-brand-mark img { filter: none; } @@ -218,6 +231,9 @@ .draco-bar[data-current="flowdeck"] .draco-apptab[data-app="flowdeck"], .draco-bar[data-current="tiktak"] .draco-apptab[data-app="tiktak"], .draco-bar[data-current="kanbante"] .draco-apptab[data-app="kanbante"], + /* v0.2.0 : sur ShaarIt elle-même (data-current="shaarit"), c'est + l'onglet ShaarIt qui reste visible en mobile. */ + .draco-bar[data-current="shaarit"] .draco-apptab[data-app="shaarit"], /* Chantier 5 : sur la console elle-même (data-current="agent", programme console #71), c'est l'onglet Console Spark qui reste visible en mobile — les 4 hôtes gardent leur propre courant. */ diff --git a/frontend/draco-barre.js b/frontend/draco-barre.js index 6ea58ca..4e77833 100644 --- a/frontend/draco-barre.js +++ b/frontend/draco-barre.js @@ -8,7 +8,12 @@ * correctif fusion #70 (SANS bump de version, publication séparée) : * bouton trois points et son menu par défaut SUPPRIMÉS, « Console Spark » * ajoutée au menu de la marque, fermeture/focus corrigés (voir - * « Menu des applications », « Focus » et « Écouteurs globaux »). + * « Menu des applications », « Focus » et « Écouteurs globaux ») ; + * v0.2.0 : 5e application ShaarIt — clé urls.shaarit, défaut officiel + * https://shaarit.dracodev.net/, dérivation -dev shaarit-dev (même + * contrat que les autres apps), entrée APP_LABELS ; l'onglet + * (data-app="shaarit", après Kanbante, avant agent) est repris + * automatiquement par la construction du menu de la marque. * * Aucun gestionnaire inline : un seul écouteur délégué sur le document * (patron validé par le prototype — les onclick du HTML généré sont @@ -26,6 +31,7 @@ * flowdeck: "https://flowdeck.dracodev.net/", * tiktak: "https://tiktak.dracodev.net/", * kanbante: "https://kanbante.dracodev.net/", + * shaarit: "https://shaarit.dracodev.net/", * agent: "https://agent.dracodev.net/", * spark: "https://spark.dracodev.net/" * }, @@ -54,10 +60,13 @@ * La clé spark ne correspond à aucun onglet de la barre : elle est * résolue et exposée via DRACO_BAR.urls pour le panneau Spark * (panneau-agent), qui suit le même contrat d'injection. La clé agent, - * elle, a un onglet depuis le chantier 5 (ordre : ObsiGate, Flowdeck, - * TikTak, Kanbante, Console Spark) : elle suit donc l'étape « href + * elle, a un onglet depuis le chantier 5 (ordre, v0.2.0 : ObsiGate, + * Flowdeck, TikTak, Kanbante, ShaarIt, Console Spark) : elle suit + * donc l'étape « href * rendu » comme les autres onglets, en plus d'alimenter le menu de - * la marque et DRACO_BAR.urls. + * la marque et DRACO_BAR.urls. Même résolution pour shaarit (v0.2.0) : + * explicite > dérivation -dev shaarit-dev > href rendu + * ({{URL_SHAARIT}}) > défaut officiel. * Actions émises (data-act) : rail, palette, domaine (data-dom), * alertes, spark, rappel-entete. L'app intégratrice décide de chacune * (ouvrir la palette, le panneau Spark, changer de domaine…). @@ -144,6 +153,7 @@ flowdeck: "https://flowdeck.dracodev.net/", tiktak: "https://tiktak.dracodev.net/", kanbante: "https://kanbante.dracodev.net/", + shaarit: "https://shaarit.dracodev.net/", agent: "https://agent.dracodev.net/", spark: "https://spark.dracodev.net/" }; @@ -157,12 +167,13 @@ flowdeck: "https://flowdeck-dev.dracodev.net/", tiktak: "https://tiktak-dev.dracodev.net/", kanbante: "https://kanbante-dev.dracodev.net/", + shaarit: "https://shaarit-dev.dracodev.net/", agent: "https://agent-dev.dracodev.net/" }; var APP_LABELS = { obsigate: "ObsiGate", flowdeck: "Flowdeck", - tiktak: "TikTak", kanbante: "Kanbante" + tiktak: "TikTak", kanbante: "Kanbante", shaarit: "ShaarIt" }; /* Vrai si hostname est un hôte -dev dracodev.net : première étiquette @@ -365,7 +376,8 @@ if (badge) a.appendChild(badge.cloneNode(true)); appsMenu.appendChild(a); }); - /* Entrée « Console Spark » (#70) : après Kanbante, vers la console + /* Entrée « Console Spark » (#70) : après les onglets d'apps + * (ObsiGate…ShaarIt, v0.2.0), vers la console * de l'agent commun (URL agent résolue — explicite > -dev > * défaut prod ; aucun hôte spark-dev inventé). data-app="agent" * l'intègre à refreshMenuHrefs/applyUrls/setCurrent comme les diff --git a/frontend/img/logos/shaarit.svg b/frontend/img/logos/shaarit.svg new file mode 100644 index 0000000..7d970da --- /dev/null +++ b/frontend/img/logos/shaarit.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/frontend/index.html b/frontend/index.html index 0423d73..624ccf3 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -268,9 +268,16 @@