Die EmDash-CLI bietet Befehle zur Verwaltung einer EmDash-CMS-Instanz — Datenbankeinrichtung, Typgenerierung, Inhalts-CRUD, Schemaverwaltung, Medien und mehr.
Installation
Die CLI ist im emdash-Paket enthalten:
npm install emdash
Führen Sie Befehle mit npx emdash aus oder fügen Sie Skripte zu package.json hinzu. Die Binärdatei ist der Kürze halber auch als em verfügbar.
Authentifizierung
Befehle, die mit einer laufenden EmDash-Instanz kommunizieren (alles außer init, seed, export-seed und auth secret), lösen die Authentifizierung in dieser Reihenfolge auf:
--token-Flag — expliziter Token in der BefehlszeileEMDASH_TOKEN-Umgebungsvariable- Gespeicherte Anmeldedaten aus
~/.config/emdash/auth.json(gespeichert durchemdash login) - Dev-Bypass — wenn die URL localhost ist und kein Token verfügbar ist, erfolgt die Authentifizierung automatisch über den Dev-Bypass-Endpunkt
Die meisten Befehle akzeptieren die Flags --url (Standard http://localhost:4321) und --token. Wenn Sie einen lokalen Entwicklungsserver ansprechen, ist kein Token erforderlich.
Allgemeine Flags
Diese Flags sind bei allen Remote-Befehlen verfügbar:
| Flag | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | URL der EmDash-Instanz | http://localhost:4321 |
--token | -t | Auth-Token | Aus Umgebung/gespeicherten Anmeldedaten |
--json | Ausgabe als JSON (zum Pipen) | Automatisch von TTY erkannt |
Ausgabe
Wenn stdout ein TTY ist, gibt die CLI Ergebnisse mit consola formatiert aus. Beim Pipen oder wenn --json gesetzt ist, wird rohes JSON auf stdout ausgegeben — geeignet für jq oder andere Werkzeuge.
Befehle
emdash init
Initialisiert die Datenbank mit dem Kernschema und optionalen Vorlagendaten.
npx emdash init [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad zur Datenbankdatei | ./data.db |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis | |
--force | -f | Schema und Seed erneut ausführen | false |
Verhalten
- Liest die
emdash-Konfiguration auspackage.json - Erstellt die Datenbankdatei bei Bedarf
- Führt Kernmigrationen aus (erstellt Systemtabellen)
- Führt die Vorlage
schema.sqlaus, falls konfiguriert - Führt die Vorlage
seed.sqlaus, falls konfiguriert
emdash dev
Startet den Entwicklungsserver mit automatischer Datenbankeinrichtung.
npx emdash dev [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad zur Datenbankdatei | ./data.db |
--types | -t | Typen von Remote vor dem Start generieren | false |
--port | -p | Port des Entwicklungsservers | 4321 |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis |
Beispiele
# Start dev server
npx emdash dev
# Custom port
npx emdash dev --port 3000
# Generate types from remote before starting
npx emdash dev --types
Verhalten
- Prüft auf ausstehende Datenbankmigrationen und führt diese aus
- Wenn
--typesgesetzt ist, werden TypeScript-Typen von einer Remote-Instanz generiert (URL aus der UmgebungsvariableEMDASH_URLoderemdash.urlinpackage.json) - Startet den Astro-Entwicklungsserver mit gesetztem
EMDASH_DATABASE_URL
emdash types
Generiert TypeScript-Typen aus dem Schema einer laufenden EmDash-Instanz.
npx emdash types [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | URL der EmDash-Instanz | http://localhost:4321 |
--token | -t | Auth-Token | Aus Umgebung/gespeicherten Anmeldedaten |
--output | -o | Ausgabepfad für Typen | .emdash/types.ts |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis |
Beispiele
# 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
Verhalten
- Ruft das Schema von der Instanz ab
- Generiert TypeScript-Typdefinitionen
- Schreibt die Typen in die Ausgabedatei
- Schreibt
schema.jsonals Referenz daneben
emdash login
Meldet Sie bei einer EmDash-Instanz über OAuth Device Flow an.
npx emdash login [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | URL der EmDash-Instanz | http://localhost:4321 |
Verhalten
- Erkennt die Auth-Endpunkte der Instanz
- Wenn localhost und keine Authentifizierung konfiguriert ist, wird automatisch der Dev-Bypass verwendet
- Andernfalls wird der OAuth Device Flow gestartet — zeigt einen Code an und öffnet Ihren Browser
- Wartet auf die Autorisierung und speichert dann die Anmeldedaten in
~/.config/emdash/auth.json
Gespeicherte Anmeldedaten werden automatisch von allen nachfolgenden Befehlen verwendet, die dieselbe Instanz ansprechen.
emdash logout
Meldet Sie ab und entfernt gespeicherte Anmeldedaten.
npx emdash logout [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | URL der EmDash-Instanz | http://localhost:4321 |
emdash whoami
Zeigt den aktuell authentifizierten Benutzer an.
npx emdash whoami [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | URL der EmDash-Instanz | http://localhost:4321 |
--token | -t | Auth-Token | Aus Umgebung/gespeicherten Anmeldedaten |
--json | Ausgabe als JSON |
Zeigt E-Mail, Name, Rolle, Authentifizierungsmethode und Instanz-URL an.
emdash content
Verwaltet Inhaltselemente. Alle Unterbefehle verwenden die Remote-API über EmDashClient.
content list <collection>
npx emdash content list posts
npx emdash content list posts --status published --limit 10
| Option | Beschreibung |
|---|---|
--status | Nach Status filtern |
--limit | Maximale Anzahl Elemente |
--cursor | Paginierungscursor |
content get <collection> <id>
npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
| Option | Beschreibung |
|---|---|
--raw | Rohes Portable Text zurückgeben (Markdown-Konvertierung überspringen) |
Die Antwort enthält einen _rev-Token — übergeben Sie ihn an content update, um zu belegen, dass Sie den aktuellen Stand gesehen haben, den Sie überschreiben.
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
| Option | Beschreibung |
|---|---|
--data | JSON-String mit Inhaltsdaten |
--file | Daten aus einer JSON-Datei lesen |
--stdin | Daten von stdin lesen |
--slug | Inhalts-Slug |
--status | Anfangsstatus (draft, published) |
Geben Sie Daten über genau eine der Optionen --data, --file oder --stdin an.
content update <collection> <id>
Wie ein Dateieditor, der erfordert, dass Sie vor dem Schreiben lesen — Sie müssen den _rev-Token aus einem vorherigen get angeben, um zu belegen, dass Sie den aktuellen Stand gesehen haben. Dies verhindert das versehentliche Überschreiben von Änderungen, die Sie nicht gesehen haben.
# 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"}'
| Option | Beschreibung |
|---|---|
--rev | Revisionstoken aus get (erforderlich) |
--data | JSON-String mit Inhaltsdaten |
--file | Daten aus einer JSON-Datei lesen |
Wenn sich das Element seit Ihrem get geändert hat, gibt der Server 409 Conflict zurück — lesen Sie erneut und versuchen Sie es nochmals.
content delete <collection> <id>
npx emdash content delete posts 01ABC123
Löscht das Inhaltselement vorläufig (verschiebt es in den Papierkorb).
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
| Option | Beschreibung |
|---|---|
--at | ISO-8601-Datum und -Uhrzeit (erforderlich) |
content restore <collection> <id>
npx emdash content restore posts 01ABC123
Stellt ein gelöschtes Inhaltselement wieder her.
emdash schema
Verwaltet Sammlungen und Felder.
schema list
npx emdash schema list
Listet alle Sammlungen auf.
schema get <collection>
npx emdash schema get posts
Zeigt eine Sammlung mit all ihren Feldern an.
schema create <collection>
npx emdash schema create articles --label Articles
npx emdash schema create articles --label Articles --label-singular Article --description "Blog articles"
| Option | Beschreibung |
|---|---|
--label | Sammlungsbezeichnung (erforderlich) |
--label-singular | Bezeichnung im Singular |
--description | Sammlungsbeschreibung |
schema delete <collection>
npx emdash schema delete articles
npx emdash schema delete articles --force
| Option | Beschreibung |
|---|---|
--force | Bestätigung überspringen |
Fordert eine Bestätigung an, es sei denn, --force ist gesetzt.
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
| Option | Beschreibung |
|---|---|
--type | Feldtyp: string, text, number, integer, boolean, datetime, image, reference, portableText, json (erforderlich) |
--label | Feldbezeichnung (Standard ist der Feld-Slug) |
--required | Ob das Feld erforderlich ist |
schema remove-field <collection> <field>
npx emdash schema remove-field posts featured
emdash media
Verwaltet Medienelemente.
media list
npx emdash media list
npx emdash media list --mime image/png --limit 20
| Option | Beschreibung |
|---|---|
--mime | Nach MIME-Typ filtern |
--limit | Anzahl der Elemente |
--cursor | Paginierungscursor |
media upload <file>
npx emdash media upload ./photo.jpg
npx emdash media upload ./photo.jpg --alt "A sunset" --caption "Taken in Bristol"
| Option | Beschreibung |
|---|---|
--alt | Alternativtext |
--caption | Beschriftungstext |
media get <id>
npx emdash media get 01MEDIA123
media delete <id>
npx emdash media delete 01MEDIA123
emdash search
Volltextsuche über alle Inhalte.
npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
| Option | Alias | Beschreibung |
|---|---|---|
--collection | -c | Nach Sammlung filtern |
--limit | -l | Maximale Ergebnisse |
emdash taxonomy
Verwaltet Taxonomien und Begriffe.
taxonomy list
npx emdash taxonomy list
taxonomy terms <name>
npx emdash taxonomy terms categories
npx emdash taxonomy terms tags --limit 50
| Option | Alias | Beschreibung |
|---|---|---|
--limit | -l | Maximale Begriffe |
--cursor | Paginierungscursor |
taxonomy add-term <taxonomy>
npx emdash taxonomy add-term categories --name "Tech" --slug tech
npx emdash taxonomy add-term categories --name "Frontend" --parent 01PARENT123
| Option | Beschreibung |
|---|---|
--name | Begriffsbezeichnung (erforderlich) |
--slug | Begriffs-Slug (Standard ist der slugifizierte Name) |
--parent | Übergeordneter Begriffs-ID (für hierarchische Taxonomien) |
emdash menu
Verwaltet Navigationsmenüs.
menu list
npx emdash menu list
menu get <name>
npx emdash menu get primary
Gibt das Menü mit all seinen Einträgen zurück.
emdash seed
Wendet eine Seed-Datei auf die Datenbank an. Dieser Befehl arbeitet direkt mit einer lokalen SQLite-Datei (kein laufender Server erforderlich).
npx emdash seed [path] [options]
Argumente
| Argument | Beschreibung | Standard |
|---|---|---|
path | Pfad zur Seed-Datei | .emdash/seed.json |
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad zur Datenbankdatei | ./data.db |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis | |
--validate | Nur validieren, nicht anwenden | false | |
--no-content | Beispielinhalte überspringen | false | |
--on-conflict | Konfliktbehandlung: skip, update, error | skip | |
--uploads-dir | Verzeichnis für Medien-Uploads | .emdash/uploads | |
--media-base-url | Basis-URL für Mediendateien | /_emdash/api/media/file | |
--base-url | Basis-URL der Website (für absolute Medien-URLs) |
Auflösung der Seed-Datei
Der Befehl sucht in dieser Reihenfolge nach Seed-Dateien:
- Positionsargument (falls angegeben)
.emdash/seed.json(Konvention)- Pfad aus dem Feld
emdash.seedinpackage.json
emdash export-seed
Exportiert Datenbankschema und Inhalte als Seed-Datei. Arbeitet direkt mit einer lokalen SQLite-Datei.
npx emdash export-seed [options] > seed.json
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad zur Datenbankdatei | ./data.db |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis | |
--with-content | Inhalte einschließen (alle oder kommagetrennte Sammlungen) | ||
--no-pretty | JSON-Formatierung deaktivieren | false |
Ausgabeformat
Die exportierte Seed-Datei enthält:
- Einstellungen: Seitentitel, Tagline, Social-Media-Links
- Sammlungen: Alle Sammlungsdefinitionen mit Feldern
- Taxonomien: Taxonomiedefinitionen und Begriffe
- Menüs: Navigationsmenüs mit Einträgen
- Widget-Bereiche: Widget-Bereiche und Widgets
- Inhalte (falls angefordert): Einträge mit
$media-Referenzen und$ref:-Syntax für Portabilität
emdash auth secret
Generiert ein sicheres Authentifizierungsgeheimnis für Ihre Bereitstellung.
npx emdash auth secret
Gibt ein zufälliges Geheimnis aus, das für EMDASH_AUTH_SECRET geeignet ist.
Generierte Dateien
.emdash/types.ts
Von emdash types generierte TypeScript-Schnittstellen:
// 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
Roher Schema-Export für Werkzeuge:
{
"version": "a1b2c3d4",
"collections": [
{
"slug": "posts",
"label": "Posts",
"fields": [...]
}
]
}
Umgebungsvariablen
| Variable | Beschreibung |
|---|---|
EMDASH_DATABASE_URL | Datenbank-URL (wird automatisch von dev gesetzt) |
EMDASH_TOKEN | Auth-Token für Remote-Operationen |
EMDASH_URL | Standard-Remote-URL für types und dev --types |
EMDASH_AUTH_SECRET | Geheimnis für Passkey-Authentifizierung |
EMDASH_PREVIEW_SECRET | Geheimnis für Vorschau-Token-Generierung |
Paketskripte
{
"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"
}
}
Exit-Codes
| Code | Beschreibung |
|---|---|
0 | Erfolg |
1 | Fehler (Konfiguration, Netzwerk, Datenbank) |