El CLI de EmDash proporciona comandos para gestionar una instancia de EmDash CMS — configuración de base de datos, generación de tipos, CRUD de contenido, gestión de esquemas, medios y más.
Instalación
El CLI está incluido con el paquete emdash. Instálalo con el siguiente comando:
npm install emdash
Ejecuta comandos con npx emdash o añade scripts a package.json. El binario también está disponible como em por brevedad.
Autenticación
Los comandos que usan el cliente remoto compartido resuelven la autenticación en este orden:
- Flag
--token— token explícito en la línea de comandos - Variable de entorno
EMDASH_TOKEN - Credenciales almacenadas de
~/.config/emdash/auth.json(guardadas poremdash login) - Bypass de desarrollo — si la URL es localhost y no hay token disponible, se autentica automáticamente vía el endpoint de bypass de desarrollo
Estos comandos aceptan flags --url (de EMDASH_URL, con fallback a http://localhost:4321) y --token. Los comandos de autenticación tienen sus propias opciones de conexión. Al apuntar a un servidor de desarrollo local, no se necesita token.
Flags comunes
Estos flags están disponibles en comandos que usan el cliente remoto compartido:
| Flag | Alias | Descripción | Por defecto |
|---|---|---|---|
--url | -u | URL de la instancia EmDash | EMDASH_URL o http://localhost:4321 |
--token | -t | Token de autenticación | De env/credenciales almacenadas |
--header "Name: Value" | -H | Header de solicitud personalizado; repetible | De EMDASH_HEADERS/credenciales almacenadas |
--json | Salida como JSON (para piping) | Auto-detectado desde TTY |
Salida
Cuando stdout es un TTY, el CLI imprime resultados formateados con consola. Cuando se hace pipe o cuando --json está establecido, produce JSON crudo a stdout — adecuado para jq u otras herramientas.
Comandos
emdash dev
Inicia el servidor de desarrollo con configuración automática de base de datos.
npx emdash dev [options]
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--database | -d | Ruta del archivo de base de datos | ./data.db |
--types | -t | Generar tipos desde remoto antes de iniciar | false |
--port | -p | Puerto del servidor de desarrollo | 4321 |
--cwd | Directorio de trabajo | Directorio actual |
Ejemplos
# Iniciar servidor de desarrollo
npx emdash dev
# Puerto personalizado
npx emdash dev --port 3000
# Generar tipos desde remoto antes de iniciar
npx emdash dev --types
Comportamiento
- Verifica y ejecuta migraciones de base de datos pendientes
- Si
--typesestá establecido, genera tipos TypeScript desde una instancia remota (URL de la variableEMDASH_URLoemdash.urlenpackage.json) - Inicia el servidor de desarrollo Astro con
EMDASH_DATABASE_URLestablecido
emdash types
Genera tipos TypeScript desde el esquema de una instancia EmDash en ejecución.
npx emdash types [options]
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--url | -u | URL de la instancia EmDash | http://localhost:4321 |
--token | -t | Token de autenticación | De env/credenciales almacenadas |
--output | -o | Ruta de salida para tipos | .emdash/types.ts |
--cwd | Directorio de trabajo | Directorio actual |
Ejemplos
# Generar tipos desde servidor local
npx emdash types
# Generar desde instancia remota
npx emdash types --url https://my-site.pages.dev
# Ruta de salida personalizada
npx emdash types --output src/types/emdash.ts
Comportamiento
- Obtiene el esquema de la instancia
- Genera definiciones de tipos TypeScript
- Escribe los tipos en el archivo de salida
- Escribe un
schema.jsonjunto para referencia
emdash login
Inicia sesión en una instancia EmDash usando OAuth Device Flow.
npx emdash login [options]
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--url | -u | URL de la instancia EmDash | http://localhost:4321 |
Comportamiento
- Descubre endpoints de autenticación de la instancia
- Si es localhost y no hay auth configurada, usa bypass de desarrollo automáticamente
- De lo contrario inicia OAuth Device Flow — muestra un código y abre tu navegador
- Sondea la autorización, luego guarda credenciales en
~/.config/emdash/auth.json
Las credenciales guardadas se usan automáticamente por todos los comandos posteriores dirigidos a la misma instancia.
emdash logout
Cerrar sesión y eliminar credenciales almacenadas.
npx emdash logout [options]
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--url | -u | URL de la instancia EmDash | http://localhost:4321 |
emdash whoami
Muestra el usuario autenticado actual.
npx emdash whoami [options]
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--url | -u | URL de la instancia EmDash | http://localhost:4321 |
--token | -t | Token de autenticación | De env/credenciales almacenadas |
--json | Salida como JSON |
Muestra email, nombre, rol, método de autenticación y URL de la instancia.
emdash content
Gestionar elementos de contenido. Todos los subcomandos usan la API remota vía EmDashClient.
content list <collection>
npx emdash content list posts
npx emdash content list posts --status published --limit 10
| Opción | Descripción |
|---|---|
--status | Filtrar por estado |
--limit | Máximo de elementos |
--cursor | Cursor de paginación |
content get <collection> <id>
npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
| Opción | Descripción |
|---|---|
--raw | Devolver Portable Text crudo (omitir conversión markdown) |
La respuesta incluye un token _rev. Pásalo a content update para confirmar que has visto el estado actual antes de sobrescribir.
content create <collection>
npx emdash content create posts --data '{"title": "Hello"}'
npx emdash content create posts --file post.json --slug hello-world
cat post.json | npx emdash content create posts --stdin
| Opción | Descripción |
|---|---|
--data | Cadena JSON con datos de contenido |
--file | Leer datos de un archivo JSON |
--stdin | Leer datos de stdin |
--slug | Slug del contenido |
--locale | Locale del contenido |
--translation-of | ID de un elemento de contenido para vincular como traducción |
--draft | Mantener como borrador en lugar de auto-publicar |
Proporciona datos mediante exactamente una de --data, --file o --stdin. Los nuevos elementos se auto-publican a menos que --draft esté establecido.
content update <collection> <id>
Debes proporcionar el token _rev de un get previo para probar que has visto el estado actual. Esto evita sobrescribir cambios que no has visto. Los siguientes pasos leen un elemento y luego lo actualizan con ese token:
# 1. Leer el elemento, anotar el _rev
npx emdash content get posts 01ABC123
# 2. Actualizar con el _rev del paso 1
npx emdash content update posts 01ABC123 \
--rev MToyMDI2LTAyLTE0... \
--data '{"title": "Actualizado"}'
| Opción | Descripción |
|---|---|
--rev | Token de revisión de get (requerido) |
--data | Cadena JSON con datos de contenido |
--file | Leer datos de un archivo JSON |
Si el elemento ha cambiado desde tu get, el servidor devuelve 409 Conflict — vuelve a leer e intenta de nuevo.
content delete <collection> <id>
npx emdash content delete posts 01ABC123
Eliminación suave del elemento de contenido (mueve a la papelera).
content publish <collection> <id>
npx emdash content publish posts 01ABC123
content unpublish <collection> <id>
npx emdash content unpublish posts 01ABC123
content schedule <collection> <id>
npx emdash content schedule posts 01ABC123 --at 2026-03-01T09:00:00Z
| Opción | Descripción |
|---|---|
--at | Fecha y hora ISO 8601 (requerido) |
content restore <collection> <id>
npx emdash content restore posts 01ABC123
Restaura un elemento de contenido eliminado.
emdash schema
Gestionar colecciones y campos.
schema list
npx emdash schema list
Lista todas las colecciones.
schema get <collection>
npx emdash schema get posts
Muestra una colección con todos sus campos.
schema create <collection>
npx emdash schema create articles --label Articles
npx emdash schema create articles --label Articles --label-singular Article --description "Artículos del blog"
| Opción | Descripción |
|---|---|
--label | Etiqueta de colección (requerido) |
--label-singular | Etiqueta singular |
--description | Descripción de la colección |
schema delete <collection>
npx emdash schema delete articles
npx emdash schema delete articles --force
| Opción | Descripción |
|---|---|
--force | Omitir confirmación |
Solicita confirmación a menos que --force esté establecido.
schema add-field <collection> <field>
npx emdash schema add-field posts body --type portableText --label "Contenido del cuerpo"
npx emdash schema add-field posts featured --type boolean --required
| Opción | Descripción |
|---|---|
--type | Tipo de campo: string, text, number, integer, boolean, datetime, image, reference, portableText, json (requerido) |
--label | Etiqueta del campo (por defecto el slug del campo) |
--required | Si el campo es requerido |
schema remove-field <collection> <field>
npx emdash schema remove-field posts featured
emdash media
Gestionar elementos de medios.
media list
npx emdash media list
npx emdash media list --mime image/png --limit 20
| Opción | Descripción |
|---|---|
--mime | Filtrar por tipo MIME |
--limit | Número de elementos |
--cursor | Cursor de paginación |
media upload <file>
npx emdash media upload ./photo.jpg
npx emdash media upload ./photo.jpg --alt "Un atardecer" --caption "Tomada en Bristol"
| Opción | Descripción |
|---|---|
--alt | Texto alternativo |
--caption | Texto de pie |
media get <id>
npx emdash media get 01MEDIA123
media delete <id>
npx emdash media delete 01MEDIA123
media repair-usage
Reparar índices de uso de medios de contenido para una colección o para todas las colecciones de contenido. Usa esto después de importaciones o escrituras directas a la base de datos cuando la cobertura de uso es obsoleta o no confiable.
npx emdash media repair-usage --collection posts
npx emdash media repair-usage --all
npx emdash media repair-usage --all --json
| Opción | Alias | Descripción |
|---|---|---|
--collection | -c | Reparar una colección de contenido |
--all | Reparar todas las colecciones de contenido |
Pasa exactamente una de --collection o --all. La reparación remota requiere un usuario Admin y un token de autenticación con el scope admin.
La reparación de todo el contenido se ejecuta sincrónicamente y puede ser lenta o costosa en sitios grandes. Prefiere --collection cuando solo necesitas reparar una colección.
Los resultados de reparación estructurados complete, partial y stale salen con 0; los resultados failed estructurados salen con 1. La automatización y los trabajos cron deberían usar --json y parsear status, failedSourceCount, skippedSourceCount y resúmenes por colección en lugar de tratar exit 0 como cobertura completa.
emdash search
Búsqueda de texto completo a través del contenido.
npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
| Opción | Alias | Descripción |
|---|---|---|
--collection | -c | Filtrar por colección |
--limit | -l | Máximo de resultados |
emdash taxonomy
Gestionar taxonomías y términos.
taxonomy list
npx emdash taxonomy list
taxonomy terms <name>
npx emdash taxonomy terms categories
npx emdash taxonomy terms tags --limit 50
| Opción | Alias | Descripción |
|---|---|---|
--limit | -l | Máximo de términos |
--cursor | Cursor de paginación |
taxonomy add-term <taxonomy>
npx emdash taxonomy add-term categories --name "Tech" --slug tech
npx emdash taxonomy add-term categories --name "Frontend" --parent 01PARENT123
| Opción | Descripción |
|---|---|
--name | Etiqueta del término (requerido) |
--slug | Slug del término (por defecto el nombre slugificado) |
--parent | ID del término padre (para taxonomías jerárquicas) |
emdash menu
Gestionar menús de navegación.
menu list
npx emdash menu list
menu get <name>
npx emdash menu get primary
Devuelve el menú con todos sus elementos.
emdash export-seed
Exportar esquema de base de datos y contenido como archivo semilla. Trabaja directamente con un archivo SQLite local.
npx emdash export-seed [options] > seed.json
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--database | -d | Ruta del archivo de base de datos | ./data.db |
--cwd | Directorio de trabajo | Directorio actual | |
--with-content | Incluir contenido (todo o colecciones separadas por comas) | ||
--no-pretty | Desactivar formato JSON | false |
Formato de salida
El archivo semilla exportado incluye:
- Configuración: Título del sitio, eslogan, enlaces sociales
- Colecciones: Todas las definiciones de colecciones con campos
- Taxonomías: Definiciones de taxonomías y términos
- Menús: Menús de navegación con elementos
- Áreas de widgets: Áreas de widgets y widgets
- Contenido (si se solicita): Entradas con referencias
$mediay sintaxis$ref:para portabilidad
emdash secrets generate
Genera un EMDASH_ENCRYPTION_KEY para tu despliegue. La clave se usa para cifrar secretos de plugins en reposo.
npx emdash secrets generate
Imprime la nueva clave en stdout. Dirígela a tu almacén de secretos, o escríbela directamente en tu archivo .env local con --write. El mismo archivo .env es leído por Node y, en desarrollo local, por Wrangler y el plugin Vite de Cloudflare:
npx emdash secrets generate --write .env
--write se niega a sobrescribir una entrada existente sin --force. Reemplazar una clave en un despliegue con datos cifrados existentes dejará esos secretos ilegibles, por lo que la protección es intencional.
emdash secrets fingerprint <key>
Imprime la huella digital de 8 caracteres (kid) de una clave sin exponer su valor. Esto es útil en CI para verificar que se desplegó la clave correcta. El siguiente comando imprime la huella digital de una clave:
npx emdash secrets fingerprint emdash_enc_v1_...
Archivos generados
.emdash/types.ts
El comando emdash types genera interfaces TypeScript para cada colección:
// Generado por el CLI de EmDash
// No editar manualmente - ejecuta `emdash types` para regenerar
import type { PortableTextBlock } from "emdash";
export interface Post {
id: string;
title: string;
content: PortableTextBlock[];
publishedAt: Date | null;
}
.emdash/schema.json
El comando también escribe una exportación de esquema crudo para herramientas:
{
"version": "a1b2c3d4",
"collections": [
{
"slug": "posts",
"label": "Posts",
"fields": [...]
}
]
}
Variables de entorno
| Variable | Descripción |
|---|---|
EMDASH_DATABASE_URL | URL de base de datos (establecida automáticamente por dev) |
EMDASH_TOKEN | Token de autenticación para operaciones remotas |
EMDASH_URL | URL por defecto para comandos usando el cliente remoto compartido |
EMDASH_HEADERS | Headers de solicitud personalizados separados por líneas para el cliente remoto compartido y login |
EMDASH_ENCRYPTION_KEY | Clave para cifrar secretos de plugins en reposo. Proporcionada por el operador — nunca almacenada en la base de datos. Generar con emdash secrets generate. |
EMDASH_PREVIEW_SECRET | Anulación opcional para el secreto HMAC de vista previa. Cuando no está establecido, EmDash genera y persiste uno en la tabla de opciones. |
EMDASH_IP_SALT | Anulación opcional para el salt de hash de IP del comentarista. Cuando no está establecido, EmDash genera y persiste uno en la tabla de opciones. |
EMDASH_AUTH_SECRET | Obsoleto. Se usa como fuente de salt de IP si está establecido, para que las instalaciones existentes mantengan hashes de IP de comentaristas estables a través de actualizaciones. Las nuevas instalaciones no deberían establecer esto. |
Scripts de paquete
Añade los comandos del CLI como scripts de package.json por conveniencia:
{
"scripts": {
"dev": "emdash dev",
"types": "emdash types",
"export-seed": "emdash export-seed",
"db:reset": "rm -f data.db"
}
}
Códigos de salida
| Código | Descripción |
|---|---|
0 | Éxito |
1 | Error (configuración, red, base de datos) |