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.
This commit is contained in:
@@ -0,0 +1,238 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user