Une fois que votre plugin sandbox fonctionne, vous pouvez le publier sur le marketplace EmDash afin que d’autres sites puissent l’installer en un clic depuis le tableau de bord administrateur. Le flux de publication est réservé aux sandbox : les plugins natifs sont distribués via npm et ne sont pas empaquetés dans des tarballs du marketplace.
Prérequis
Avant de publier, assurez-vous que votre plugin :
- Possède un
package.jsonavec à la fois une exportation"."(le descripteur) et une exportation"./sandbox"(l’entrée runtime). - Utilise
format: "standard"sur le descripteur. - A un
idunique et uneversionsemver valide. - Déclare ses
capabilitiesetallowedHostsavec précision sur le descripteur.
Format du paquet
Les plugins publiés sont distribués sous forme de tarballs .tar.gz contenant :
| Fichier | Requis | Description |
|---|---|---|
manifest.json | Oui | Métadonnées du plugin extraites du descripteur et de l’entrée sandbox |
backend.js | Oui | Code sandbox empaqueté (module ES autonome) |
admin.js | Non | Code UI admin empaqueté (uniquement si les interactions Block Kit livrent du JS) |
README.md | Non | Documentation du plugin |
icon.png | Non | Icône du plugin (PNG 256×256) |
screenshots/ | Non | Jusqu’à 5 captures d’écran (PNG/JPEG, max 1920×1080) |
manifest.json est généré automatiquement. Il contient l’id du plugin, la version, les capabilities, les hôtes autorisés, les noms des hooks, les noms des routes et la configuration admin — mais aucun code exécutable.
Construire un paquet
cd packages/plugins/my-plugin
emdash plugin bundle
Cela va :
- Lire votre
package.jsonpour trouver les points d’entrée. - Construire l’entrée du descripteur pour extraire l’id, la version, les capabilities et la configuration admin.
- Empaqueter
backend.jsdepuis l’exportation"./sandbox"— minifié, tree-shaken, entièrement autonome. - Empaqueter
admin.jssi une exportation"./admin"existe. - Collecter les ressources (README, icône, captures d’écran).
- Valider le paquet (limites de taille, pas de built-ins Node.js dans
backend.js, vérifications des capabilities). - Écrire
{id}-{version}.tar.gzdansdist/.
Résolution des points d’entrée
La commande bundle trouve votre code via les exportations de package.json :
{
"exports": {
".": { "import": "./dist/index.mjs" },
"./sandbox": { "import": "./dist/sandbox-entry.mjs" },
"./admin": { "import": "./dist/admin.mjs" }
}
}
| Exportation | Objectif | Construit comme |
|---|---|---|
"." | Descripteur — utilisé pour extraire le manifest | Externals : emdash, @emdash-cms/* |
"./sandbox" | Code runtime (hooks, routes) exécuté dans le sandbox | Entièrement autonome (pas d’externals) |
"./admin" | Composants UI admin (uniquement si vous les livrez) | Entièrement autonome |
Si "./sandbox" est manquant, la commande recherche src/sandbox-entry.ts en repli. Le bundler mappe automatiquement les chemins dist vers la source — si votre exportation "." pointe vers ./dist/index.mjs, il trouvera et construira src/index.ts.
Options
emdash plugin bundle [--dir <path>] [--outDir <path>]
| Drapeau | Par défaut | Description |
|---|---|---|
--dir | Répertoire courant | Répertoire source du plugin |
--outDir, -o | dist | Répertoire de sortie pour le tarball |
Validation
La commande bundle vérifie :
- Limite de taille — le paquet total doit faire moins de 5 Mo.
- Pas de built-ins Node.js dans
backend.js— le code sandbox ne peut pas importerfs,path,child_process, etc. Remplacez-les par des Web APIs ou déplacez la logique vers un plugin natif. - Liste blanche des capabilities — les capabilities déclarées doivent être dans l’ensemble connu (les fautes de frappe échouent).
- Noms de capability obsolètes déclenchent des avertissements ici et un échec dur au moment de la publication.
network:requestsansallowedHostsdéclenche un avertissement (envisageznetwork:request:unrestrictedsi les hôtes sont configurés par l’opérateur au runtime, ou listez les hôtes explicitement).- Dimensions de l’icône —
icon.pngdevrait être 256×256 (avertit si incorrect ; l’inclut quand même). - Limites des captures d’écran — max 5 captures d’écran, max 1920×1080.
Publication
emdash plugin publish
Cela trouve le .tar.gz le plus récent dans dist/ et le télécharge. Pour être explicite sur le tarball ou pour construire avant de publier :
# Chemin de tarball explicite
emdash plugin publish --tarball dist/my-plugin-1.0.0.tar.gz
# Construire d'abord, puis publier
emdash plugin publish --build
Authentification
La première fois que vous publiez, la CLI vous authentifie via GitHub :
- La CLI ouvre la page d’autorisation de périphérique GitHub dans votre navigateur.
- Vous entrez le code affiché dans votre terminal.
- GitHub émet un jeton d’accès.
- La CLI l’échange contre un JWT marketplace (stocké dans
~/.config/emdash/auth.json).
Le jeton dure 30 jours. Après son expiration, vous serez invité à vous réauthentifier lors de la prochaine publication.
Vous pouvez gérer l’authentification séparément :
emdash plugin login # se connecter sans publier
emdash plugin logout # effacer le jeton stocké
Enregistrement initial
Si votre id de plugin n’est pas encore connu du marketplace, emdash plugin publish l’enregistre automatiquement avant de télécharger la première version.
Exigences de version
Chaque version publiée doit avoir une semver plus élevée que la dernière. Vous ne pouvez pas écraser ou republier une version existante — augmentez la version dans package.json et le descripteur avant de republier.
Audit de sécurité
Chaque version publiée passe par un audit de sécurité automatisé. L’audit analyse backend.js et admin.js pour :
- Modèles d’exfiltration de données
- Récupération de credentials via les paramètres
- Code obfusqué
- Abus de ressources (minage de crypto, etc.)
- Activité réseau suspecte
L’audit produit un verdict de pass, warn ou fail, affiché sur la liste du marketplace du plugin. Selon le niveau d’application du marketplace, un verdict de fail peut bloquer complètement la publication.
Options
emdash plugin publish [--tarball <path>] [--build] [--dir <path>] [--registry <url>]
| Drapeau | Par défaut | Description |
|---|---|---|
--tarball | Dernier .tar.gz dans dist/ | Chemin de tarball explicite |
--build | false | Exécuter emdash plugin bundle avant de publier |
--dir | Répertoire courant | Répertoire du plugin (utilisé avec --build) |
--registry | https://marketplace.emdashcms.com | URL du marketplace |
Workflow complet
Cycle de publication typique :
# 1. Faites vos modifications
# 2. Augmentez la version dans src/index.ts et package.json
# 3. Empaquetez et publiez
emdash plugin publish --build
Si vous voulez inspecter le paquet d’abord :
emdash plugin bundle
tar tzf dist/my-plugin-1.1.0.tar.gz
emdash plugin publish