Éditeurs personnalisés
Il existe des tâches qui ne figurent dans aucun panneau, parce qu'elles n'appartiennent qu'à vous : un recalcul de prix selon la formule d'un fournisseur, un rapprochement du catalogue avec un système comptable tiers, un écran « remplir les caractéristiques d'un lot en une seule passe ». La section « Éditeurs personnalisés » permet d'écrire soi-même un tel mini-éditeur (ou de le faire développer) et de le lancer dans l'interface d'administration — dans un bac à sable, avec un accès limité exactement aux données que vous avez autorisées.
Ouvrir : Panneau d'administration → Éditeurs personnalisés (admin.cenaly.com/custom-editors). La section s'active via la fiche « Éditeurs personnalisés (SDK) » dans la boutique d'applications — par défaut, elle est masquée. Le bouton « 📌 Dans la barre latérale » sur la page elle-même la place dans le menu latéral, lorsqu'elle est souvent nécessaire.
De quoi s'agit-il#
Un plugin est un script compilé (index.js) et sa description (manifest.json). Le panneau charge le script dans un cadre isolé : il n'a accès ni à votre session, ni au code de l'interface d'administration, ni au réseau. Il ne peut communiquer avec les données que par l'intermédiaire du pont — un ensemble de requêtes autorisées, chacune vérifiée selon les droits accordés.
La page se compose de blocs :
| Bloc | Ce qu'il contient |
|---|---|
| Éditeurs installés | une fiche par plugin : nom, « Version », « Droits », « Emplacement », « Hôtes réseau autorisés », « Mis à jour », source (dépôt et tag sous forme de lien). Actions : « Ouvrir », « Activer » / « Désactiver », vérification des mises à jour, « Supprimer » |
| Installer un éditeur | installation à partir de fichiers sur le disque |
| Installation depuis GitHub | installation par l'adresse d'un dépôt public et un tag |
| 🤖 Développement avec l'IA (vibe coding) | modèle de projet, prompt pour un agent IA et instantané du catalogue comme données de test |
| 👩💻 Accès développeur | autorisations temporaires accordées à un prestataire pour le mode développeur |
| 🛠️ Mode développeur | lancement du plugin directement depuis votre ordinateur, sans installation |
Un éditeur ouvert occupe tout l'écran, et l'adresse de la page reçoit la mention ?app=<identifiant> — ce lien peut être partagé avec une personne qui dispose d'un accès.
Ce qu'il faut pour démarrer#
| Quoi | Pourquoi |
|---|---|
| La fiche « Éditeurs personnalisés (SDK) » dans la boutique d'applications | la section est spécialisée et désactivée par défaut |
| Vous êtes propriétaire du compte | seul le propriétaire peut installer, activer, supprimer des plugins et accorder des autorisations ; les employés voient la liste en lecture seule |
Un plugin compilé : index.js + manifest.json |
soit le vôtre, soit celui d'un développeur, soit une release dans un dépôt GitHub public |
| Pour le développement — un compte employé pour le développeur | le mode développeur est accordé via l'e-mail de son identifiant professionnel |
Étape 1. Décider qui écrira l'éditeur#
Il existe trois voies, qui diffèrent par la personne qui détient le code :
| Voie | À qui elle convient | Comment |
|---|---|---|
| Agent IA selon notre modèle | au propriétaire prêt à expliquer la tâche avec des mots | bloc « Développement avec l'IA » : modèle + prompt → l'agent assemble une release → vous l'installez |
| Votre développeur ou un développeur engagé | vous avez un prestataire ou un développeur dans l'équipe | accordez-lui une autorisation pour le mode développeur, il écrit et débogue sur le compte réel, vous installez la release finale |
| Release prête depuis GitHub | le plugin est déjà écrit (par vous ou pour vous) | « Installation depuis GitHub » : adresse du dépôt et tag |
Dans les trois cas, l'installation reste au propriétaire : même un développeur disposant d'une autorisation peut seulement lancer son code chez lui en mode développeur, mais pas l'installer dans le compte.
Étape 2. Développement avec l'IA (vibe coding)#
Le bloc « 🤖 Développement avec l'IA (vibe coding) » fournit quatre éléments pour confier la tâche à un agent IA (Claude Code, Cursor et similaires) sans lui expliquer le contrat depuis zéro :
- « ⬇️ Télécharger le modèle de projet (zip) » — une structure de plugin prête à l'emploi : manifeste, point d'entrée, description du contrat (
GUIDE.en.md) et instructions pour l'agent. L'archive est assemblée directement dans le navigateur, rien d'externe n'est à télécharger. - « 📋 Copier le prompt pour l'agent » — le texte de la tâche en anglais : démarrer depuis le modèle, se référer au guide, comment vérifier le résultat.
- Configuration de l'ensemble d'outils pour l'agent — avec elle, l'agent assemble le plugin, monte un banc local, copie du bac à sable, fait des captures d'écran et des instantanés d'état, et à la fin assemble une release : un zip pour l'installation manuelle ou une release sur GitHub.
- « ⬇️ Télécharger l'instantané du catalogue (fixture de test) » — vos catégories et articles dans un fichier, pour que l'agent teste sur des données réelles et non inventées.
⚠️ Les champs personnalisés des autres plugins sont entièrement retirés de l'instantané : les données qu'une extension tierce stocke sur vos fiches ne quittent pas le compte avec la fixture.
Étape 3. Installer l'éditeur#
À partir de fichiers. Bloc « Installer un éditeur » : sélectionnez « Bundle (index.js) » et « Manifeste (manifest.json) » → « Vérifier et installer ». Le panneau vérifie d'abord le manifeste — identifiant, nom localisé, version, version minimale du SDK, emplacements, droits et liste des hôtes réseau — puis affiche le consentement : « Cet éditeur demande : » et la liste des droits en langage clair. Tant que vous n'avez pas cliqué sur « Installer », rien ne s'installe.
Depuis GitHub. Bloc « Installation depuis GitHub » : champ « Dépôt (URL ou owner/repo) », champ « Tag (vide = dernière release) » et bouton « Vérifier le dépôt ». La convention est simple : manifest.json à la racine du dépôt, dist/index.js compilé dans le tag, tag de la forme v{version}. Le manifeste et le bundle sont récupérés directement depuis votre navigateur. Dans les deux cas, lors de l'installation, une empreinte du bundle (sha256) est calculée et mémorisée : si le fichier est ensuite remplacé, le lancement sera bloqué et le panneau demandera de réinstaller l'éditeur.
Droits et emplacements d’affichage#
Les droits (aussi appelés scopes) sont demandés par le plugin dans le manifeste, et vous les confirmez lors de l’installation. La liste complète est la suivante : le pont ne sait rien faire de plus :
| Droit | Ce qui est accessible |
|---|---|
| Lire le catalogue | catégories, articles, caractéristiques et champs personnalisés des fiches |
| Créer et modifier des articles du catalogue | création et modification d’articles, import de lots, champs personnalisés et définitions de caractéristiques |
| Modifier les prix, la disponibilité et les stop-lists par établissement | les mêmes actions que le panneau dans le menu de l’établissement |
| Lire le référentiel des articles en stock | nomenclature du stock en lecture |
| Stocker ses propres paramètres dans votre espace de stockage | clés propres au plugin dans votre compte (jusqu’à 1 Mo par clé) |
| Partie serveur de l’extension | appels au code du plugin sur notre serveur — le seul moyen pour lui d’accéder à internet |
Ce qui ne figure pas du tout dans la liste, le plugin ne l’obtiendra par aucun paramètre : les clients et les invités, les commandes, les reçus, les finances, les employés, les messageries et les appels — le pont ne les transmet pas.
Les emplacements d’affichage (slots) sont au nombre de trois :
| Slot | Où il apparaît |
|---|---|
| Page dédiée | un élément dans la section « Éditeurs personnalisés », s’ouvre en plein écran |
| Bouton sur la page du catalogue | un outil à côté du catalogue d’articles |
| Onglet de la section « Stock » | le plugin s’affiche comme un onglet du stock — c’est ainsi qu’est packagée notre extension intégrée « ВетИС » |
Mode développeur et accès pour un prestataire#
Le mode développeur (bloc « 🛠️ Mode développeur ») monte le plugin en direct depuis votre ordinateur : le champ « URL du bundle » n’accepte que les adresses localhost / 127.0.0.1, à côté se trouvent le « JSON du manifeste » et le bouton « Lancer une session dev ». L’empreinte n’est alors pas épinglée, et la session dure jusqu’à la fermeture de l’onglet ; « Arrêter la session dev » la coupe immédiatement.
Les grants développeur (bloc « 👩💻 Accès développeur ») sont nécessaires lorsque ce n’est pas le propriétaire qui écrit le code. Un compte employé ordinaire est créé pour le développeur, puis le propriétaire émet un grant : « Email du développeur (son identifiant staff) », « Droits autorisés », « Durée de validité (jours) » et une note facultative → « Accorder l’accès ». La révocation est possible à tout moment via le bouton « Révoquer ».
Ce que le grant permet et ne permet pas :
- permet — uniquement le mode développeur avec les droits que vous avez cochés (par défaut, durée de 14 jours, maximum 90) ;
- les droits sont limités par intersection : ce que demande le manifeste et ce qui est accordé par le grant ; le plugin n’obtiendra rien de plus, même s’il le demande dans le manifeste ;
- ne permet pas — l’installation, l’activation et la suppression des plugins : cela reste au propriétaire.
Mise à jour, activation et suppression#
| Action | Comment |
|---|---|
| Ouvrir | bouton « Ouvrir » sur la fiche (ou lien avec ?app=…) |
| Désactiver temporairement | « Désactiver » — le plugin reste installé, mais ne s’exécute pas et ne s’affiche pas à ses emplacements |
| Mettre à jour | pour les plugins issus de GitHub — « Vérifier les mises à jour » puis « Mettre à jour vers … » ; si la version est à jour, le panneau indique « La dernière version est installée ». Les plugins issus de fichiers se mettent à jour par une réinstallation |
| Supprimer | « Supprimer » avec confirmation : les paramètres et l’élément sont retirés, les versions téléchargées restent dans l’espace de stockage |
Les mises à jour automatiques n’existent pas volontairement : une nouvelle version de code tiers est une nouvelle empreinte et, éventuellement, de nouveaux droits, c’est pourquoi la mise à jour est toujours un acte conscient du propriétaire.
Extensions intégrées#
Certains de nos propres modules sont packagés dans le même format — cela se voit à leur comportement, mais il n’est pas nécessaire de les installer : ils arrivent avec le panneau et s’activent depuis leur fiche dans la boutique d’applications, et non dans cette section.
Actuellement, un seul module est concerné — « Меркурий/ВетИС » pour la Russie : il vit comme un onglet de la section « Stock », s’exécute dans la même sandbox et avec les mêmes vérifications d’empreinte. Les extensions intégrées n’apparaissent pas dans la liste des éditeurs installés.
Ce que l’éditeur peut faire et ne peut pas faire#
| Peut | Ne peut pas |
|---|---|
| Lire et modifier le catalogue dans les limites des droits accordés | connaître votre mot de passe ou utiliser votre session |
| Afficher sa propre interface, des notifications et des demandes de confirmation | ouvrir le code ou les données de l’admin autour de lui |
| Ouvrir l’éditeur d’article natif du panneau | accéder à internet directement depuis la fenêtre du plugin |
| Stocker ses paramètres dans votre compte | voir les données d’un autre plugin sur vos fiches |
| Accéder à internet via la partie serveur — et uniquement vers les adresses https listées dans le manifeste (huit au maximum) | s’exécuter après une substitution de fichier : une empreinte non concordante bloque le lancement |
Les plugins tiers sont signalés sur leur fiche par un avertissement : « Application tierce en sandbox — elle ne demande jamais de mot de passe. » Si un plugin demande un identifiant de connexion au panneau, des données de paiement ou un code reçu par SMS, il s’agit d’une fraude, et non du fonctionnement d’une extension.
Limites#
- La section est désactivée par défaut et s'adresse à ceux qui écrivent du code (ou qui en commandent) : un propriétaire ordinaire n'a rien à y faire.
- Tout, sauf la consultation, est réservé au propriétaire du compte. Un employé voit le hub en lecture seule ; le mode développeur n'est accessible qu'avec une autorisation active.
- Les dépôts GitHub privés ne sont pas pris en charge — le dépôt doit être public, l'installation se fait par tag.
- Pas de mise à jour automatique : la mise à jour du plugin est toujours lancée par le propriétaire.
- Il n'y a pas de magasin de plugins tiers. Les extensions prêtes ne sont ni publiées ni vendues via le panneau — la seule source est votre fichier ou votre dépôt.
- Trois emplacements (page dédiée, bouton du catalogue, onglet de stock) — un plugin ne peut pas s'intégrer dans un écran arbitraire du panneau.
- Le pont ne transmet ni clients, ni commandes, ni finances, ni employés, ni conversations — impossible de contourner cela par les droits, ces requêtes n'existent tout simplement pas.
- Il n'y a pas de journal séparé « le plugin a fait ceci ou cela ». Les droits sont visibles sur la fiche, et les modifications du catalogue apparaissent dans l'historique habituel des articles ; si vous avez besoin d'un contrôle, commencez par un plugin auquel seul l'accès en lecture est accordé.
- Plafonds techniques : bundle jusqu'à 4 Mo, jusqu'à 8 adresses réseau dans le manifeste, jusqu'à 1 Mo par clé de stockage ; exécution côté serveur — jusqu'à 30 secondes et jusqu'à 50 requêtes internet à la fois.
- Les données du plugin restent dans le cloud de votre marque : pour un compte sur
cenaly.ru, l'état de la partie serveur se trouve dans le contour russe.
Résolution des problèmes#
| Symptôme | À vérifier |
|---|---|
| La section n'est pas dans le menu | la fiche « Éditeurs personnalisés (SDK) » est-elle activée dans la boutique d'applications ; la section a-t-elle été placée dans la barre latérale avec le bouton « 📌 Dans la barre latérale » |
| Un employé ne voit pas les boutons d'installation | c'est voulu : installation, suppression et autorisations sont réservées au propriétaire du compte |
| « Le bundle dans le stockage ne correspond pas à l'empreinte installée. Lancement bloqué » | le fichier du plugin a été remplacé après l'installation — réinstallez l'éditeur pour enregistrer une nouvelle empreinte |
| « L'éditeur n'a pas démarré à temps (pas de connect() en 10 s) » | le plugin n'a pas établi la connexion : erreur dans son code ou mauvais fichier compilé |
| « Impossible de charger le bundle de l'éditeur » | la version est indisponible ou le fichier est corrompu — réinstallez |
« Éditeur introuvable ou désactivé » en suivant le lien ?app=… |
le plugin a été supprimé ou désactivé sur la fiche |
| « Impossible de récupérer l'éditeur depuis GitHub » | le dépôt est privé, il n'y a pas de manifest.json à la racine, pas de dist/index.js dans le tag, ou le tag n'est pas nommé selon la convention v{версия} |
| « Seules les adresses localhost / 127.0.0.1 sont acceptées » | le mode développeur ne prend volontairement pas les adresses externes — lancez la compilation en local |
| Le plugin ne voit pas les données nécessaires | vérifiez les « Droits » sur la fiche ; chez un développeur disposant d'une autorisation, les droits sont en plus réduits par l'intersection avec l'autorisation |
| Le plugin ne peut pas accéder à un service tiers | il n'y a pas d'accès réseau direct depuis le bac à sable : l'accès se fait par la partie serveur, et l'adresse doit figurer dans le manifeste |
| « L'éditeur signale des modifications non enregistrées. Fermer quand même ? » | le plugin a lui-même signalé un brouillon — enregistrez votre travail dans le plugin avant de fermer |
Questions fréquentes#
Faut-il savoir programmer ?#
Pour installer une version prête — non. Pour obtenir cette version — oui : elle est écrite par un développeur ou un agent IA selon notre modèle du bloc « Développement avec l'IA ». La section est un outil pour le code, pas un constructeur « à la souris ».
Un plugin tiers peut-il voir mes clients ou mon chiffre d'affaires ?#
Non. Le plugin fonctionne dans un bac à sable et ne reçoit des données que via le pont, et le pont sait exactement six choses : le catalogue, les prix et les stop-lists, le référentiel du stock, son propre stockage, l'appel de sa propre partie serveur et les éléments d'interface. Les clients, les commandes, les reçus, les finances, les employés et les conversations n'y sont pas par principe. Ce qui est précisément autorisé pour un plugin donné est toujours visible sur sa fiche, à la ligne « Droits ».
Comment confier le développement à un prestataire sans lui ouvrir tout le compte ?#
Créez-lui un compte employé, puis accordez une autorisation dans le bloc « Accès développeur » : cochez uniquement les droits nécessaires et fixez une durée (14 jours par défaut, 90 au maximum). Il obtiendra le mode développeur et rien de plus ; l'installation du plugin restera de toute façon à votre charge. L'autorisation se révoque d'un seul bouton.
Le plugin se mettra-t-il à jour tout seul quand l'auteur publiera une nouvelle version ?#
Non. La mise à jour est lancée par le propriétaire : « Vérifier les mises à jour » → « Mettre à jour vers … ». Ainsi, une nouvelle version n'apparaît pas dans le compte à l'insu d'une personne — les droits demandés peuvent avoir changé en même temps que la version.
Où le plugin stocke-t-il ses réglages et ses données ?#
Dans votre compte, dans un stockage distinct sous son identifiant (jusqu'à 1 Mo par clé), et, s'il les utilise, dans les champs personnalisés de vos fiches — chaque plugin ne voit que son propre espace. Pour un compte sur cenaly.ru, la partie serveur et son état restent dans le contour russe.
En quoi est-ce différent de l'API et de MCP ?#
L'API pour développeurs et MCP de votre standard téléphonique servent quand le programme travaille à l'extérieur : votre site, un système tiers, un agent IA. L'éditeur personnalisé, au contraire, est une interface à l'intérieur du panneau : l'employé l'ouvre comme une page ordinaire de l'administration et ne quitte pas sa fenêtre de travail.
Sections liées#
- Boutique d'applications — où la section et les extensions intégrées s'activent
- Stock — l'onglet où vivent les extensions comme « VetIS », et le référentiel des articles
- Import du catalogue — le chemin standard de chargement des articles, si la tâche se limite à cela
- Vitrine sur votre propre code (headless) — le contrat de données ouvert pour un site externe
- API et MCP de votre standard téléphonique et Guest API pour les agents IA — le travail à l'extérieur, pas à l'intérieur du panneau
- Employés et créneaux — compte pour le développeur et rôles
- Sécurité et données — où sont stockées les données et qui y a accès
- Assistance — où écrire si le plugin se comporte de manière suspecte