Assim que seu plugin sandbox funcionar, você pode publicá-lo no marketplace EmDash para que outros sites possam instalá-lo com um clique no painel administrativo. O fluxo de publicação é exclusivo para sandbox — plugins nativos são distribuídos via npm e não são empacotados em tarballs do marketplace.
Pré-requisitos
Antes de publicar, certifique-se de que seu plugin:
- Possui um
package.jsoncom uma exportação"."(o descritor) e uma exportação"./sandbox"(a entrada do runtime). - Usa
format: "standard"no descritor. - Possui um
idúnico e umaversionsemver válida. - Declara suas
capabilitieseallowedHostscom precisão no descritor.
Formato do pacote
Plugins publicados são distribuídos como tarballs .tar.gz contendo:
| Arquivo | Obrigatório | Descrição |
|---|---|---|
manifest.json | Sim | Metadados do plugin extraídos do descritor e entrada sandbox |
backend.js | Sim | Código sandbox empacotado (módulo ES autocontido) |
admin.js | Não | Código UI admin empacotado (apenas se interações Block Kit fornecem JS) |
README.md | Não | Documentação do plugin |
icon.png | Não | Ícone do plugin (PNG 256×256) |
screenshots/ | Não | Até 5 capturas de tela (PNG/JPEG, máx. 1920×1080) |
manifest.json é gerado automaticamente. Contém o id do plugin, versão, capabilities, hosts permitidos, nomes de hooks, nomes de rotas e configuração admin — mas nenhum código executável.
Construir um pacote
cd packages/plugins/my-plugin
emdash plugin bundle
Isso irá:
- Ler seu
package.jsonpara encontrar pontos de entrada. - Construir a entrada do descritor para extrair id, versão, capabilities e configuração admin.
- Empacotar
backend.jsda exportação"./sandbox"— minificado, tree-shaken, totalmente autocontido. - Empacotar
admin.jsse existir uma exportação"./admin". - Coletar assets (README, ícone, capturas de tela).
- Validar o pacote (limites de tamanho, sem built-ins do Node.js em
backend.js, verificações de capabilities). - Escrever
{id}-{version}.tar.gzemdist/.
Resolução de pontos de entrada
O comando bundle encontra seu código através das exportações do package.json:
{
"exports": {
".": { "import": "./dist/index.mjs" },
"./sandbox": { "import": "./dist/sandbox-entry.mjs" },
"./admin": { "import": "./dist/admin.mjs" }
}
}
| Exportação | Propósito | Construído como |
|---|---|---|
"." | Descritor — usado para extrair o manifest | Externals: emdash, @emdash-cms/* |
"./sandbox" | Código runtime (hooks, routes) executado no sandbox | Totalmente autocontido (sem externals) |
"./admin" | Componentes UI admin (apenas se você os fornecer) | Totalmente autocontido |
Se "./sandbox" estiver faltando, o comando procura por src/sandbox-entry.ts como alternativa. O empacotador mapeia caminhos dist de volta para a fonte automaticamente — se sua exportação "." aponta para ./dist/index.mjs, ele encontrará e construirá src/index.ts.
Opções
emdash plugin bundle [--dir <path>] [--outDir <path>]
| Flag | Padrão | Descrição |
|---|---|---|
--dir | Diretório atual | Diretório fonte do plugin |
--outDir, -o | dist | Diretório de saída para o tarball |
Validação
O comando bundle verifica:
- Limite de tamanho — o pacote total deve ter menos de 5 MB.
- Sem built-ins do Node.js em
backend.js— código sandbox não pode importarfs,path,child_process, etc. Substitua-os por Web APIs ou mova a lógica para um plugin nativo. - Lista branca de capabilities — capabilities declaradas devem estar no conjunto conhecido (erros de digitação falham).
- Nomes de capability obsoletos acionam avisos aqui e uma falha definitiva no momento da publicação.
network:requestsemallowedHostsaciona um aviso (considerenetwork:request:unrestrictedse os hosts forem configurados pelo operador em runtime, ou liste os hosts explicitamente).- Dimensões do ícone —
icon.pngdeve ser 256×256 (avisa se estiver errado; ainda assim o inclui). - Limites de capturas de tela — máximo de 5 capturas de tela, máximo de 1920×1080.
Publicação
emdash plugin publish
Isso encontra o .tar.gz mais recente em dist/ e o carrega. Para ser explícito sobre o tarball ou para construir antes de publicar:
# Caminho de tarball explícito
emdash plugin publish --tarball dist/my-plugin-1.0.0.tar.gz
# Construir primeiro, depois publicar
emdash plugin publish --build
Autenticação
Na primeira vez que você publicar, a CLI o autentica via GitHub:
- A CLI abre a página de autorização de dispositivo do GitHub em seu navegador.
- Você insere o código exibido em seu terminal.
- O GitHub emite um token de acesso.
- A CLI o troca por um JWT do marketplace (armazenado em
~/.config/emdash/auth.json).
O token dura 30 dias. Após expirar, você será solicitado a autenticar novamente na próxima publicação.
Você pode gerenciar a autenticação separadamente:
emdash plugin login # fazer login sem publicar
emdash plugin logout # limpar token armazenado
Registro inicial
Se o id do seu plugin ainda não for conhecido pelo marketplace, emdash plugin publish o registra automaticamente antes de carregar a primeira versão.
Requisitos de versão
Cada versão publicada deve ter uma semver mais alta que a última. Você não pode sobrescrever ou republicar uma versão existente — aumente a versão em package.json e no descritor antes de publicar novamente.
Auditoria de segurança
Cada versão publicada passa por uma auditoria de segurança automatizada. A auditoria verifica backend.js e admin.js em busca de:
- Padrões de exfiltração de dados
- Coleta de credenciais via configurações
- Código ofuscado
- Abuso de recursos (mineração de criptomoedas, etc.)
- Atividade de rede suspeita
A auditoria produz um veredicto de pass, warn ou fail, exibido na listagem do marketplace do plugin. Dependendo do nível de aplicação do marketplace, um veredicto de fail pode bloquear completamente a publicação.
Opções
emdash plugin publish [--tarball <path>] [--build] [--dir <path>] [--registry <url>]
| Flag | Padrão | Descrição |
|---|---|---|
--tarball | Último .tar.gz em dist/ | Caminho de tarball explícito |
--build | false | Executar emdash plugin bundle antes de publicar |
--dir | Diretório atual | Diretório do plugin (usado com --build) |
--registry | https://marketplace.emdashcms.com | URL do marketplace |
Fluxo completo
Ciclo de publicação típico:
# 1. Faça suas alterações
# 2. Aumente a versão em src/index.ts e package.json
# 3. Empacote e publique
emdash plugin publish --build
Se você quiser inspecionar o pacote primeiro:
emdash plugin bundle
tar tzf dist/my-plugin-1.1.0.tar.gz
emdash plugin publish