Dinoer

Pense-bête

Chaque commande, action et code de sortie sur une seule page — le pense-bête du dépôt, copié tel quel.

Version 1.0.1 — septembre 2026

Tout sur une page. Référence complète : docs/MANUEL.md.


Trois commandes

# Voir une page : arbre d'accessibilité
/opt/dinoer/venv/bin/python /opt/dinoer/shot.py --url URL --a11y

# Exécuter un scénario
/opt/dinoer/venv/bin/python /opt/dinoer/rpa.py --scenario FICHIER.json

# Lire une référence de scénario et comparer (surveillance structurelle)
/opt/dinoer/venv/bin/python /opt/dinoer/rpa.py \
  --scenario FICHIER.json --replay-verifier REF.json

Le premier appel sur une machine nécessite --guide-version X.Y, à lire avec grep notice-version /opt/dinoer/docs/GUIDE_LLM.md.


La boucle

        vous décidez de la suite
                  │
                  ▼
   ┌──────────────────────────────┐
   │  shot.py / rpa.py            │   un processus, un JSON sur stdout
   │    ├─ Chromium (headless)    │
   │    ├─ A11y : structure       │
   │    └─ secrets → formulaires  │  jamais dans le shell, jamais dans un log
   └──────────────┬───────────────┘
                  │  boussole + JSON
                  ▼
        vous lisez le même état
        que l'opérateur peut voir aussi

L’état de session vit dans un fichier, pas dans le processus : un second appel avec --reprendre-session réutilise les cookies — jamais l’état du DOM.


Lire la sortie dans cet ordre

LireVous dit
succesl’exécution s’est-elle terminée
boussole.url_couranteoù vous avez effectivement atterri
boussole.dernier_code_httpstatut de la dernière navigation
etat.pret_a_agir + etat.raisonsfrictions perçues — un rapport, jamais une barrière
a11y_treestructure de la page — titres, champs, boutons
respectvotre propre empreinte : pages, actions, durée

Si boussole ne correspond pas à votre attente, arrêtez-vous avant toute action mutante.


Chaque action

type est toujours requis. Les clés ci-dessous sont les clés additionnelles.

ActionRequisOptionnel
naviguerurl—
cliquerselecteurforce, repli_js
cliquer_iframeiframe_selecteur | iframe_chemin, selecteurforce
remplirselecteur, valeursecret_cle
remplir_iframeiframe_selecteur | iframe_chemin, selecteur, valeursecret_cle
evaluerscriptattendu | contient | motif
extraire_texte——
defilerpx | selecteur—
pausems—
attendreselecteur—
attendre_selecteur_presentselecteur—
attendre_absenceselecteurdelai_initial_ms
attendre_navigation——
attendre_urlmotifattendre_changement
attendre_reseau_calme—timeout_ms
attendre_mfa_ntfyselecteurtimeout
nettoyer_overlayselecteur—
declencher_scenarioscenario—

Identifiants — la seule forme correcte

{"type": "remplir", "selecteur": "input[name=\"password\"]", "valeur": "depuis_secrets", "secret_cle": "password"}

N’extrayez jamais un secret dans le shell. lib/repertoire_chiffre.py le résout à l’intérieur du processus Playwright ; la valeur n’atteint jamais votre ligne de commande, votre historique, ni aucun journal.


Quand ça résiste

SymptômeEssayer
Le clic expire, élément visuellement caché"force": true, puis "repli_js": true
Élément sous la ligne de flottaisondefiler d’abord
La page ne finit jamais de charger--wait-until load
L’envoi ne fait rien, aucune erreurvalidation HTML native — soumettez le formulaire via evaluer
exit 42répertoire chiffré non monté (dinoer-monter-secrets, ou bash /opt/dinoer/scripts/monter-repertoire-chiffre.sh sur une installation par clone Git), ou somme de contrôle des identifiants invalide (vérifiez le fichier d’identifiants) — les deux relèvent de SecretsFermesError
guide_non_lupassez --guide-version une fois
403 / 429lisez respect.waf_bloquants — un signal, pas une exception

Codes de sortie

0 succès · 1 échec d’exécution ou assertion échouée · 2 arguments invalides (rejetés avant tout lancement de navigateur) · 3 mauvais interpréteur — utilisez le venv (/opt/dinoer/venv/bin/python) · 42 répertoire d’identifiants chiffré fermé, ou somme de contrôle des identifiants invalide (famille SecretsFermesError) · 43 aucun secrets_dir configuré (SecretsNonConfigureError).