Code du systeme de memoire multi-LLM sur Trilium : - trilium_api.py : wrapper trilium-py (notes, labels, relations) - mcp_server.py : serveur MCP Starlette (19 tools, OAuth + Bearer) - api_context.py : API REST FastAPI - trilium_context.py : workflow CLI - watchdog.sh, start_*.sh : supervision et demarrage - skills, docs et ontologie associes Secrets (.env, oauth_state.json) exclus via .gitignore.
14 KiB
SKILL — Sliding Design System (Pernod Ricard)
Ce skill décrit le design system « PR Editorial » et le format de données
que consomme le moteur de rendu render_engine_v2.py pour produire des
présentations PowerPoint au format Pernod Ricard.
Périmètre de ce skill : design et production uniquement. Il ne traite pas de la structuration narrative, de la rédaction ou de la rhétorique. Il répond à une seule question : comment produire un fichier YAML valide qui, passé au moteur, génère un PPTX conforme à la charte Pernod Ricard.
1. Principe de fonctionnement
Le moteur prend en entrée un fichier YAML décrivant une liste de slides.
Chaque slide déclare un layout (parmi 21) et les champs de contenu de ce
layout. Le moteur applique automatiquement la charte (couleurs, polices,
grille, centrage vertical). Tu n'as jamais à spécifier de couleur, de police
ou de position en mode standard : tu fournis le contenu, le moteur compose.
Commande de rendu :
python3 render_engine_v2.py presentation.yaml sortie.pptx \
--theme theme_v2.yaml --components components_v2.yaml --layouts layouts_v2.yaml
Structure générale du YAML :
slides:
- layout: cover_split
titre: "..."
- layout: kpi_grid
titre: "..."
items: [...]
2. La charte (appliquée automatiquement)
Tu n'écris jamais ces valeurs en mode standard ; elles sont là pour information.
Couleurs
| Token | Hex | Usage |
|---|---|---|
| navy | #061033 |
dominant — fonds sombres, titres |
| navy_light | #10204D |
cercles décoratifs sur fond sombre |
| coral | #F4795B |
accent UNIQUE — chiffres, badges, lignes |
| glacier | #8FA9D0 |
sous-titres sur fond sombre, 3e couleur |
| slate | #46505A |
2e couleur de cycle |
| card | #F4F1EC |
fond des cartes (gris chaud) |
| card_alt | #EAF0F8 |
variante froide |
| body | #2B3440 |
texte courant sur fond clair |
| muted | #8A93A0 |
légendes, sources |
Polices : Cambria (titres, chiffres) / Calibri (corps). Format slide : 33,87 × 19,05 cm (16:9). Règle d'accent : le corail est rare. Un seul élément corail dominant par slide ; le navy domine. Rythme sandwich : ouverture, transitions et clôture sur fond sombre (navy) ; contenu sur fond clair.
3. Les 21 layouts standards
Chaque layout liste ses champs requis (obligatoires) et optionnels.
titre doit être une formulation affirmative (le message du slide), pas un label.
Ouverture / Clôture / Structure
cover_split — couverture (fond sombre)
Requis : titre · Optionnel : sous_titre
- layout: cover_split
titre: "Titre de la présentation"
sous_titre: "Tagline en une phrase"
section_divider — transition de section (fond sombre, numéro auto)
Requis : titre
- layout: section_divider
titre: "Nom de la section"
end_slide — clôture (fond sombre)
Requis : message
- layout: end_slide
message: "Phrase de conclusion"
Synthèse / Message
executive_summary — synthèse situation/complication/résolution
Requis : titre, situation, complication, resolution
- layout: executive_summary
titre: "Le So What en une phrase affirmative"
situation: "État des lieux factuel"
complication: "Le problème ou la tension"
resolution: "La réponse proposée"
key_message — citation/message fort (fond sombre)
Requis : message · Optionnel : detail
- layout: key_message
message: "Le message clé en une phrase forte."
detail: "Sous-texte optionnel."
Données
big_stat — un chiffre héro plein écran
Requis : titre, valeur · Optionnel : description, source
- layout: big_stat
titre: "Titre affirmatif"
valeur: "78%"
description: "ce que le chiffre signifie"
source: "Référence — 2026"
kpi_grid — 2 à 6 cartes KPI
Requis : titre, items
- layout: kpi_grid
titre: "Titre affirmatif"
items:
- label: "Indicateur 1"
valeur: "+13%"
description: "Source ou contexte"
- label: "Indicateur 2"
valeur: "85%"
description: "Source ou contexte"
Note : valeur est une chaîne. Les valeurs courtes (≤6 car.) s'affichent en
très grand, les valeurs longues sont réduites automatiquement.
Comparaison
two_cols_text — deux colonnes en cartes (gauche navy, droite corail)
Requis : titre, left, right
- layout: two_cols_text
titre: "Titre affirmatif"
left:
titre: "Titre colonne gauche"
bullets:
- texte: "Premier point"
- texte: "Deuxième point"
right:
titre: "Titre colonne droite"
bullets:
- texte: "Premier point"
comparison_table — tableau comparatif multi-critères
Requis : titre, headers, rows (max ~5 colonnes, 8 lignes)
- layout: comparison_table
titre: "Titre affirmatif"
headers: ["Critère", "Option A", "Option B"]
rows:
- label: "Premier critère"
values: ["Valeur A", "Valeur B"]
- label: "Deuxième critère"
values: ["Valeur A", "Valeur B"]
from_to_pairs — transformation avant/après
Requis : titre, pairs · Optionnel : label_from, label_to (max 5 paires)
- layout: from_to_pairs
titre: "Titre affirmatif"
label_from: "SITUATION ACTUELLE"
label_to: "SITUATION CIBLE"
pairs:
- from: "État de départ"
to: "État cible"
- from: "Autre point"
to: "Autre cible"
Concept / Texte
circular_diagram — 3 à 6 cercles + légende
Requis : titre, segments
- layout: circular_diagram
titre: "Titre affirmatif"
segments:
- label: "Concept 1"
description: "Description courte"
- label: "Concept 2"
description: "Description courte"
- label: "Concept 3"
description: "Description courte"
default_bullets — liste de points (max 5)
Requis : titre, bullets
Le format « Mot-clé : explication » met le mot-clé en gras navy.
- layout: default_bullets
titre: "Titre affirmatif"
bullets:
- texte: "Mot-clé : explication du point"
niveau: 1
- texte: "Autre mot-clé : explication"
niveau: 1
Process / Planning
numbered_steps — étapes en cartes avec badge numéroté (2 à 5)
Requis : titre, steps
- layout: numbered_steps
titre: "Titre affirmatif"
steps:
- numero: 1
titre: "Première étape"
description: "Ce que ça implique"
- numero: 2
titre: "Deuxième étape"
description: "Ce que ça implique"
process_arrow — flux horizontal de 3 à 6 étapes (sans dates)
Requis : titre, steps
- layout: process_arrow
titre: "Titre affirmatif"
steps:
- titre: "Étape 1"
description: "Ce qui se passe"
- titre: "Étape 2"
description: "Ce qui se passe"
- titre: "Étape 3"
description: "Ce qui se passe"
phases_timeline — phases avec périodes
Requis : titre, phases
- layout: phases_timeline
titre: "Titre affirmatif"
phases:
- label: "Mois 1-2"
periode: "Ce qui se passe"
- label: "Mois 3-8"
periode: "Ce qui se passe"
gantt_timeline — Gantt par workstreams
Requis : titre, periods, workstreams (max 3 workstreams, 4 tâches chacun)
start/end = index dans periods (0-based).
- layout: gantt_timeline
titre: "Titre affirmatif"
periods: ["Juin", "Juil", "Août", "Sept"]
workstreams:
- label: "Workstream 1"
tasks:
- label: "Tâche A"
start: 0
end: 2
- label: "Workstream 2"
tasks:
- label: "Tâche B"
start: 1
end: 3
yearly_timeline — frise chronologique
Requis : titre, milestones (max 6, actif: true met le jalon en corail)
- layout: yearly_timeline
titre: "Titre affirmatif"
milestones:
- annee: "2024"
label: "Premier jalon"
- annee: "2025"
label: "Deuxième jalon"
- annee: "2026"
label: "Jalon courant"
actif: true
Gouvernance / Organisation / Décision
raci_table — matrice RACI
Requis : titre, roles, tasks (max 4 rôles, 8 tâches)
Lettres : R (Responsable, corail), A (Autorité, navy), C (Consulté, slate), I (Informé, muted).
- layout: raci_table
titre: "Titre affirmatif"
roles: ["Rôle 1", "Rôle 2", "Rôle 3"]
tasks:
- label: "Première activité"
raci: ["A", "R", "C"]
- label: "Deuxième activité"
raci: ["A", "I", "R"]
org_chart — organigramme (max 3 niveaux)
Requis : titre, root
Les children peuvent être des objets {label, children} OU de simples
chaînes. Max 4 enfants directs, 3 petits-enfants par enfant (au-delà, ça serre).
- layout: org_chart
titre: "Titre affirmatif"
root:
label: "Responsable racine"
children:
- label: "Manager 1"
children:
- "Équipe A"
- "Équipe B"
- label: "Manager 2"
children:
- "Équipe C"
matrix_2x2 — matrice effort/impact
Requis : titre, items · Optionnel : axis_x, axis_y, quadrants (max 8 items)
x et y vont de 0 à 100.
- layout: matrix_2x2
titre: "Titre affirmatif"
axis_x:
label: "Effort"
low: "Faible"
high: "Élevé"
axis_y:
label: "Impact"
low: "Faible"
high: "Élevé"
quadrants:
top_left: "Gains rapides"
top_right: "Projets stratégiques"
bottom_left: "Déprioritiser"
bottom_right: "À planifier"
items:
- label: "Initiative A"
x: 30
y: 80
- label: "Initiative B"
x: 70
y: 75
recommendation_card — carte de recommandation (sidebar navy)
Requis : titre, headline, bullets · Optionnel : numero, cta
- layout: recommendation_card
numero: 1
titre: "Nom court de la recommandation"
headline: "TROIS DÉCISIONS À PRENDRE MAINTENANT"
cta: "Décider en réunion du 30 juin"
bullets:
- texte: "Première décision précise"
- texte: "Deuxième décision précise"
4. Le flux libre (freeform) — composition sur mesure
Pour les slides qui ne rentrent dans aucun layout standard, utilise
layout: freeform. La slide est composée de blocs positionnés sur une
grille 12 × 12 (colonnes 0-12, lignes 0-12). La charte reste imposée :
les couleurs ne peuvent être que des tokens nommés (jamais de hex).
Règles de la grille :
col(0-12) = colonne de départ,row(0-12) = ligne de départw= largeur en colonnes,h= hauteur en lignes- Contraintes :
col + w ≤ 12etrow + h ≤ 12 - Maximum 8 blocs par slide
mode: light(fond blanc) oumode: dark(fond navy)footer: falsepour masquer le pied de page (affiché par défaut, même sur fond sombre)
Note : freeform est géré directement par le moteur de rendu et ne figure pas
dans layouts_v2.yaml. Un validateur basé sur ce fichier peut donc le signaler
comme « layout inconnu » — c'est sans effet, le rendu fonctionne normalement.
Types de blocs disponibles :
| type | description | champs spécifiques |
|---|---|---|
title / heading |
titre serif | size (déf. 28), align, color |
text |
texte courant (Calibri) | size, bold, italic, serif, align, color |
stat |
grand chiffre serif corail | size (déf. 72), align, color |
circle |
cercle plein (motif charte) | color (diamètre = min(w,h)) |
badge |
cercle numéroté, texte blanc centré | text, color |
card |
carte arrondie avec ombre | color (déf. card) |
rect |
rectangle plein | color, rounded |
line |
ligne / séparateur | color, weight (h:0 = horizontale) |
Tokens couleur autorisés : navy, navy_light, coral, glacier, slate, card, white, body, muted. Aucun hex.
Exemple — slide manifeste (fond sombre, grand chiffre + titre + accent) :
- layout: freeform
mode: dark
blocks:
- type: stat
text: "3"
col: 0.5
row: 1
w: 3
h: 4
size: 150
color: coral
align: center
- type: title
text: "trois convictions structurantes"
col: 4
row: 1.5
w: 7.5
h: 3
size: 30
color: white
- type: line
col: 4
row: 4.5
w: 7
h: 0
color: coral
weight: 2
- type: text
text: "Le sous-texte en glacier, italique."
col: 4
row: 5
w: 7.5
h: 2
size: 18
italic: true
color: glacier
5. Règles de production (à respecter pour un YAML valide)
- Layouts : utiliser uniquement les 21 noms listés (+
freeform). - Champs requis : chaque layout doit avoir tous ses champs requis, non vides.
- Chaînes : toujours entre guillemets. Échapper les guillemets internes.
- Chiffres de contenu (
valeur,stat) : toujours des chaînes ("78%"). - Entiers de structure (
numero,niveau,start,end,x,y) : sans guillemets. titre: formulation affirmative (le message), jamais un label thématique.- Pas de syntaxe Markdown dans les valeurs : pas de
**gras**, pas de#. Le formatage est géré par le moteur, pas par le texte. - Champ optionnel absent : l'omettre (ne pas mettre
null). - Freeform : respecter
col+w ≤ 12,row+h ≤ 12, max 8 blocs, tokens charte uniquement. - Densité : respecter les maxima par layout (ex. kpi_grid ≤ 6, bullets ≤ 5, org_chart ≤ 4 branches). Au-delà, le rendu se dégrade.
6. Sortie attendue
Quand on te demande de produire une présentation au format Pernod Ricard,
tu produis uniquement le YAML décrit ci-dessus — rien d'autre. Ce YAML
est destiné à être passé tel quel à render_engine_v2.py. Pas de texte
d'introduction, pas de commentaire, pas de Markdown autour : le YAML brut,
directement exploitable.