Files
context-continuity/skill_synology_code.md
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

6.1 KiB

Skill — Modification de code sur GrosseBertha (Synology DS218)

Contexte

GrosseBertha est un Synology DS218 (ARM64, DSM 7.3.2). L'utilisateur est connecté en SSH avec l'utilisateur Master. Le shell est /bin/sh (pas bash).


Règles de procédure — OBLIGATOIRES

Ces règles s'appliquent à toutes les sessions de travail sur le pipeline Sliding. Elles existent pour limiter la consommation de tokens et les itérations inutiles.

1. Demander accord avant tout code lourd

Ne jamais générer un script de patch, une fonction ou un fichier sans avoir demandé et obtenu l'accord explicite de l'utilisateur. "Je génère ?" → attendre "oui" avant de coder.

2. Lire les lignes exactes avant de patcher

Avant tout patch sur render_engine.py, demander le sed sur les lignes concernées :

sed -n 'X,Yp' ~/App/Sliding/python-pptx/render_engine.py

Ne jamais supposer que le fichier sur GrosseBertha correspond au fichier projet. Le fichier sur GrosseBertha diverge souvent des fichiers de référence.

3. Feedback visuel — PNG uniquement

Demander un PNG de la slide concernée uniquement, pas le PDF complet. Depuis PowerPoint : clic droit sur la slide → Enregistrer en image. Évite la rasterisation de PDF multi-pages inutile.

4. Résultat terminal minimal

L'utilisateur ne colle que le résultat essentiel :

  • Si OK : juste "OK" ou les lignes de confirmation
  • Si erreur : uniquement le traceback (pas tout le terminal)

5. Nettoyage unicode avant patch

Le fichier render_engine.py contient des tirets unicode dans les commentaires. Toujours nettoyer en début de script de patch :

import re
c = re.sub(r'[─]+', '-', c)

Sans ce nettoyage, les patterns de remplacement échouent.

6. Valider le fichier final, pas la variable intermédiaire

# CORRECT
with open(SRC) as f:
    final = f.read()
ast.parse(final)

# INCORRECT
ast.parse(content)  # content peut etre une variable intermediaire corrompue

Contrainte absolue — 1 seule ligne terminal

Toutes les commandes terminal doivent être sur UNE SEULE LIGNE.

# CORRECT
python3 -c "import os; print(os.getcwd())"

# INCORRECT
python3 -c "
import os
print(os.getcwd())
"

Stratégie de modification de fichiers Python

Méthode recommandée — Script Python de patch

Créer un script .py dédié téléchargé via l'app mobile Claude.ai.

import ast, shutil, re

SRC = "render_engine.py"
BAK = SRC + ".bak"
shutil.copy2(SRC, BAK)

with open(SRC) as f:
    c = f.read()

# Nettoyage tirets unicode (obligatoire)
c = re.sub(r'[─]+', '-', c)

OLD = """...texte exact apres nettoyage..."""
NEW = """...nouveau texte..."""

if OLD in c:
    c = c.replace(OLD, NEW)
    print("OK")
else:
    print("ECHEC -- pattern non trouve")

with open(SRC, "w") as f:
    f.write(c)

# Valider le fichier final (pas la variable)
with open(SRC) as f:
    final = f.read()
try:
    ast.parse(final)
    print(f"SYNTAXE OK -- {len(final.splitlines())} lignes")
except SyntaxError as e:
    print(f"SYNTAXE ERREUR : {e}")
    shutil.copy2(BAK, SRC)
    print("Backup restaure.")

Méthode par numéros de ligne (si pattern texte fragile)

import re

with open("render_engine.py") as f:
    lines = f.readlines()

# Trouver par marqueur fiable
start = next(i for i, l in enumerate(lines) if "def ma_fonction(" in l)
end   = next(i for i in range(start+1, len(lines)) if re.match(r'^    def ', lines[i]))

new_func = """    def ma_fonction(...):\n        ...\n\n"""
lines = lines[:start] + [new_func] + lines[end:]

Vérifications utiles

# Verifier qu'un patch est applique
grep -n "mot_cle_unique" render_engine.py

# Lire les lignes exactes avant de patcher
sed -n '360,380p' render_engine.py

# Compter les lignes
wc -l render_engine.py

# Lancer un rendu de test
source venv/bin/activate && python3 render_engine.py output/sliding_20260518_220833_input.yaml output/test.pptx

Règles de sécurité — fichiers YAML

Ne jamais écraser theme.yaml, layouts.yaml, components.yaml. Ces fichiers font 15 Ko, 45 Ko et plusieurs Ko. Un LLM qui génère une version minimaliste casse tout le pipeline.

Si modification nécessaire :

  1. cp theme.yaml theme.yaml.bak
  2. Script Python ciblé sur la clé concernée uniquement
  3. ls -lh *.yaml pour vérifier la taille après

En cas d'écrasement : originaux disponibles dans les outputs Claude.ai du projet.


Téléchargement depuis Claude.ai

La webapp desktop échoue sur les fichiers > quelques Ko. Toujours utiliser l'app mobile Claude.ai pour télécharger les scripts générés.


Structure des dossiers

~/App/Sliding/python-pptx/
    render_engine.py     <- moteur rendu PPTX (2300+ lignes, diverge du fichier projet)
    facilitator.py
    prompt_injection.py
    theme.yaml           <- NE PAS ECRASER (15 Ko)
    components.yaml      <- NE PAS ECRASER
    layouts.yaml         <- NE PAS ECRASER (45 Ko)
    assets/fonts/        <- Inter + Cormorant Garamond TTF
    venv/
    output/

~/App/Context_continuity/
    trilium_context.py

/volume1/docker/trilium/   <- donnees Trilium (chown 1000:1000)
/volume1/web/sliding/      <- galerie layouts HTML
/volume1/scripts/          <- scripts utilitaires

Activation du venv

source ~/App/Sliding/python-pptx/venv/bin/activate

Outils disponibles sur GrosseBertha

Outil Dispo Note
python3 oui v3.9
pip oui avec --break-system-packages
docker oui Container Manager 24.0.2
wget oui avertissement HSTS ignorable
unzip non utiliser python3 zipfile
fc-list non detecter polices via assets/fonts/
setfacl non pas disponible
fc-cache non pas disponible
pdftoppm oui poppler-utils installe
pdftotext oui poppler-utils installe

Gestion Container Manager

# Si Docker en erreur apres update DSM
sudo synosetkeyvalue /etc/synoinfo.conf unique synology_rtd1296_ds220j
sudo synosetkeyvalue /etc.defaults/synoinfo.conf unique synology_rtd1296_ds220j
sudo synopkg start ContainerManager

# Trilium
sudo docker ps
sudo docker logs trilium
sudo docker restart trilium