8.3 KiB
title, type, created, status, baseline_commit, context
| title | type | created | status | baseline_commit | context |
|---|---|---|---|---|---|
| Improve Note Graph Relationships | feature | 2026-05-23T08:25:00Z | done | ca0637cc6e |
Intent
Problem: La vue en graphe (NoteGraphView) ne tire parti que de balayages de texte rudimentaires (mentions de titre, tags partagés et similarité Jaccard en mémoire qui est désactivée au-delà de 500 notes) pour tracer les liaisons. Elle ignore totalement :
- Les liaisons explicites manuelles créées par l'utilisateur via des WikiLinks (
[[Note]]) et enregistrées dans la tableNoteLinkde la base de données. - Les connexions sémantiques riches générées en arrière-plan par l'IA ("Memory Echo") et enregistrées dans la table
MemoryEchoInsightde la base de données. Cela donne à la vue en graphe un aspect incomplet et décousu, limitant grandement la sérendipité et la découverte de connaissances.
Approach:
- Modifier la route API
/api/graphpour requêter et fusionner les liaisons manuelles (NoteLink) et les connexions sémantiques saines non rejetées (MemoryEchoInsightavecdismissed = false). - Introduire des types de liaisons explicites (
explicit_linketsemantic_echo) dans le flux de données de l'API. - Mettre à jour le composant de rendu React
<NoteGraphView />pour styliser et différencier visuellement ces relations clés avec des couleurs HSL premium, des épaisseurs de trait adaptées et des motifs (pleins vs. pointillés) pour enrichir l'expérience utilisateur et clarifier la structure du graphe.
Boundaries & Constraints
Always:
- Filtrer rigoureusement toutes les requêtes Prisma par
userIdpour garantir l'étanchéité des données utilisateur. - Exclure toutes les liaisons (sources ou cibles) pointant vers des notes archivées ou envoyées à la corbeille (
trashedAt !== null). - Exclure les connexions sémantiques marquées comme rejetées (
dismissed: true). - Assurer un fort contraste visuel sur le graphe en harmonie avec la charte graphique premium existante (pas de couleurs agressives non maîtrisées).
Ask First:
- Faut-il plafonner le nombre total de liens sémantiques ou Jaccard affichés simultanément pour éviter de surcharger visuellement les graphes de grande taille (au-delà de 200 notes) ?
Never:
- Modifier la structure de la base de données Prisma (pas de changement de schéma).
- Lancer de commande destructive sur la base de données (
prisma db push --force-resetou équivalent). - Supprimer ou désactiver les liaisons textuelles existantes (
title_mention,shared_label,jaccard), qui restent d'excellents compléments de découverte.
I/O & Edge-Case Matrix
| Scenario | Input / State | Expected Output / Behavior | Error Handling |
|---|---|---|---|
| HAPPY_PATH | L'utilisateur possède des notes connectées par WikiLinks et des Memory Echo Insights | L'API /api/graph retourne un tableau fusionné contenant des arêtes de types explicit_link, semantic_echo, title_mention, etc. |
N/A |
| EMPTY_STATE | Aucune liaison, aucune note | L'API retourne { nodes: [], edges: [], clusters: [] } de manière propre sans planter. |
Retourne des tableaux vides de manière sécurisée |
| TRASHED_NOTES | Des liaisons (NoteLink ou MemoryEchoInsight) pointent vers des notes supprimées |
Les arêtes correspondantes sont filtrées et exclues du graphe final. | Filtrage en amont lors de la construction des listes |
| STUB_LINKS | Des wikilinks pointent vers des notes inexistantes (stubs) | Filtrage des arêtes orphelines (seuls les couples de notes existantes et valides sont renvoyés). | Ignorer l'arête si l'ID source ou cible n'est pas dans le set des notes chargées |
Code Map
memento-note/app/api/graph/route.ts-- Route API GET principale assemblant la liste des nœuds, des arêtes et des clusters de carnets.memento-note/components/note-graph-view.tsx-- Composant de rendu 2D interactif utilisantreact-force-graph-2dpour dessiner les arêtes et les groupes.memento-note/prisma/schema.prisma-- Fichier de schéma Prisma contenant les définitions des tablesNoteLinketMemoryEchoInsight.
Tasks & Acceptance
Execution:
memento-note/app/api/graph/route.ts-- Modifier la route pour interroger en parallèleprisma.noteLinketprisma.memoryEchoInsight, filtrer les éléments invalides/corrompus/supprimés, et les injecter avec les typesexplicit_linketsemantic_echo.memento-note/components/note-graph-view.tsx-- Enrichir la logique de mappage des arêtes du graphe pour attribuer des styles visuels premium à chaque type de lien (WikiLinks en vert émeraude épais et plein, Échos sémantiques IA en violet pointillés, etc.).memento-note/components/note-graph-view.tsx-- Rendre la légende des carnets (clusters) interactive : ajouter un étatselectedNotebookIdpour filtrer à la volée les nœuds et arêtes du graphe. Styliser les boutons actifs/inactifs de manière premium avec des micro-animations.memento-note/components/note-graph-view.tsx-- Afficher le nom du carnet dans le panneau latéral de détail de la note sous forme de tag interactif cliquable pour isoler instantanément le carnet sélectionné.
Acceptance Criteria:
- Given une note A contenant un WikiLink vers une note B (
NoteLinkenregistré) et une note C sémantiquement proche de la note A (MemoryEchoInsightenregistré) - When l'utilisateur charge la vue en graphe
- Then l'API renvoie les relations avec les types
explicit_linketsemantic_echo - And le visualiseur dessine le lien A-B en trait vert plein et le lien A-C en trait violet pointillé.
Design Notes
Configuration Visuelle des Liens dans note-graph-view.tsx
Nous utiliserons les associations de couleurs et d'épaisseurs suivantes pour offrir une lisibilité optimale sur fond clair/sombre :
// Exemple de configuration stylistique
const LINK_STYLES = {
explicit_link: { color: '#10b981', width: 2.2, dash: false }, // Vert émeraude (WikiLink manuel)
semantic_echo: { color: '#a78bfa', width: 1.8, dash: true }, // Violet pastel (Écho sémantique IA)
title_mention: { color: '#f59e0b', width: 1.6, dash: false }, // Orange ambré (Mention de titre automatique)
shared_label: { color: '#3b82f6', width: 1.2, dash: false }, // Bleu vif (Tags partagés)
jaccard: { color: '#cbd5e1', width: 0.8, dash: false } // Gris clair (Similarité sémantique simple)
}
Pour les pointillés (dash) dans react-force-graph-2d, nous adapterons l'objet du graphe ou appliquerons la configuration de rendu des lignes Canvas via l'API Native si nécessaire, ou plus simplement en les configurant élégamment dans le dessin.
Verification
Commands:
npx tsc --noEmit-- Vérification de l'absence totale d'erreurs de typage TypeScript dans le projet après modification.
Suggested Review Order
Backend API & Relationships Integration
-
Requête Prisma sécurisée pour charger en parallèle les liaisons WikiLinks (
NoteLink) et les échos sémantiques IA (MemoryEchoInsight).route.ts:66 -
Priorisation des liaisons qualitatives sur les mentions textuelles et assemblage des arêtes du graphe.
route.ts:161
Frontend Visualizations & Legend
-
Mappage des arêtes vers les nouvelles couleurs de liaison et gestion de la propriété de pointillés.
note-graph-view.tsx:112 -
Configuration de la propriété de rendu en pointillés
linkLineDashsur le composant ForceGraph2D.note-graph-view.tsx:278 -
Rendu du panneau de légende des liaisons dans le coin inférieur gauche pour une expérience utilisateur premium.
note-graph-view.tsx:340
Interactive Filtering & Notebook Navigation
-
Boutons de légende interactifs pour isoler ou réinitialiser le filtre par carnet à la volée.
note-graph-view.tsx:342 -
Tag cliquable dans le panneau latéral de détails pour isoler instantanément le carnet associé.
note-graph-view.tsx:421