La CLI di EmDash fornisce comandi per la gestione di un’istanza EmDash CMS — configurazione del database, generazione dei tipi, CRUD dei contenuti, gestione dello schema, media e altro.
Installazione
La CLI è inclusa nel pacchetto emdash:
npm install emdash
Esegui i comandi con npx emdash o aggiungi script a package.json. Il binario è disponibile anche come em per brevità.
Autenticazione
I comandi che comunicano con un’istanza EmDash in esecuzione (tutto tranne init, seed, export-seed e auth secret) risolvono l’autenticazione in questo ordine:
- Flag
--token— token esplicito sulla riga di comando - Variabile d’ambiente
EMDASH_TOKEN - Credenziali salvate da
~/.config/emdash/auth.json(salvate daemdash login) - Bypass dev — se l’URL è localhost e nessun token è disponibile, si autentica automaticamente tramite l’endpoint di bypass dev
La maggior parte dei comandi accetta i flag --url (predefinito http://localhost:4321) e --token. Quando si lavora con un server di sviluppo locale, non è necessario alcun token.
Flag comuni
Questi flag sono disponibili su tutti i comandi remoti:
| Flag | Alias | Descrizione | Predefinito |
|---|---|---|---|
--url | -u | URL dell’istanza EmDash | http://localhost:4321 |
--token | -t | Token di autenticazione | Da env/credenziali salvate |
--json | Output in JSON (per piping) | Rilevato automaticamente dal TTY |
Output
Quando stdout è un TTY, la CLI formatta i risultati con consola. Quando viene reindirizzato o quando --json è impostato, restituisce JSON grezzo su stdout — adatto per jq o altri strumenti.
Comandi
emdash init
Inizializza il database con lo schema core e dati template opzionali.
npx emdash init [options]
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--database | -d | Percorso file database | ./data.db |
--cwd | Directory di lavoro | Directory corrente | |
--force | -f | Riesegui schema e seed | false |
Comportamento
- Legge la configurazione
emdashdapackage.json - Crea il file database se necessario
- Esegue le migrazioni core (crea le tabelle di sistema)
- Esegue il template
schema.sqlse configurato - Esegue il template
seed.sqlse configurato
emdash dev
Avvia il server di sviluppo con configurazione automatica del database.
npx emdash dev [options]
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--database | -d | Percorso file database | ./data.db |
--types | -t | Genera i tipi dal remoto prima dell’avvio | false |
--port | -p | Porta del server di sviluppo | 4321 |
--cwd | Directory di lavoro | Directory corrente |
Esempi
# Start dev server
npx emdash dev
# Custom port
npx emdash dev --port 3000
# Generate types from remote before starting
npx emdash dev --types
Comportamento
- Controlla ed esegue le migrazioni del database in sospeso
- Se
--typesè impostato, genera i tipi TypeScript da un’istanza remota (URL daEMDASH_URLenv oemdash.urlinpackage.json) - Avvia il server dev Astro con
EMDASH_DATABASE_URLimpostato
emdash types
Genera tipi TypeScript dallo schema di un’istanza EmDash in esecuzione.
npx emdash types [options]
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--url | -u | URL dell’istanza EmDash | http://localhost:4321 |
--token | -t | Token di autenticazione | Da env/credenziali salvate |
--output | -o | Percorso output per i tipi | .emdash/types.ts |
--cwd | Directory di lavoro | Directory corrente |
Esempi
# Generate types from local dev server
npx emdash types
# Generate from remote instance
npx emdash types --url https://my-site.pages.dev
# Custom output path
npx emdash types --output src/types/emdash.ts
Comportamento
- Recupera lo schema dall’istanza
- Genera le definizioni dei tipi TypeScript
- Scrive i tipi nel file di output
- Scrive
schema.jsona fianco come riferimento
emdash login
Accedi a un’istanza EmDash usando il flusso OAuth Device Flow.
npx emdash login [options]
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--url | -u | URL dell’istanza EmDash | http://localhost:4321 |
Comportamento
- Scopre gli endpoint di autenticazione dall’istanza
- Se è localhost e nessuna autenticazione è configurata, usa automaticamente il bypass dev
- Altrimenti avvia il flusso OAuth Device Flow — mostra un codice e apre il browser
- Esegue il polling per l’autorizzazione, poi salva le credenziali in
~/.config/emdash/auth.json
Le credenziali salvate vengono utilizzate automaticamente da tutti i comandi successivi che puntano alla stessa istanza.
emdash logout
Disconnettiti e rimuovi le credenziali salvate.
npx emdash logout [options]
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--url | -u | URL dell’istanza EmDash | http://localhost:4321 |
emdash whoami
Mostra l’utente attualmente autenticato.
npx emdash whoami [options]
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--url | -u | URL dell’istanza EmDash | http://localhost:4321 |
--token | -t | Token di autenticazione | Da env/credenziali salvate |
--json | Output in JSON |
Mostra email, nome, ruolo, metodo di autenticazione e URL dell’istanza.
emdash content
Gestisci gli elementi di contenuto. Tutti i sottocomandi usano l’API remota tramite EmDashClient.
content list <collection>
npx emdash content list posts
npx emdash content list posts --status published --limit 10
| Opzione | Descrizione |
|---|---|
--status | Filtra per stato |
--limit | Numero massimo di elementi |
--cursor | Cursore di paginazione |
content get <collection> <id>
npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
| Opzione | Descrizione |
|---|---|
--raw | Restituisce Portable Text grezzo (salta la conversione markdown) |
La risposta include un token _rev — passalo a content update per dimostrare che hai visto ciò che stai sovrascrivendo.
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
| Opzione | Descrizione |
|---|---|
--data | Stringa JSON con i dati del contenuto |
--file | Leggi i dati da un file JSON |
--stdin | Leggi i dati dallo stdin |
--slug | Slug del contenuto |
--status | Stato iniziale (draft, published) |
Fornisci i dati tramite esattamente uno tra --data, --file o --stdin.
content update <collection> <id>
Come un editor di file che richiede di leggere prima di scrivere — devi fornire il token _rev da un precedente get per dimostrare che hai visto lo stato corrente. Questo previene la sovrascrittura accidentale di modifiche che non hai visto.
# 1. Read the item, note the _rev
npx emdash content get posts 01ABC123
# 2. Update with the _rev from step 1
npx emdash content update posts 01ABC123 \
--rev MToyMDI2LTAyLTE0... \
--data '{"title": "Updated"}'
| Opzione | Descrizione |
|---|---|
--rev | Token di revisione da get (obbligatorio) |
--data | Stringa JSON con i dati del contenuto |
--file | Leggi i dati da un file JSON |
Se l’elemento è cambiato dal tuo get, il server restituisce 409 Conflict — rileggi e riprova.
content delete <collection> <id>
npx emdash content delete posts 01ABC123
Elimina temporaneamente l’elemento di contenuto (sposta nel cestino).
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
| Opzione | Descrizione |
|---|---|
--at | Data e ora ISO 8601 (obbligatorio) |
content restore <collection> <id>
npx emdash content restore posts 01ABC123
Ripristina un elemento di contenuto dal cestino.
emdash schema
Gestisci collezioni e campi.
schema list
npx emdash schema list
Elenca tutte le collezioni.
schema get <collection>
npx emdash schema get posts
Mostra una collezione con tutti i suoi campi.
schema create <collection>
npx emdash schema create articles --label Articles
npx emdash schema create articles --label Articles --label-singular Article --description "Blog articles"
| Opzione | Descrizione |
|---|---|
--label | Etichetta della collezione (obbligatorio) |
--label-singular | Etichetta singolare |
--description | Descrizione della collezione |
schema delete <collection>
npx emdash schema delete articles
npx emdash schema delete articles --force
| Opzione | Descrizione |
|---|---|
--force | Salta la conferma |
Chiede conferma a meno che non sia impostato --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
| Opzione | Descrizione |
|---|---|
--type | Tipo di campo: string, text, number, integer, boolean, datetime, image, reference, portableText, json (obbligatorio) |
--label | Etichetta del campo (predefinito: slug del campo) |
--required | Se il campo è obbligatorio |
schema remove-field <collection> <field>
npx emdash schema remove-field posts featured
emdash media
Gestisci gli elementi media.
media list
npx emdash media list
npx emdash media list --mime image/png --limit 20
| Opzione | Descrizione |
|---|---|
--mime | Filtra per tipo MIME |
--limit | Numero di elementi |
--cursor | Cursore di paginazione |
media upload <file>
npx emdash media upload ./photo.jpg
npx emdash media upload ./photo.jpg --alt "A sunset" --caption "Taken in Bristol"
| Opzione | Descrizione |
|---|---|
--alt | Testo alternativo |
--caption | Testo didascalia |
media get <id>
npx emdash media get 01MEDIA123
media delete <id>
npx emdash media delete 01MEDIA123
emdash search
Ricerca full-text nei contenuti.
npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
| Opzione | Alias | Descrizione |
|---|---|---|
--collection | -c | Filtra per collezione |
--limit | -l | Risultati massimi |
emdash taxonomy
Gestisci tassonomie e termini.
taxonomy list
npx emdash taxonomy list
taxonomy terms <name>
npx emdash taxonomy terms categories
npx emdash taxonomy terms tags --limit 50
| Opzione | Alias | Descrizione |
|---|---|---|
--limit | -l | Termini massimi |
--cursor | Cursore di paginazione |
taxonomy add-term <taxonomy>
npx emdash taxonomy add-term categories --name "Tech" --slug tech
npx emdash taxonomy add-term categories --name "Frontend" --parent 01PARENT123
| Opzione | Descrizione |
|---|---|
--name | Etichetta del termine (obbligatorio) |
--slug | Slug del termine (predefinito: nome slugificato) |
--parent | ID del termine genitore (per tassonomie gerarchiche) |
emdash menu
Gestisci i menu di navigazione.
menu list
npx emdash menu list
menu get <name>
npx emdash menu get primary
Restituisce il menu con tutte le sue voci.
emdash seed
Applica un file seed al database. Questo comando funziona direttamente su un file SQLite locale (non è necessario un server in esecuzione).
npx emdash seed [path] [options]
Argomenti
| Argomento | Descrizione | Predefinito |
|---|---|---|
path | Percorso del file seed | .emdash/seed.json |
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--database | -d | Percorso file database | ./data.db |
--cwd | Directory di lavoro | Directory corrente | |
--validate | Solo validazione, non applicare | false | |
--no-content | Salta i contenuti di esempio | false | |
--on-conflict | Gestione conflitti: skip, update, error | skip | |
--uploads-dir | Directory per gli upload media | .emdash/uploads | |
--media-base-url | URL base per i file media | /_emdash/api/media/file | |
--base-url | URL base del sito (per URL media assoluti) |
Risoluzione del file seed
Il comando cerca i file seed in questo ordine:
- Argomento posizionale (se fornito)
.emdash/seed.json(convenzione)- Percorso dal campo
emdash.seeddipackage.json
emdash export-seed
Esporta lo schema e i contenuti del database come file seed. Funziona direttamente su un file SQLite locale.
npx emdash export-seed [options] > seed.json
Opzioni
| Opzione | Alias | Descrizione | Predefinito |
|---|---|---|---|
--database | -d | Percorso file database | ./data.db |
--cwd | Directory di lavoro | Directory corrente | |
--with-content | Includi contenuti (tutti o collezioni separate da virgola) | ||
--no-pretty | Disabilita la formattazione JSON | false |
Formato output
Il file seed esportato include:
- Impostazioni: Titolo del sito, tagline, link social
- Collezioni: Tutte le definizioni delle collezioni con i campi
- Tassonomie: Definizioni delle tassonomie e termini
- Menu: Menu di navigazione con le voci
- Aree widget: Aree widget e widget
- Contenuti (se richiesti): Voci con riferimenti
$mediae sintassi$ref:per la portabilità
emdash auth secret
Genera un secret di autenticazione sicuro per il tuo deployment.
npx emdash auth secret
Restituisce un secret casuale adatto per EMDASH_AUTH_SECRET.
File generati
.emdash/types.ts
Interfacce TypeScript generate da 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
Esportazione dello schema grezzo per gli strumenti:
{
"version": "a1b2c3d4",
"collections": [
{
"slug": "posts",
"label": "Posts",
"fields": [...]
}
]
}
Variabili d’ambiente
| Variabile | Descrizione |
|---|---|
EMDASH_DATABASE_URL | URL del database (impostato automaticamente da dev) |
EMDASH_TOKEN | Token di autenticazione per operazioni remote |
EMDASH_URL | URL remoto predefinito per types e dev --types |
EMDASH_AUTH_SECRET | Secret per l’autenticazione passkey |
EMDASH_PREVIEW_SECRET | Secret per la generazione di token di anteprima |
Script del pacchetto
{
"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"
}
}
Codici di uscita
| Codice | Descrizione |
|---|---|
0 | Successo |
1 | Errore (configurazione, rete, database) |