Pourquoi créer un plugin ?

AutomationSequence V8 dispose de 145+ actions natives couvrant GUI, fichiers, réseau, bases de données, OCR, IA, sécurité et orchestration. Mais chaque environnement a ses spécificités : un connecteur métier propriétaire, une API interne, un format de fichier maison. La Plugin API V8 permet d'ajouter n'importe quelle action sans modifier le core.

Un plugin est un simple dossier Python placé dans plugins/. Il est auto-découvert au démarrage et apparaît immédiatement dans l'interface, le catalogue JSON et l'autocomplétion de la Command Palette.

Un plugin bien écrit est indiscernable d'une action native pour l'utilisateur final. Il bénéficie des mêmes mécanismes : variables, conditions, gestion d'erreur, log d'audit HMAC.

Structure d'un plugin V8

plugins/
└── mon_plugin/
    ├── plugin.py        # code principal (obligatoire)
    ├── plugin.json      # métadonnées (obligatoire)
    ├── icon.png         # icône 32×32 (optionnel)
    ├── requirements.txt # dépendances pip (optionnel)
    └── README.md        # doc pour marketplace (optionnel)

Schéma JSON de l'action

Le fichier plugin.json définit le nom, la catégorie, les paramètres et leurs types. AutomationSequence génère automatiquement le formulaire de saisie (SmartFormDialog) à partir de ce schéma :

{
  "name":        "oracle_export",
  "display_name":"Oracle → CSV Export",
  "category":    "databases",
  "icon":        "icon.png",
  "version":     "1.0.0",
  "author":      "Tristan Ruard",
  "description": "Exécute une requête Oracle et exporte en CSV",
  "params": [
    {
      "key":         "dsn",
      "label":       "DSN Oracle",
      "type":        "string",
      "required":    true,
      "placeholder": "user/pass@host:1521/SID"
    },
    {
      "key":      "query",
      "label":   "Requête SQL",
      "type":    "multiline",
      "required": true
    },
    {
      "key":      "output_file",
      "label":   "Fichier CSV de sortie",
      "type":    "file_save",
      "default": "export.csv"
    }
  ]
}

Types de paramètres disponibles : string, multiline, integer, float, boolean, select (liste déroulante), file_open, file_save, folder, password, color.

Cycle de vie

AutomationSequence appelle trois méthodes sur chaque plugin, dans l'ordre :

  • setup(context) — appelée une fois au chargement. Initialisation des connexions persistantes, vérification des dépendances.
  • execute(params, context) — appelée à chaque exécution de l'action. Reçoit les paramètres résolus (variables interpolées) et le contexte de séquence.
  • teardown(context) — appelée à la fin de la séquence. Fermeture des connexions, nettoyage.

Exemple complet : Oracle → CSV

from automation_sequence.plugin import PluginBase, PluginResult
import csv, io

class OracleExportPlugin(PluginBase):

    def setup(self, context):
        # Vérifier que cx_Oracle est installé
        try:
            import cx_Oracle
            self._cx = cx_Oracle
        except ImportError:
            raise RuntimeError("cx_Oracle requis : pip install cx_Oracle")

    def execute(self, params, context) -> PluginResult:
        dsn    = params['dsn']
        query  = params['query']
        output = params['output_file']

        conn   = self._cx.connect(dsn)
        cursor = conn.cursor()
        cursor.execute(query)

        rows    = cursor.fetchall()
        headers = [d[0] for d in cursor.description]

        with open(output, 'w', newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerow(headers)
            writer.writerows(rows)

        conn.close()

        # Stocker le résultat dans une variable de séquence
        context.set_var('oracle_export_rows', len(rows))

        return PluginResult(
            success=True,
            message=f"{len(rows)} lignes exportées vers {output}",
            data={'rows': len(rows), 'file': output}
        )

    def teardown(self, context):
        pass  # connexion fermée dans execute

Fonctions avancées

Variables et interpolation

Le contexte expose l'ensemble des variables de la séquence. Les paramètres passés à execute() ont déjà leurs variables interpolées : {{ma_variable}} est remplacé par sa valeur avant l'appel.

# Lire une variable de séquence
last_result = context.get_var('last_result', default=None)

# Écrire une variable (disponible pour les actions suivantes)
context.set_var('mon_plugin_output', 'valeur')

# Logger dans le journal d'audit HMAC
context.log('info', 'Export Oracle terminé', data={'rows': 42})

Plugin avec déclencheur WebhookListen

Un plugin peut aussi déclarer un déclencheur HTTP entrant, s'activant à la réception d'une requête POST sur un endpoint configuré. C'est la fonctionnalité WebhookListen V8.

Packaging et distribution

Pour distribuer un plugin à d'autres utilisateurs, créez une archive ZIP de votre dossier mon_plugin/. L'utilisateur l'importe via Plugins → Importer un plugin. AutomationSequence vérifie le plugin.json, installe les dépendances listées dans requirements.txt et redémarre le gestionnaire de plugins sans relancer l'application.

Marketplace V8

La marketplace V8 est un catalogue JSON hébergé qui référence les plugins publics. Pour y publier votre plugin :

  1. Hébergez le ZIP sur un serveur accessible (GitHub Releases, S3, serveur interne).
  2. Soumettez une entrée dans le catalogue JSON de la marketplace TRUvector (format documenté dans le manuel §37).
  3. Les utilisateurs voient votre plugin dans Plugins → Marketplace et l'installent en un clic.

Conclusion

La Plugin API V8 suit un contrat minimal : un fichier plugin.json pour le schéma, un fichier plugin.py avec la classe héritant de PluginBase, et trois méthodes à implémenter. Tout le reste — formulaire de saisie, interpolation des variables, log d'audit, gestion d'erreur — est pris en charge par le core. Un plugin fonctionnel se développe en moins d'une heure pour un développeur Python confirmé.

⚙️
PRODUIT LIÉ
AutomationSequence V8.0
← Guide V8 Article suivant →