Files
context-continuity/skill_synology_code.md
T

239 lines
6.1 KiB
Markdown
Raw Normal View History

# 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
```