Files
ObsiGate/docs/features/fusion-bloc1-barre-refs-215.md
T
Spark 9bc31d069b
CI / lint (push) Successful in 3m32s
CI / security (push) Failing after 2m27s
CI / test (push) Successful in 5m36s
CI / build (push) Successful in 2m12s
CI / e2e (push) Successful in 18m18s
feat: barre d'apps commune et références croisées des notes (#215)
2026-10-20 22:20:48 -04:00

3.6 KiB

#215 — Fusion bloc 1 : barre d'apps commune et références croisées des notes

Programme Fusion (accès centralisé entre ObsiGate, Flowdeck, TikTak et Kanbante). Dépôt programme : Projets/fusion-trois-apps (épopée ACC-1, issues ObsiGate #5, #6, #7). Contrats : Projets/dracodev-commons v0.1.0 (contrats/liens-profonds.md, contrats/external_ref.schema.json, snippet ui/barre-apps/).

Ce qui est livré

ACC-1.1 — Barre d'apps commune (#5)

Le snippet figé de commons est vendangé (copié, jamais chargé depuis une autre app — la barre survit à l'arrêt des autres applications) :

  • frontend/draco-barre.css / frontend/draco-barre.js : copie v0.1.0 ;
  • markup + configuration dans frontend/index.html, au-dessus de #app (body.has-draco-bar ajuste la hauteur de .app-container dans style.css).

Phase 1 : navigation entre les quatre applications (ObsiGate marquée active), sélecteur de domaine mémorisé en localStorage (draco_domain, même clé que TikTak), recherche = focus de la recherche native, rail = bouton latéral natif, menu = menu d'en-tête natif. Alertes unifiées et panneau Spark affichent un message d'arrivée (fédération et agent commun : phases ultérieures du programme) plutôt que des boutons morts. Les compteurs croisés viendront avec la fédération ; seul le compteur local de chaque app est alimenté en phase 1.

ACC-1.3 — Références croisées external_ref (#7)

  • Modèle : le schéma figé de commons. La note est propriétaire de ses références (owner_type = obsigate.note, owner_id = "<vault>:<chemin>").
  • Stockage : JSON par utilisateur dans data/external_refs/ (backend/external_refs.py, même patron que backend/history.py — pas de base de données). Surchargable par OBSIGATE_EXTERNAL_REFS_DIR.
  • API (auth + check_vault_access) :
    • GET /api/refs?vault=&path= — références d'une note ;
    • POST /api/refs {vault, path, url, label?} — création par collage d'URL profonde ; le parseur reconnaît les formes du contrat (TikTak ?task=/?list=, ObsiGate #file=, Flowdeck /pages///collections/, issue Gitea = carte Kanbante) et répond 422 explicite sinon ;
    • DELETE /api/refs/{id}.
  • UI : section « Liens » en fin de note — liste avec pastille de couleur de l'app cible, formulaire d'ajout, retrait en un clic. Rendue par le module autonome frontend/draco-liens.js, branché sur l'événement obsigate:file-rendered que renderFile émet (point d'extension documenté dans frontend/app.js).

ACC-1.2 — Notes projetées TikTak (#6)

La synchro TikTak ↔ ObsiGate écrit tiktak_id: <id> dans le frontmatter des fichiers projetés. Le module draco-liens.js le détecte (lecture du brut via /api/file/{vault}/raw) et affiche un bandeau « Tâche TikTak projetée » avec le bouton « Ouvrir dans TikTak » (https://tiktak.dracodev.net/?task=<id>), au lieu de traiter la note comme une note ordinaire.

Limites assumées (v1)

  • Le libellé d'une référence est un instantané (titre par défaut dérivé de l'URL ou libellé libre) ; le rafraîchissement automatique du titre viendra avec la fédération MCP (phase 3 du programme).
  • Un lien dont la cible a disparu n'est pas détecté automatiquement (status reste ok) — la marque « cible introuvable » viendra avec la couche données.
  • La section « Liens » n'apparaît que dans la vue lecture d'une note (pas dans l'éditeur).

Tests

tests/test_external_refs.py : parseur (6 formes reconnues, 7 refusées), stockage (cycle + isolation par utilisateur), API (cycle complet, 422, 404, 403 vault inconnu).