feat: barre d'apps commune et références croisées des notes (#215)
This commit is contained in:
+27
-1
@@ -1,6 +1,6 @@
|
||||
# ObsiGate — Roadmap
|
||||
|
||||
> **Version :** 2.69.0 | **Dernière mise à jour :** 2026-10-15
|
||||
> **Version :** 2.70.0 | **Dernière mise à jour :** 2026-10-20
|
||||
> **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)**
|
||||
@@ -30,6 +30,32 @@
|
||||
|
||||
## 🔵 En cours
|
||||
|
||||
### 215. Fusion bloc 1 — barre d'apps commune et références croisées des notes
|
||||
|
||||
- **Effort :** ~1 jour | **Impact :** 🟢 | **Ouvert :** 2026-10-20 | **Statut :** ✅ livré le 2026-10-20 (2.70.0)
|
||||
- **Fiche :** [features/fusion-bloc1-barre-refs-215.md](./features/fusion-bloc1-barre-refs-215.md)
|
||||
- **Description :** première tranche du programme **Fusion** (accès centralisé
|
||||
ObsiGate / Flowdeck / TikTak / Kanbante — dépôt programme
|
||||
`Projets/fusion-trois-apps`, épopée ACC-1 ; contrats versionnés dans
|
||||
`Projets/dracodev-commons` v0.1.0). ID 215 choisi hors des plages déjà
|
||||
utilisées ou proposées (#191–#201 livrées/Assistant V2, #202–#214
|
||||
proposées par ASSISTANT-V2.1). Issues Gitea ObsiGate #5 (ACC-1.1),
|
||||
#6 (ACC-1.2), #7 (ACC-1.3).
|
||||
- **Sous-tâches :**
|
||||
- [x] Barre d'apps commune vendangée du snippet figé de commons
|
||||
(`frontend/draco-barre.css/.js`, markup dans `index.html`) :
|
||||
ObsiGate marquée active, navigation vers les 4 apps, domaine mémorisé
|
||||
- [x] Backend `external_ref` : stockage JSON par utilisateur
|
||||
(`backend/external_refs.py`), endpoints `GET/POST /api/refs` et
|
||||
`DELETE /api/refs/{id}` (schémas + tag OpenAPI), parseur d'URL
|
||||
profondes conforme au contrat figé
|
||||
- [x] Section « Liens » dans la vue d'une note (module
|
||||
`frontend/js/draco-liens.js`, point d'extension
|
||||
`obsigate:file-rendered` émis par `renderFile`)
|
||||
- [x] Notes projetées TikTak reconnues (frontmatter `tiktak_id`) :
|
||||
bandeau « Tâche TikTak projetée » + « Ouvrir dans TikTak »
|
||||
- [x] i18n FR/EN (clés `draco.links.*`), tests `test_external_refs.py`
|
||||
|
||||
### 196. Partage dirigé entre utilisateurs (document → utilisateur)
|
||||
|
||||
- **Effort :** 0,5-1 jour | **Impact :** 🟡 | **Ouvert :** 2026-10-10 | **Statut :** ✅ livré le 2026-10-10
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# #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).
|
||||
Reference in New Issue
Block a user