La CLI de EmDash proporciona comandos para gestionar una instancia de EmDash CMS: configuración de la base de datos, generación de tipos, CRUD de contenido, gestión del esquema, medios y mucho más.
Instalación
La CLI se incluye con el paquete emdash:
npm install emdash
Ejecuta comandos con npx emdash o añade scripts a package.json. El binario también está disponible como em para mayor brevedad.
Autenticación
Los comandos que se comunican con una instancia de EmDash en ejecución (todos excepto init, seed, export-seed y auth secret) 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 en
~/.config/emdash/auth.json(guardadas poremdash login) - Bypass de desarrollo — si la URL es localhost y no hay token disponible, se autentica automáticamente mediante el endpoint de bypass de desarrollo
La mayoría de los comandos aceptan los flags --url (por defecto http://localhost:4321) y --token. Al apuntar a un servidor de desarrollo local, no se necesita token.
Flags comunes
Estos flags están disponibles en todos los comandos remotos:
| Flag | Alias | Descripción | Por defecto |
|---|---|---|---|
--url | -u | URL de la instancia EmDash | http://localhost:4321 |
--token | -t | Token de autenticación | Desde env/credenciales |
--json | Salida en JSON (para tuberías) | Autodetectado desde TTY |
Salida
Cuando stdout es un TTY, la CLI muestra los resultados con formato legible mediante consola. Cuando se redirige o se establece --json, produce JSON sin formato en stdout, adecuado para jq u otras herramientas.
Comandos
emdash init
Inicializa la base de datos con el esquema principal y datos de plantilla opcionales.
npx emdash init [options]
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--database | -d | Ruta del archivo de BD | ./data.db |
--cwd | Directorio de trabajo | Directorio actual | |
--force | -f | Reejecutar esquema y seed | false |
Comportamiento
- Lee la configuración
emdashdepackage.json - Crea el archivo de base de datos si es necesario
- Ejecuta las migraciones principales (crea tablas de sistema)
- Ejecuta
schema.sqlde la plantilla si está configurado - Ejecuta
seed.sqlde la plantilla si está configurado
emdash dev
Inicia el servidor de desarrollo con configuración automática de la base de datos.
npx emdash dev [options]
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--database | -d | Ruta del archivo de BD | ./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
- Comprueba y ejecuta migraciones de base de datos pendientes
- Si se establece
--types, genera tipos TypeScript desde una instancia remota (URL deEMDASH_URLoemdash.urlenpackage.json) - Inicia el servidor de desarrollo de Astro con
EMDASH_DATABASE_URLconfigurado
emdash types
Genera tipos TypeScript desde el esquema de una instancia de 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 | Desde env/credenciales |
--output | -o | Ruta de salida para los tipos | .emdash/types.ts |
--cwd | Directorio de trabajo | Directorio actual |
Ejemplos
# Generar tipos desde servidor de desarrollo 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
schema.jsonjunto al archivo como referencia
emdash login
Inicia sesión en una instancia de 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 los endpoints de autenticación de la instancia
- Si es localhost y no hay autenticación configurada, usa el bypass de desarrollo automáticamente
- En caso contrario, inicia OAuth Device Flow: muestra un código y abre el navegador
- Espera la autorización y guarda las credenciales en
~/.config/emdash/auth.json
Las credenciales guardadas se usan automáticamente en todos los comandos posteriores dirigidos a la misma instancia.
emdash logout
Cierra sesión y elimina las 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 | Desde env/credenciales |
--json | Salida en JSON |
Muestra correo, nombre, rol, método de autenticación y URL de la instancia.
emdash content
Gestiona elementos de contenido. Todos los subcomandos usan la API remota mediante 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 sin convertir (omitir conversión a markdown) |
La respuesta incluye un token _rev: pásalo a content update para demostrar que has visto lo que estás sobrescribiendo.
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 desde un archivo JSON |
--stdin | Leer datos desde stdin |
--slug | Slug del contenido |
--status | Estado inicial (draft, published) |
Proporciona datos mediante exactamente una de las opciones: --data, --file o --stdin.
content update <collection> <id>
Como un editor de archivos que requiere leer antes de escribir: debes proporcionar el token _rev de un get previo para demostrar que has visto el estado actual. Esto evita sobrescribir accidentalmente cambios que no has visto.
# 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": "Updated"}'
| Opción | Descripción |
|---|---|
--rev | Token de revisión de get (obligatorio) |
--data | Cadena JSON con datos de contenido |
--file | Leer datos desde un archivo JSON |
Si el elemento ha cambiado desde tu get, el servidor devuelve 409 Conflict: vuelve a leer e inténtalo de nuevo.
content delete <collection> <id>
npx emdash content delete posts 01ABC123
Hace borrado lógico 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 (obligatorio) |
content restore <collection> <id>
npx emdash content restore posts 01ABC123
Restaura un elemento de contenido de la papelera.
emdash schema
Gestiona 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 "Blog articles"
| Opción | Descripción |
|---|---|
--label | Etiqueta de la colección (obligatorio) |
--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 |
Pide confirmación a menos que se establezca --force.
schema add-field <collection> <field>
npx emdash schema add-field posts body --type portableText --label "Body Content"
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 (obligatorio) |
--label | Etiqueta del campo (por defecto, el slug del campo) |
--required | Si el campo es obligatorio |
schema remove-field <collection> <field>
npx emdash schema remove-field posts featured
emdash media
Gestiona elementos multimedia.
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 | Pie de foto |
media get <id>
npx emdash media get 01MEDIA123
media delete <id>
npx emdash media delete 01MEDIA123
emdash search
Búsqueda de texto completo en el 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
Gestiona 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 (obligatorio) |
--slug | Slug del término (por defecto, nombre slugificado) |
--parent | ID del término padre (para taxonomías jerárquicas) |
emdash menu
Gestiona 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 seed
Aplica un archivo seed a la base de datos. Este comando trabaja directamente sobre un archivo SQLite local (no necesita servidor en ejecución).
npx emdash seed [path] [options]
Argumentos
| Argumento | Descripción | Por defecto |
|---|---|---|
path | Ruta al archivo seed | .emdash/seed.json |
Opciones
| Opción | Alias | Descripción | Por defecto |
|---|---|---|---|
--database | -d | Ruta del archivo de BD | ./data.db |
--cwd | Directorio de trabajo | Directorio actual | |
--validate | Solo validar, no aplicar | false | |
--no-content | Omitir contenido de ejemplo | false | |
--on-conflict | Manejo de conflictos: skip, update, error | skip | |
--uploads-dir | Directorio para subidas multimedia | .emdash/uploads | |
--media-base-url | URL base para archivos multimedia | /_emdash/api/media/file | |
--base-url | URL base del sitio (para URLs absolutas de medios) |
Resolución del archivo seed
El comando busca archivos seed en este orden:
- Argumento posicional (si se proporciona)
.emdash/seed.json(convención)- Ruta del campo
emdash.seedenpackage.json
emdash export-seed
Exporta el esquema y el contenido de la base de datos como archivo seed. Trabaja directamente sobre 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 BD | ./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 seed exportado incluye:
- Settings: Título del sitio, eslogan, enlaces sociales
- Collections: Todas las definiciones de colecciones con campos
- Taxonomies: Definiciones de taxonomías y términos
- Menus: Menús de navegación con elementos
- Widget Areas: Áreas de widgets y widgets
- Content (si se solicita): Entradas con referencias
$mediay sintaxis$ref:para portabilidad
emdash auth secret
Genera un secreto de autenticación seguro para tu despliegue.
npx emdash auth secret
Produce un secreto aleatorio adecuado para EMDASH_AUTH_SECRET.
Archivos generados
.emdash/types.ts
Interfaces TypeScript generadas por emdash types:
// Generated by EmDash CLI
// Do not edit manually - run `emdash types` to regenerate
import type { PortableTextBlock } from "emdash";
export interface Post {
id: string;
title: string;
content: PortableTextBlock[];
publishedAt: Date | null;
}
.emdash/schema.json
Exportación del esquema sin formato para herramientas:
{
"version": "a1b2c3d4",
"collections": [
{
"slug": "posts",
"label": "Posts",
"fields": [...]
}
]
}
Variables de entorno
| Variable | Descripción |
|---|---|
EMDASH_DATABASE_URL | URL de la base de datos (configurada automáticamente por dev) |
EMDASH_TOKEN | Token de autenticación para operaciones remotas |
EMDASH_URL | URL remota por defecto para types y dev --types |
EMDASH_AUTH_SECRET | Secreto para autenticación con passkey |
EMDASH_PREVIEW_SECRET | Secreto para generación de tokens de vista previa |
Scripts de package
{
"scripts": {
"dev": "emdash dev",
"init": "emdash init",
"types": "emdash types",
"seed": "emdash seed",
"export-seed": "emdash export-seed",
"db:reset": "rm -f data.db && emdash init"
}
}
Códigos de salida
| Código | Descripción |
|---|---|
0 | Éxito |
1 | Error (configuración, red, base de datos) |