Merge pull request 'ObsiGate 2.83.1 : barre v0.2.0 — onglet ShaarIt + garde data-theme' (#61) from barre-v020-2-83-1 into main
CI / lint (push) Successful in 1m59s
CI / security (push) Successful in 15s
CI / test (push) Successful in 3m55s
CI / build (push) Successful in 10s
CI / e2e (push) Successful in 22m11s

This commit was merged in pull request #61.
This commit is contained in:
2026-11-04 11:16:29 -05:00
19 changed files with 132 additions and 28 deletions
+1
View File
@@ -129,6 +129,7 @@ DEEPSEEK_MODEL=deepseek-chat
# DRACO_FLOWDECK_URL=https://flowdeck.dracodev.net # DRACO_FLOWDECK_URL=https://flowdeck.dracodev.net
# DRACO_TIKTAK_URL=https://tiktak.dracodev.net # DRACO_TIKTAK_URL=https://tiktak.dracodev.net
# DRACO_KANBANTE_URL=https://kanbante.dracodev.net # DRACO_KANBANTE_URL=https://kanbante.dracodev.net
# DRACO_SHAARIT_URL=https://shaarit.dracodev.net
# DRACO_GITEA_URL=https://git.dracodev.net # DRACO_GITEA_URL=https://git.dracodev.net
# ── Fusion — émission d'événements vers le service d'agents (#220) ── # ── Fusion — émission d'événements vers le service d'agents (#220) ──
+8 -1
View File
@@ -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). 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 > **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 `<html>`, 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 ## [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`. - **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`.
+3 -3
View File
@@ -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. **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) [![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/) [![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/) [![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 ## 📝 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*
+3 -3
View File
@@ -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. **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) [![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/) [![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/) [![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 ## 📝 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*
+1 -1
View File
@@ -1 +1 @@
2.83.0 2.83.1
+4
View File
@@ -17,6 +17,7 @@ Variables (voir ``.env.example``) :
- ``DRACO_FLOWDECK_URL`` — base publique de Flowdeck. - ``DRACO_FLOWDECK_URL`` — base publique de Flowdeck.
- ``DRACO_TIKTAK_URL`` — base publique de TikTak. - ``DRACO_TIKTAK_URL`` — base publique de TikTak.
- ``DRACO_KANBANTE_URL`` — base publique de Kanbante. - ``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 - ``DRACO_GITEA_URL`` — base publique de Gitea (les cartes
Kanbante *sont* des issues Gitea, contrat liens-profonds) ; Kanbante *sont* des issues Gitea, contrat liens-profonds) ;
distincte de ``OBSIGATE_GITEA_URL`` (source connectée de distincte de ``OBSIGATE_GITEA_URL`` (source connectée de
@@ -50,6 +51,7 @@ DEFAUTS: dict[str, str] = {
"flowdeck": "https://flowdeck.dracodev.net", "flowdeck": "https://flowdeck.dracodev.net",
"tiktak": "https://tiktak.dracodev.net", "tiktak": "https://tiktak.dracodev.net",
"kanbante": "https://kanbante.dracodev.net", "kanbante": "https://kanbante.dracodev.net",
"shaarit": "https://shaarit.dracodev.net",
"gitea": "https://git.dracodev.net", "gitea": "https://git.dracodev.net",
} }
@@ -59,6 +61,7 @@ _VARIABLES: dict[str, str] = {
"flowdeck": "DRACO_FLOWDECK_URL", "flowdeck": "DRACO_FLOWDECK_URL",
"tiktak": "DRACO_TIKTAK_URL", "tiktak": "DRACO_TIKTAK_URL",
"kanbante": "DRACO_KANBANTE_URL", "kanbante": "DRACO_KANBANTE_URL",
"shaarit": "DRACO_SHAARIT_URL",
"gitea": "DRACO_GITEA_URL", "gitea": "DRACO_GITEA_URL",
} }
@@ -71,6 +74,7 @@ _SLUGS_HOTE: dict[str, str] = {
"flowdeck": "flowdeck", "flowdeck": "flowdeck",
"tiktak": "tiktak", "tiktak": "tiktak",
"kanbante": "kanbante", "kanbante": "kanbante",
"shaarit": "shaarit",
} }
# Premier label de l'hôte de l'agent : ``agent`` suivi d'un suffixe # Premier label de l'hôte de l'agent : ``agent`` suivi d'un suffixe
+3 -1
View File
@@ -966,7 +966,8 @@ if FRONTEND_DIR.exists():
frontend/recherche.html est servi avec les jetons {{URL_*}} frontend/recherche.html est servi avec les jetons {{URL_*}}
remplacés par urls_publiques() (même contrat que le fragment 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 Spark de la barre re-vendangée) et le nonce CSP frais ; la
réponse pose sa propre CSP (préservée par réponse pose sa propre CSP (préservée par
SecurityHeadersMiddleware, qui ne la pose que si elle est SecurityHeadersMiddleware, qui ne la pose que si elle est
@@ -992,6 +993,7 @@ if FRONTEND_DIR.exists():
("{{URL_FLOWDECK}}", "flowdeck"), ("{{URL_FLOWDECK}}", "flowdeck"),
("{{URL_TIKTAK}}", "tiktak"), ("{{URL_TIKTAK}}", "tiktak"),
("{{URL_KANBANTE}}", "kanbante"), ("{{URL_KANBANTE}}", "kanbante"),
("{{URL_SHAARIT}}", "shaarit"),
("{{URL_AGENT}}", "agent"), ("{{URL_AGENT}}", "agent"),
): ):
html = html.replace(jeton, urls.get(cle, "")) html = html.replace(jeton, urls.get(cle, ""))
+1 -1
View File
@@ -2626,7 +2626,7 @@ dependencies = [
[[package]] [[package]]
name = "obsigate-desktop" name = "obsigate-desktop"
version = "2.83.0" version = "2.83.1"
dependencies = [ dependencies = [
"chrono", "chrono",
"env_logger", "env_logger",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "obsigate-desktop" name = "obsigate-desktop"
version = "2.83.0" version = "2.83.1"
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian" description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
authors = ["Bruno Charest"] authors = ["Bruno Charest"]
edition = "2021" edition = "2021"
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json", "$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
"productName": "ObsiGate", "productName": "ObsiGate",
"version": "2.83.0", "version": "2.83.1",
"identifier": "com.obsigate.desktop", "identifier": "com.obsigate.desktop",
"build": { "build": {
"frontendDist": "../frontend", "frontendDist": "../frontend",
+1 -1
View File
@@ -1,6 +1,6 @@
# ObsiGate — Roadmap # 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 > **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
> vers les fonctionnalités livrées. > vers les fonctionnalités livrées.
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)** > - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
+19 -3
View File
@@ -12,9 +12,18 @@
Alertes icône seule. Alertes icône seule.
v0.1.11 : marque = étoile Spark monochrome (blanche barre foncée, v0.1.11 : marque = étoile Spark monochrome (blanche barre foncée,
noire barre claire) ; anneau rouge #c00000 autour de l'avatar flottant. 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 <html> 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. Jetons repris du prototype validé Console v7.2.
Thème : clair par défaut, sombre via [data-theme="dark"] sur <html> Thème : clair par défaut, sombre via [data-theme="dark"] sur <html>
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 <html>). */
.draco-bar { .draco-bar {
--bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3; --bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3;
@@ -27,8 +36,12 @@
background: var(--surface); border-bottom: 1px solid var(--line); background: var(--surface); border-bottom: 1px solid var(--line);
font: 500 14px/1.3 system-ui, "Segoe UI", sans-serif; color: var(--ink); 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 <html>. 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) { @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; } --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; [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). */ 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); } .draco-brand-mark img { width: 26px; height: 26px; object-fit: cover; display: block; filter: brightness(0); }
@media (prefers-color-scheme: dark) { @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; } [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="flowdeck"] .draco-apptab[data-app="flowdeck"],
.draco-bar[data-current="tiktak"] .draco-apptab[data-app="tiktak"], .draco-bar[data-current="tiktak"] .draco-apptab[data-app="tiktak"],
.draco-bar[data-current="kanbante"] .draco-apptab[data-app="kanbante"], .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", /* Chantier 5 : sur la console elle-même (data-current="agent",
programme console #71), c'est l'onglet Console Spark qui reste programme console #71), c'est l'onglet Console Spark qui reste
visible en mobile — les 4 hôtes gardent leur propre courant. */ visible en mobile — les 4 hôtes gardent leur propre courant. */
+18 -6
View File
@@ -8,7 +8,12 @@
* correctif fusion #70 (SANS bump de version, publication séparée) : * correctif fusion #70 (SANS bump de version, publication séparée) :
* bouton trois points et son menu par défaut SUPPRIMÉS, « Console Spark » * 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 * 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 * 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 * (patron validé par le prototype — les onclick du HTML généré sont
@@ -26,6 +31,7 @@
* flowdeck: "https://flowdeck.dracodev.net/", * flowdeck: "https://flowdeck.dracodev.net/",
* tiktak: "https://tiktak.dracodev.net/", * tiktak: "https://tiktak.dracodev.net/",
* kanbante: "https://kanbante.dracodev.net/", * kanbante: "https://kanbante.dracodev.net/",
* shaarit: "https://shaarit.dracodev.net/",
* agent: "https://agent.dracodev.net/", * agent: "https://agent.dracodev.net/",
* spark: "https://spark.dracodev.net/" * spark: "https://spark.dracodev.net/"
* }, * },
@@ -54,10 +60,13 @@
* La clé spark ne correspond à aucun onglet de la barre : elle est * 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 * 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, * (panneau-agent), qui suit le même contrat d'injection. La clé agent,
* elle, a un onglet depuis le chantier 5 (ordre : ObsiGate, Flowdeck, * elle, a un onglet depuis le chantier 5 (ordre, v0.2.0 : ObsiGate,
* TikTak, Kanbante, Console Spark) : elle suit donc l'étape « href * Flowdeck, TikTak, Kanbante, ShaarIt, Console Spark) : elle suit
* donc l'étape « href
* rendu » comme les autres onglets, en plus d'alimenter le menu de * 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), * Actions émises (data-act) : rail, palette, domaine (data-dom),
* alertes, spark, rappel-entete. L'app intégratrice décide de chacune * alertes, spark, rappel-entete. L'app intégratrice décide de chacune
* (ouvrir la palette, le panneau Spark, changer de domaine…). * (ouvrir la palette, le panneau Spark, changer de domaine…).
@@ -144,6 +153,7 @@
flowdeck: "https://flowdeck.dracodev.net/", flowdeck: "https://flowdeck.dracodev.net/",
tiktak: "https://tiktak.dracodev.net/", tiktak: "https://tiktak.dracodev.net/",
kanbante: "https://kanbante.dracodev.net/", kanbante: "https://kanbante.dracodev.net/",
shaarit: "https://shaarit.dracodev.net/",
agent: "https://agent.dracodev.net/", agent: "https://agent.dracodev.net/",
spark: "https://spark.dracodev.net/" spark: "https://spark.dracodev.net/"
}; };
@@ -157,12 +167,13 @@
flowdeck: "https://flowdeck-dev.dracodev.net/", flowdeck: "https://flowdeck-dev.dracodev.net/",
tiktak: "https://tiktak-dev.dracodev.net/", tiktak: "https://tiktak-dev.dracodev.net/",
kanbante: "https://kanbante-dev.dracodev.net/", kanbante: "https://kanbante-dev.dracodev.net/",
shaarit: "https://shaarit-dev.dracodev.net/",
agent: "https://agent-dev.dracodev.net/" agent: "https://agent-dev.dracodev.net/"
}; };
var APP_LABELS = { var APP_LABELS = {
obsigate: "ObsiGate", flowdeck: "Flowdeck", 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 /* Vrai si hostname est un hôte -dev dracodev.net : première étiquette
@@ -365,7 +376,8 @@
if (badge) a.appendChild(badge.cloneNode(true)); if (badge) a.appendChild(badge.cloneNode(true));
appsMenu.appendChild(a); 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 > * de l'agent commun (URL agent résolue — explicite > -dev >
* défaut prod ; aucun hôte spark-dev inventé). data-app="agent" * défaut prod ; aucun hôte spark-dev inventé). data-app="agent"
* l'intègre à refreshMenuHrefs/applyUrls/setCurrent comme les * l'intègre à refreshMenuHrefs/applyUrls/setCurrent comme les
+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240">
<!-- ShaarIt — signet (bookmark) blanc sur fond émeraude #059669,
couleur signature de l'app dans la barre (#059669, distincte du
teal Kanbante #0d9488). Fond arrondi comme les logos PNG 180 px
des autres apps ; géométrie simple, aucun redessin d'un logo
existant : le signet EST le symbole de l'app (bookmarks). -->
<rect x="8" y="8" width="224" height="224" rx="48" fill="#059669"/>
<path d="M 82 52 L 158 52 L 158 190 L 120 152 L 82 190 Z" fill="#ffffff"/>
</svg>

After

Width:  |  Height:  |  Size: 569 B

+14 -3
View File
@@ -268,9 +268,16 @@
<!-- Main Application (wrapped for show/hide) --> <!-- Main Application (wrapped for show/hide) -->
<!-- Barre d'apps commune dracodev — Fusion #215 (ACC-1.1). <!-- Barre d'apps commune dracodev — Fusion #215 (ACC-1.1).
Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.1.11 Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.2.0
(ui/barre-apps/) : ne pas modifier la structure ici ; toute (ui/barre-apps/, commit 70c837a de la branche
évolution passe par une nouvelle version de commons. shaarit-phase3-barre-contrats) : ne pas modifier la structure
ici ; toute évolution passe par une nouvelle version de commons.
v0.2.0 : 6e onglet ShaarIt (data-app="shaarit", après Kanbante,
avant l'onglet agent) — son href porte le défaut officiel et
la réécriture DRACO_URLS ci-dessous le résout comme les
autres (config backend/draco_config, dérivation -dev incluse) ;
le CSS vendangé gagne la garde data-theme sur
prefers-color-scheme (html:not([data-theme])).
CSS/JS : /static/draco-barre.css, /static/draco-barre.js. CSS/JS : /static/draco-barre.css, /static/draco-barre.js.
Icônes logos v0.1.9 (2026-10-29) : les 5 tuiles sont les logos Icônes logos v0.1.9 (2026-10-29) : les 5 tuiles sont les logos
fournis, tels quels, servis depuis /static/img/logos/ (copie de fournis, tels quels, servis depuis /static/img/logos/ (copie de
@@ -317,6 +324,10 @@
<span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span> <span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span>
<span class="draco-badge" data-badge="kanbante" hidden>0</span> <span class="draco-badge" data-badge="kanbante" hidden>0</span>
</a> </a>
<a class="draco-apptab" data-app="shaarit" href="https://shaarit.dracodev.net/">
<span class="draco-apptab-ico" style="--app:#059669" data-icon="shaarit"><img src="/static/img/logos/shaarit.svg" alt="ShaarIt" width="30" height="30"></span>
<span class="draco-apptab-txt"><strong>ShaarIt</strong><small>Bookmarks</small></span>
</a>
<a class="draco-apptab" data-app="agent" href="https://agent.dracodev.net/"> <a class="draco-apptab" data-app="agent" href="https://agent.dracodev.net/">
<span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span> <span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span>
<span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span> <span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span>
+5 -1
View File
@@ -14,7 +14,7 @@
retomberait sur les défauts prod (les jetons sont ignorés par retomberait sur les défauts prod (les jetons sont ignorés par
le JS) — jamais d'URL inventée. le JS) — jamais d'URL inventée.
La barre ci-dessous est une copie statique du snippet figé de La barre ci-dessous est une copie statique du snippet figé de
index.html (commons v0.1.11 + chantier 5 fusion #69/#71, sans index.html (commons v0.2.0 + chantier 5 fusion #69/#71, sans
bump) : les onglets sont des liens réels, le bouton central bump) : les onglets sont des liens réels, le bouton central
replace le curseur dans la boîte (recherche.js, replace le curseur dans la boîte (recherche.js,
clic data-act="palette"). Re-vendoring alignement recherche : clic data-act="palette"). Re-vendoring alignement recherche :
@@ -79,6 +79,10 @@
<span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span> <span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span>
<span class="draco-badge" data-badge="kanbante" hidden>0</span> <span class="draco-badge" data-badge="kanbante" hidden>0</span>
</a> </a>
<a class="draco-apptab" data-app="shaarit" href="{{URL_SHAARIT}}">
<span class="draco-apptab-ico" style="--app:#059669" data-icon="shaarit"><img src="/static/img/logos/shaarit.svg" alt="ShaarIt" width="30" height="30"></span>
<span class="draco-apptab-txt"><strong>ShaarIt</strong><small>Bookmarks</small></span>
</a>
<a class="draco-apptab" data-app="agent" href="{{URL_AGENT}}"> <a class="draco-apptab" data-app="agent" href="{{URL_AGENT}}">
<span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span> <span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span>
<span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span> <span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span>
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "obsigate", "name": "obsigate",
"version": "2.83.0", "version": "2.83.1",
"description": "**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.", "description": "**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.",
"main": "patch.js", "main": "patch.js",
"directories": { "directories": {
+23
View File
@@ -55,6 +55,29 @@ def test_menu_des_applications_par_la_marque():
assert '<span class="draco-brand-mark"><img src="/static/img/brand-spark.png"' in recherche assert '<span class="draco-brand-mark"><img src="/static/img/brand-spark.png"' in recherche
def test_barre_v020_onglet_shaarit_et_garde_data_theme():
# Barre v0.2.0 (dracodev-commons @70c837a) : 6e onglet ShaarIt
# après Kanbante et avant l'onglet agent, logo fourni tel quel,
# et garde data-theme sur les blocs prefers-color-scheme du CSS
# vendangé (html:not([data-theme])) — sans elle, un hôte en
# data-theme="light" sur système sombre héritait du sombre.
css = _css()
assert "html:not([data-theme]) .draco-bar {" in css
assert "html:not([data-theme]) .draco-bar .draco-brand-mark img" in css
assert (FRONTEND / "img" / "logos" / "shaarit.svg").is_file()
for nom, jeton in (("index.html", "https://shaarit.dracodev.net/"),
("recherche.html", "{{URL_SHAARIT}}")):
html = (FRONTEND / nom).read_text(encoding="utf-8")
nav = html.split('<nav class="draco-apptabs"')[1].split("</nav>")[0]
assert f'data-app="shaarit" href="{jeton}"' in nav
assert 'data-icon="shaarit"><img src="/static/img/logos/shaarit.svg"' in nav
assert nav.index('data-app="kanbante"') < nav.index('data-app="shaarit"')
assert nav.index('data-app="shaarit"') < nav.index('data-app="agent"')
js = (FRONTEND / "draco-barre.js").read_text(encoding="utf-8")
assert 'shaarit: "https://shaarit.dracodev.net/"' in js
assert 'shaarit: "https://shaarit-dev.dracodev.net/"' in js
def test_panneau_spark_integre_218(): def test_panneau_spark_integre_218():
# #218 : le bouton Spark de la barre ouvre le panneau de l'agent # #218 : le bouton Spark de la barre ouvre le panneau de l'agent
# commun (mêmes assets partagés que TikTak / Flowdeck / Kanbante). # commun (mêmes assets partagés que TikTak / Flowdeck / Kanbante).
+16 -1
View File
@@ -19,7 +19,8 @@ def env_propre(monkeypatch):
"""Aucune variable d'URL d'écosystème posée (défauts officiels).""" """Aucune variable d'URL d'écosystème posée (défauts officiels)."""
for nom in ( for nom in (
"DRACO_AGENT_URL", "DRACO_OBSIGATE_URL", "DRACO_FLOWDECK_URL", "DRACO_AGENT_URL", "DRACO_OBSIGATE_URL", "DRACO_FLOWDECK_URL",
"DRACO_TIKTAK_URL", "DRACO_KANBANTE_URL", "DRACO_GITEA_URL", "DRACO_TIKTAK_URL", "DRACO_KANBANTE_URL", "DRACO_SHAARIT_URL",
"DRACO_GITEA_URL",
"AGENT_EVENEMENTS_URL", "AGENT_EVENEMENTS_URL",
): ):
monkeypatch.delenv(nom, raising=False) monkeypatch.delenv(nom, raising=False)
@@ -37,6 +38,20 @@ def test_defauts_officiels_sans_dev(env_propre):
assert "-dev" not in url assert "-dev" not in url
def test_shaarit_defaut_et_derivation(env_propre):
"""Barre v0.2.0 : ShaarIt suit le même mécanisme que les autres
sœurs — défaut officiel, dérivation -dev depuis l'hôte de l'agent,
variable explicite prioritaire."""
assert draco_config.app_url("shaarit") == "https://shaarit.dracodev.net"
env_propre.setenv(
"AGENT_EVENEMENTS_URL", "https://agent-dev.dracodev.net/api/v1/evenements")
assert draco_config.app_url("shaarit") == "https://shaarit-dev.dracodev.net"
assert draco_config.urls_publiques()["shaarit"] == \
"https://shaarit-dev.dracodev.net"
env_propre.setenv("DRACO_SHAARIT_URL", "https://bm.example.net/")
assert draco_config.app_url("shaarit") == "https://bm.example.net"
def test_agent_derive_des_evenements(env_propre): def test_agent_derive_des_evenements(env_propre):
"""Sans DRACO_AGENT_URL, l'origine suit AGENT_EVENEMENTS_URL — """Sans DRACO_AGENT_URL, l'origine suit AGENT_EVENEMENTS_URL —
la configuration réelle du poste (dev inclus).""" la configuration réelle du poste (dev inclus)."""