171 lines
9.1 KiB
Python
171 lines
9.1 KiB
Python
|
|
import json, os
|
||
|
|
from trilium_api import create_note, get_note_id, set_label, find_note_by_title, update_note_content
|
||
|
|
|
||
|
|
with open(os.path.expanduser('~/App/Context_continuity/trilium_ids.json')) as f:
|
||
|
|
ids = json.load(f)
|
||
|
|
|
||
|
|
skills_id = find_note_by_title('Skills', ids['root'])
|
||
|
|
if not skills_id:
|
||
|
|
res = create_note(ids['root'], 'Skills', note_type='book')
|
||
|
|
skills_id = get_note_id(res)
|
||
|
|
set_label(skills_id, 'type', 'container')
|
||
|
|
|
||
|
|
res = create_note(skills_id, 'Skill - Structure Context Continuity')
|
||
|
|
nid = get_note_id(res)
|
||
|
|
set_label(nid, 'type', 'skill')
|
||
|
|
set_label(nid, 'domaine', 'context-continuity')
|
||
|
|
set_label(nid, 'version', '1.0')
|
||
|
|
|
||
|
|
content = (
|
||
|
|
'<h1>Skill - Structure Context Continuity dans Trilium</h1>'
|
||
|
|
'<p>Ce skill decrit comment un LLM doit interagir avec la base Trilium '
|
||
|
|
'du systeme Context Continuity. A lire avant toute session de travail '
|
||
|
|
'sur un projet suivi.</p>'
|
||
|
|
|
||
|
|
'<h2>Architecture generale</h2>'
|
||
|
|
'<p>Trilium est organise sous une note racine <strong>Context Continuity</strong> '
|
||
|
|
'avec 8 sous-dossiers :</p>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Dossier</th><th>Contenu</th><th>Cle trilium_ids.json</th></tr>'
|
||
|
|
'<tr><td>Projets</td><td>Une note par projet suivi</td><td>Projets</td></tr>'
|
||
|
|
'<tr><td>Conversations</td><td>Une note par session LLM</td><td>Conversations</td></tr>'
|
||
|
|
'<tr><td>Backlog</td><td>Taches a developper</td><td>Backlog</td></tr>'
|
||
|
|
'<tr><td>Decisions</td><td>Decisions actives du projet</td><td>Decisions</td></tr>'
|
||
|
|
'<tr><td>Historique</td><td>Faits etablis, tests effectues, contraintes</td><td>Historique</td></tr>'
|
||
|
|
'<tr><td>Glossaire</td><td>Vocabulaire specifique au projet</td><td>Glossaire</td></tr>'
|
||
|
|
'<tr><td>Contextes Reprise</td><td>Briefings generes pour bascule LLM</td><td>ContextesReprise</td></tr>'
|
||
|
|
'<tr><td>Skills</td><td>Documentation technique pour LLMs</td><td>Skills</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
|
||
|
|
'<h2>Types de notes et leurs labels obligatoires</h2>'
|
||
|
|
|
||
|
|
'<h3>Note Projet</h3>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Label</th><th>Valeurs possibles</th><th>Obligatoire</th></tr>'
|
||
|
|
'<tr><td>type</td><td>projet</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>projet</td><td>NomSansEspaces ex: SlidingAutomation</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>statut</td><td>actif | en-pause | archive</td><td>oui</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
'<p>Contenu HTML : objectif, stack technique, repartition LLMs.</p>'
|
||
|
|
|
||
|
|
'<h3>Note Conversation</h3>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Label</th><th>Valeurs possibles</th><th>Obligatoire</th></tr>'
|
||
|
|
'<tr><td>type</td><td>conversation</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>projet</td><td>NomSansEspaces</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>llm</td><td>Claude Sonnet | Claude Opus | Le Chat Large | Le Chat Medium</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>statut</td><td>en-cours | clos</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>date</td><td>YYYY-MM-DD HH:MM</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>syntheseCloture</td><td>texte libre 200 mots max</td><td>non - rempli a la cloture</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
'<p>Creee via : <code>python trilium_context.py new-conversation</code></p>'
|
||
|
|
|
||
|
|
'<h3>Note Backlog Item</h3>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Label</th><th>Valeurs possibles</th><th>Obligatoire</th></tr>'
|
||
|
|
'<tr><td>type</td><td>backlogItem</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>projet</td><td>NomSansEspaces</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>statut</td><td>a faire | en cours | bloque | fait | abandonne</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>priorite</td><td>haute | moyenne | basse</td><td>oui</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
'<p>Creee via : <code>python trilium_context.py add-backlog</code> (a implementer) '
|
||
|
|
'ou manuellement dans Trilium.<br>'
|
||
|
|
'<strong>ATTENTION</strong> : list-backlog filtre sur statut != "fait" et != "abandonne". '
|
||
|
|
'Utiliser exactement ces valeurs.</p>'
|
||
|
|
|
||
|
|
'<h3>Note Decision</h3>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Label</th><th>Valeurs possibles</th><th>Obligatoire</th></tr>'
|
||
|
|
'<tr><td>type</td><td>decision</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>projet</td><td>NomSansEspaces</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>statut</td><td>active | revisee | annulee</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>llm</td><td>nom du LLM ayant aide</td><td>non</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
'<p>Creee via : <code>python trilium_context.py add-decision --projet X --enonce "..." --justification "..."</code><br>'
|
||
|
|
'<strong>generate-context inclut uniquement les decisions avec statut=active.</strong><br>'
|
||
|
|
'Pour annuler une decision, changer son label statut en "annulee" dans Trilium.</p>'
|
||
|
|
|
||
|
|
'<h3>Note Historique</h3>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Label</th><th>Valeurs possibles</th><th>Obligatoire</th></tr>'
|
||
|
|
'<tr><td>type</td><td>historiqueItem</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>projet</td><td>NomSansEspaces</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>typeHistorique</td><td>Fait etabli | Test effectue | Hypothese invalidee | Contrainte decouverte</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>encoreValide</td><td>true | false</td><td>oui</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
'<p>Creee via : <code>python trilium_context.py add-history --projet X --type "..." --enonce "..." --detail "..."</code><br>'
|
||
|
|
'<strong>generate-context inclut uniquement les entrees avec encoreValide=true.</strong><br>'
|
||
|
|
'Pour invalider une entree obsolete, changer encoreValide en "false" dans Trilium.</p>'
|
||
|
|
|
||
|
|
'<h3>Note Terme Glossaire</h3>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Label</th><th>Valeurs possibles</th><th>Obligatoire</th></tr>'
|
||
|
|
'<tr><td>type</td><td>termeGlossaire</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>projet</td><td>NomSansEspaces</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>definition</td><td>texte court - definition operationnelle</td><td>oui</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
'<p><strong>ATTENTION</strong> : le label <code>definition</code> est lu par generate-context '
|
||
|
|
'pour afficher le glossaire dans le briefing. Sans ce label, la note affiche "(voir note)".<br>'
|
||
|
|
'Creer manuellement dans Trilium ou via script avec set_label(nid, "definition", "...").</p>'
|
||
|
|
|
||
|
|
'<h3>Note Contexte Reprise</h3>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Label</th><th>Valeurs possibles</th><th>Obligatoire</th></tr>'
|
||
|
|
'<tr><td>type</td><td>contexteReprise</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>projet</td><td>NomSansEspaces</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>llmCible</td><td>nom du LLM destinataire</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>version</td><td>entier incremente a chaque reprise</td><td>oui</td></tr>'
|
||
|
|
'<tr><td>tokens</td><td>estimation tokens du briefing</td><td>non</td></tr>'
|
||
|
|
'<tr><td>conversationSource</td><td>noteId de la conversation clôturee</td><td>non</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
'<p>Creee automatiquement par generate-context. Ne pas creer manuellement.</p>'
|
||
|
|
|
||
|
|
'<h2>Ce qu un LLM doit faire pendant une session</h2>'
|
||
|
|
'<h3>Capitaliser une decision</h3>'
|
||
|
|
'<p>Des qu une decision technique ou architecturale est prise, demander a l utilisateur :</p>'
|
||
|
|
'<pre>Lance cette commande pour enregistrer la decision :\n'
|
||
|
|
'python trilium_context.py add-decision \\\n'
|
||
|
|
' --projet NomProjet \\\n'
|
||
|
|
' --enonce "Enonce court et actionnable" \\\n'
|
||
|
|
' --justification "Pourquoi cette decision"</pre>'
|
||
|
|
|
||
|
|
'<h3>Capitaliser un test ou une contrainte</h3>'
|
||
|
|
'<p>Des qu un test est effectue ou une contrainte decouverte :</p>'
|
||
|
|
'<pre>python trilium_context.py add-history \\\n'
|
||
|
|
' --projet NomProjet \\\n'
|
||
|
|
' --type "Test effectue" \\\n'
|
||
|
|
' --enonce "Ce qui a ete teste en une ligne" \\\n'
|
||
|
|
' --detail "Resultat observe"</pre>'
|
||
|
|
|
||
|
|
'<h3>Generer la synthese de cloture</h3>'
|
||
|
|
'<p>Quand l utilisateur signale que la limite approche, produire :</p>'
|
||
|
|
'<pre>Synthese de cloture :\n'
|
||
|
|
'- Objectif de la session : [ce qu on voulait faire]\n'
|
||
|
|
'- Accompli : [ce qui a ete fait]\n'
|
||
|
|
'- En cours : [ce qui est a moitie fait]\n'
|
||
|
|
'- Bloque : [blocages eventuels]\n'
|
||
|
|
'- Prochaine action : [premiere chose a faire a la reprise]</pre>'
|
||
|
|
'<p>Format concis, 150-200 mots max, sans markdown complexe '
|
||
|
|
'(sera colle en argument --summary).</p>'
|
||
|
|
|
||
|
|
'<h2>Erreurs frequentes a eviter</h2>'
|
||
|
|
'<table>'
|
||
|
|
'<tr><th>Erreur</th><th>Consequence</th><th>Fix</th></tr>'
|
||
|
|
'<tr><td>Valeur statut avec majuscule ex: "Actif"</td><td>Filtre ne trouve pas la note</td><td>Toujours minuscules : "actif"</td></tr>'
|
||
|
|
'<tr><td>Nom projet avec espaces ex: "Sliding Automation"</td><td>search_by_label echoue</td><td>Sans espaces : "SlidingAutomation"</td></tr>'
|
||
|
|
'<tr><td>Label definition absent sur termeGlossaire</td><td>Briefing affiche "(voir note)"</td><td>Ajouter set_label(nid, "definition", "...")</td></tr>'
|
||
|
|
'<tr><td>encoreValide="True" avec majuscule</td><td>Filtre cherche "true" et ne trouve pas</td><td>Toujours "true" ou "false" minuscules</td></tr>'
|
||
|
|
'<tr><td>typeHistorique hors liste</td><td>Affichage incoherent dans briefing</td><td>Utiliser exactement : Fait etabli | Test effectue | Hypothese invalidee | Contrainte decouverte</td></tr>'
|
||
|
|
'</table>'
|
||
|
|
|
||
|
|
'<h2>Commande pour recuperer ce skill</h2>'
|
||
|
|
'<pre>python3 -c "\n'
|
||
|
|
'from trilium_api import find_note_by_title, get_note_content\n'
|
||
|
|
'nid = find_note_by_title(\'Skill - Structure Context Continuity\')\n'
|
||
|
|
'print(get_note_content(nid))\n'
|
||
|
|
'"</pre>'
|
||
|
|
)
|
||
|
|
|
||
|
|
update_note_content(nid, content)
|
||
|
|
print('Skill structure cree:', nid)
|