Files
context-continuity/create_skill.py
T
Master 01629780f4 chore: versioning initial du systeme Context Continuity
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.
2026-06-29 11:02:22 +02:00

86 lines
4.9 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)
# Créer le dossier Skills
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')
print('Dossier Skills cree:', skills_id)
else:
print('Dossier Skills existant:', skills_id)
# Créer la note skill
res = create_note(skills_id, 'Skill - API Trilium ETAPI')
nid = get_note_id(res)
set_label(nid, 'type', 'skill')
set_label(nid, 'domaine', 'trilium')
set_label(nid, 'version', '0.95')
content = (
'<h1>Skill - API Trilium ETAPI (TriliumNext 0.95+)</h1>'
'<h2>Contexte</h2>'
'<p>TriliumNext 0.95 a restructure ses routes internes.<br>'
'<code>POST /etapi/notes</code> retourne <em>Router not found</em>.<br>'
'Solution validee : utiliser <strong>trilium-py 1.3.9</strong>.</p>'
'<h2>Installation</h2>'
'<pre>pip install trilium-py python-dotenv</pre>'
'<h2>Authentification</h2>'
'<p>Token dans .env :</p>'
'<pre>TRILIUM_URL=http://localhost:4292\nTRILIUM_TOKEN=token_genere_dans_Options_ETAPI</pre>'
'<p>Header : <code>Authorization: token</code> (sans Bearer)<br>'
'Bearer accepte depuis 0.93 mais non requis.</p>'
'<h2>Wrapper valide : trilium_api.py</h2>'
'<p>Chemin : <code>~/App/Context_continuity/trilium_api.py</code></p>'
'<table>'
'<tr><th>Fonction</th><th>Description</th></tr>'
'<tr><td><code>check_api()</code></td><td>Leve SystemExit si Trilium inaccessible</td></tr>'
'<tr><td><code>create_note(parent_id, title, content=" ", note_type="text")</code></td><td>content=" " obligatoire — pas vide</td></tr>'
'<tr><td><code>get_note_id(result)</code></td><td>Extrait noteId du resultat create_note</td></tr>'
'<tr><td><code>get_note(note_id)</code></td><td>Recupere une note par ID</td></tr>'
'<tr><td><code>get_note_content(note_id)</code></td><td>Recupere le contenu HTML</td></tr>'
'<tr><td><code>update_note_content(note_id, content)</code></td><td>Met a jour le contenu</td></tr>'
'<tr><td><code>search_notes(query, limit=50)</code></td><td>Recherche SANS guillemets autour du terme</td></tr>'
'<tr><td><code>search_by_label(label, value="")</code></td><td>Syntaxe : #label=value</td></tr>'
'<tr><td><code>find_note_by_title(title, parent_id="")</code></td><td>Retourne noteId ou None</td></tr>'
'<tr><td><code>set_label(note_id, name, value="")</code></td><td>isInheritable=False requis en interne</td></tr>'
'<tr><td><code>get_label_value(note_id, name)</code></td><td>Retourne valeur label ou None</td></tr>'
'</table>'
'<h2>Erreurs connues et fixes</h2>'
'<table>'
'<tr><th>Erreur</th><th>Cause</th><th>Fix</th></tr>'
'<tr><td>Router not found POST /etapi/notes</td><td>TriliumNext 0.95 routing change</td><td>Utiliser trilium-py</td></tr>'
'<tr><td>missing argument isInheritable</td><td>create_attribute() trilium-py</td><td>Passer isInheritable=False</td></tr>'
'<tr><td>Note content must be set</td><td>content vide refuse</td><td>Passer content=" "</td></tr>'
'<tr><td>Recherche avec guillemets retourne []</td><td>Parser 0.95</td><td>Chercher sans guillemets</td></tr>'
'<tr><td>{status,code,message} sur create</td><td>Note existe deja ou contenu vide</td><td>find_note_by_title avant + content=" "</td></tr>'
'</table>'
'<h2>Patterns valides</h2>'
'<h3>Creer une note</h3>'
'<pre>result = create_note(parent_id, "Titre", note_type="text")\nnote_id = get_note_id(result)</pre>'
'<h3>Rechercher par label</h3>'
'<pre>notes = search_by_label("type", "backlogItem")\nnotes = search_by_label("projet", "SlidingAutomation")</pre>'
'<h3>Ajouter un attribut</h3>'
'<pre>set_label(note_id, "statut", "actif")</pre>'
'<h3>Workflow bascule LLM</h3>'
'<pre>'
'python trilium_context.py new-conversation --projet SlidingAutomation --llm "Claude Sonnet" --titre "Ma session"\n'
'# Travailler... puis quand limite approche :\n'
'python trilium_context.py close-session --note-id ID --summary "..."\n'
'python trilium_context.py generate-context --projet SlidingAutomation --llm-cible "Le Chat Large" --note-id ID --version 2\n'
'# Copier le briefing imprime dans la nouvelle session LLM'
'</pre>'
'<h2>IDs importants</h2>'
'<p>Stockes dans <code>trilium_ids.json</code> apres <code>python trilium_init.py</code><br>'
'Cles : root, Projets, Conversations, Backlog, Decisions, Historique, Glossaire, ContextesReprise</p>'
'<h2>Recuperer ce skill en contexte LLM</h2>'
'<pre>python3 -c "\nfrom trilium_api import find_note_by_title, get_note_content\nnid = find_note_by_title(\'Skill - API Trilium ETAPI\')\nprint(get_note_content(nid))\n"</pre>'
)
update_note_content(nid, content)
print('Skill cree et rempli:', nid)