01629780f4
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.
154 lines
6.5 KiB
Python
154 lines
6.5 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)
|
|
|
|
res = create_note(ids['root'], 'README - Workflow Context Continuity')
|
|
nid = get_note_id(res)
|
|
set_label(nid, 'type', 'documentation')
|
|
|
|
content = (
|
|
'<h1>README - Workflow Context Continuity</h1>'
|
|
'<p>Systeme de gestion du contexte multi-LLM (Claude + Le Chat) via Trilium comme base pivot.<br>'
|
|
'Permet de basculer entre les deux LLMs sans perdre le fil du projet.</p>'
|
|
|
|
'<h2>Prerequis</h2>'
|
|
'<pre>'
|
|
'cd ~/App/Context_continuity\n'
|
|
'source venv/bin/activate'
|
|
'</pre>'
|
|
|
|
'<h2>ETAPE 1 - Debut de session : creer la conversation</h2>'
|
|
'<p>Au debut de chaque session de travail avec un LLM, enregistre-la dans Trilium :</p>'
|
|
'<pre>python trilium_context.py new-conversation \\\n'
|
|
' --projet SlidingAutomation \\\n'
|
|
' --llm "Claude Sonnet" \\\n'
|
|
' --titre "Description courte de ce que tu vas faire"</pre>'
|
|
'<p><strong>Note l ID retourne</strong> — tu en auras besoin a la fin de la session.<br>'
|
|
'Exemple de retour : <code>Note l ID pour close-session : Igaa5BBIfNMw</code></p>'
|
|
|
|
'<h2>ETAPE 2 - Recuperer le contexte existant (optionnel)</h2>'
|
|
'<p>Si tu reprends un projet en cours, genere le briefing depuis la derniere session :</p>'
|
|
'<pre>python trilium_context.py generate-context \\\n'
|
|
' --projet SlidingAutomation \\\n'
|
|
' --llm-cible "Claude Sonnet" \\\n'
|
|
' --note-id ID_DERNIERE_CONV \\\n'
|
|
' --version N</pre>'
|
|
'<p>Le briefing est imprime dans le terminal.<br>'
|
|
'<strong>Copie-colle le texte imprime en debut de nouvelle session LLM.</strong><br>'
|
|
'Le LLM confirmera sa comprehension en 3 lignes (objectif / prochaine action / incertitude).</p>'
|
|
'<p>Pour trouver l ID de la derniere conversation :<br>'
|
|
'Dans Trilium : Context Continuity > Conversations > chercher la plus recente.<br>'
|
|
'Ou via terminal :</p>'
|
|
'<pre>python trilium_context.py list-projects</pre>'
|
|
|
|
'<h2>ETAPE 3 - Pendant la session : capitaliser au fil de l eau</h2>'
|
|
'<p>Ne pas attendre la fin — enregistre les informations importantes au fur et a mesure :</p>'
|
|
'<pre># Une decision est prise\n'
|
|
'python trilium_context.py add-decision \\\n'
|
|
' --projet SlidingAutomation \\\n'
|
|
' --enonce "On fait X plutot que Y" \\\n'
|
|
' --justification "Parce que Z"\n\n'
|
|
'# Un test a ete effectue\n'
|
|
'python trilium_context.py add-history \\\n'
|
|
' --projet SlidingAutomation \\\n'
|
|
' --type "Test effectue" \\\n'
|
|
' --enonce "Test de X" \\\n'
|
|
' --detail "Resultat : Y"\n\n'
|
|
'# Une contrainte est decouverte\n'
|
|
'python trilium_context.py add-history \\\n'
|
|
' --projet SlidingAutomation \\\n'
|
|
' --type "Contrainte decouverte" \\\n'
|
|
' --enonce "X ne fonctionne pas sur Python 3.9" \\\n'
|
|
' --detail "Utiliser Y a la place"</pre>'
|
|
|
|
'<h2>ETAPE 4 - Limite de tokens approche : cloturer la session</h2>'
|
|
'<p>Signes que la limite approche : le LLM repete des choses deja dites, oublie une contrainte, '
|
|
'ses reponses deviennent moins precises.<br>'
|
|
'<strong>Action :</strong> demande au LLM actuel :</p>'
|
|
'<pre>Fais-moi une synthese de cloture en 200 mots :\n'
|
|
'ou on en est, ce qui reste a faire, les blocages eventuels.</pre>'
|
|
'<p>Puis enregistre cette synthese :</p>'
|
|
'<pre>python trilium_context.py close-session \\\n'
|
|
' --note-id ID_CONV_ACTUELLE \\\n'
|
|
' --summary "COLLE ICI LA SYNTHESE DU LLM"</pre>'
|
|
|
|
'<h2>ETAPE 5 - Generer le briefing de reprise</h2>'
|
|
'<pre>python trilium_context.py generate-context \\\n'
|
|
' --projet SlidingAutomation \\\n'
|
|
' --llm-cible "Le Chat Large" \\\n'
|
|
' --note-id ID_CONV_ACTUELLE \\\n'
|
|
' --version N</pre>'
|
|
'<p>Le terminal imprime le briefing complet.<br>'
|
|
'Une note "Contexte Reprise" est aussi creee automatiquement dans Trilium.</p>'
|
|
|
|
'<h2>ETAPE 6 - Basculer vers le second LLM</h2>'
|
|
'<ol>'
|
|
'<li>Ouvre une nouvelle session sur l autre LLM (Claude ou Le Chat)</li>'
|
|
'<li>Cree la nouvelle conversation dans Trilium :<br>'
|
|
'<pre>python trilium_context.py new-conversation \\\n'
|
|
' --projet SlidingAutomation \\\n'
|
|
' --llm "Le Chat Large" \\\n'
|
|
' --titre "Suite - description"</pre></li>'
|
|
'<li>Copie-colle le briefing imprime a l etape 5 en premier message de la nouvelle session</li>'
|
|
'<li>Le LLM confirme en 3 lignes — verifie qu il a bien compris avant de continuer</li>'
|
|
'<li>Reprends le travail depuis le backlog actif</li>'
|
|
'</ol>'
|
|
|
|
'<h2>ETAPE 7 - Voir l etat du projet a tout moment</h2>'
|
|
'<pre># Backlog actif\n'
|
|
'python trilium_context.py list-backlog --projet SlidingAutomation\n\n'
|
|
'# Liste des projets\n'
|
|
'python trilium_context.py list-projects</pre>'
|
|
|
|
'<h2>Resume visuel du cycle</h2>'
|
|
'<pre>'
|
|
'DEBUT SESSION\n'
|
|
' |\n'
|
|
' v\n'
|
|
'new-conversation (note l ID)\n'
|
|
' |\n'
|
|
' v\n'
|
|
'generate-context (si reprise) --> coller dans LLM\n'
|
|
' |\n'
|
|
' v\n'
|
|
'TRAVAILLER\n'
|
|
'add-decision / add-history au fil de l eau\n'
|
|
' |\n'
|
|
' v (limite approche)\n'
|
|
'Demander synthese au LLM\n'
|
|
' |\n'
|
|
' v\n'
|
|
'close-session (coller la synthese)\n'
|
|
' |\n'
|
|
' v\n'
|
|
'generate-context --> briefing imprime\n'
|
|
' |\n'
|
|
' v\n'
|
|
'new-conversation (sur l autre LLM)\n'
|
|
'Coller le briefing --> LLM confirme en 3 lignes\n'
|
|
' |\n'
|
|
' v\n'
|
|
'REPRENDRE LE TRAVAIL'
|
|
'</pre>'
|
|
|
|
'<h2>Fichiers du systeme</h2>'
|
|
'<table>'
|
|
'<tr><th>Fichier</th><th>Role</th></tr>'
|
|
'<tr><td><code>trilium_api.py</code></td><td>Wrapper API Trilium (ne pas modifier)</td></tr>'
|
|
'<tr><td><code>trilium_init.py</code></td><td>Initialisation arborescence (une seule fois)</td></tr>'
|
|
'<tr><td><code>trilium_context.py</code></td><td>Script principal du workflow quotidien</td></tr>'
|
|
'<tr><td><code>trilium_logger.py</code></td><td>Integration pipeline Sliding Automation</td></tr>'
|
|
'<tr><td><code>trilium_ids.json</code></td><td>IDs des dossiers Trilium (genere par init)</td></tr>'
|
|
'<tr><td><code>.env</code></td><td>Token ETAPI et URL Trilium (ne pas commiter)</td></tr>'
|
|
'</table>'
|
|
|
|
'<h2>Skills disponibles dans Trilium</h2>'
|
|
'<p>Context Continuity > Skills > Skill - API Trilium ETAPI<br>'
|
|
'Contient les patterns API, erreurs connues et fixes pour TriliumNext 0.95+</p>'
|
|
)
|
|
|
|
update_note_content(nid, content)
|
|
print('README cree:', nid)
|