# 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 : ```bash 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 : ```python 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 ```python # 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.** ```bash # 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. ```python 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) ```python 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 ```bash # 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 ```bash 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 ```bash # 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 ```