Die EmDash-CLI stellt Befehle für die Datenbank-Einrichtung, die Typgenerierung, das Erstellen und Bearbeiten von Inhalten, die Schemaverwaltung, Medien sowie den Export und Import von Websites bereit.
Installation
Die CLI ist im Paket emdash enthalten. Installiere sie mit dem folgenden Befehl:
npm install emdash
Führe Befehle mit npx emdash aus oder füge Skripte zur package.json hinzu. Das Binary ist der Kürze halber auch als em verfügbar.
Starte deine Website mit ihrem Paketskript, zum Beispiel pnpm dev. Das Paketskript startet Astro; die EmDash-Integration erzeugt emdash-env.d.ts, während die Laufzeit beim ersten Request ausstehende Migrationen ausführt und, bevor die Einrichtung abgeschlossen ist, das Schema und die Struktur des mitgelieferten Seeds einmalig anwendet. Beispielinhalte aus dem Seed werden nur angewendet, wenn ein Administrator sie im Einrichtungsassistenten auswählt.
Authentifizierung
Befehle, die sich mit einer laufenden EmDash-Instanz verbinden, ermitteln die Authentifizierung in dieser Reihenfolge:
--token-Flag — explizites Token in der BefehlszeileEMDASH_TOKEN-Umgebungsvariable- Gespeicherte Anmeldedaten aus
~/.config/emdash/auth.json(vonemdash logingespeichert) - Dev-Bypass — wenn die URL localhost ist und kein Token verfügbar ist, authentifiziert sich der Befehl automatisch über den Dev-Bypass-Endpunkt
Die Befehle types, whoami, content, schema, media, search, taxonomy, menu und site verbinden sich mit einer laufenden Instanz. Authentifizierungsbefehle haben eigene Verbindungsoptionen. Wenn du einen lokalen Entwicklungsserver ansprichst, ist kein Token nötig.
Gemeinsame Flags
Die Verbindungs-Flags unterscheiden sich je nach Befehl. Die unten genannten gruppierten Befehle bedeuten, dass jeder Unterbefehl dieser Gruppe gemeint ist.
| Flag | Alias | Verfügbar bei | Beschreibung und Standardwert |
|---|---|---|---|
--url | -u | types, login, logout, whoami, content, schema, media, search, taxonomy, menu, site | Instanz-URL; Standard ist EMDASH_URL oder http://localhost:4321 |
--token | -t | types, whoami, content, schema, media, search, taxonomy, menu, site | Token aus dem Flag, aus EMDASH_TOKEN oder aus den gespeicherten Anmeldedaten |
--header "Name: Value" | -H | types, login, content, schema, media, search, taxonomy, menu, site | Wiederholbarer Header, der mit EMDASH_HEADERS und gespeicherten Headern zusammengeführt wird |
--json | whoami, content, schema, media, search, taxonomy, menu, site | Rohes JSON statt für das Terminal formatierter Ausgabe schreiben |
Ausgabe
Wenn ein Befehl Ergebnisse in ein interaktives Terminal schreibt, formatiert er sie zum Lesen. Die oben mit --json aufgeführten Befehle schreiben rohes JSON, wenn das Flag gesetzt ist oder ihre Ausgabe weitergeleitet wird. emdash migrate gibt nur mit der ausdrücklichen Option --json JSON aus.
Befehle
emdash init
Initialisiert eine lokale SQLite-Datenbank anhand der Template-Metadaten in package.json. Der Befehl führt die Core-Migrationen aus und wendet dann die optionale SQL-Datei an, die in emdash.schema angegeben ist. Führe emdash seed separat für JSON-Seed-Daten aus.
npx emdash init [options]
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad der SQLite-Datenbank | ./data.db |
--cwd | Arbeitsverzeichnis des Projekts | Aktuelles Verzeichnis | |
--force | -f | Wendet das Template-Schema erneut an, wenn bereits Collections existieren | false |
Ohne --force bleibt eine bereits initialisierte Datenbank unverändert. Dieser Befehl öffnet direkt eine lokale SQLite-Datei; verwende emdash migrate für Migrationen von D1, PostgreSQL, libSQL oder Hyperdrive, die über das Deployment verwaltet werden.
emdash doctor
Prüft eine lokale SQLite-Datenbank auf Probleme bei Verbindung, Migrationen, Collections, Tabellen und Benutzern. Wenn das Projekt eine Wrangler-Konfiguration hat, prüft der Befehl außerdem, dass ein Cron-Trigger und ein EmDash-scheduled()-Handler zusammen konfiguriert sind.
npx emdash doctor [options]
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad der SQLite-Datenbank | ./data.db |
--cwd | Arbeitsverzeichnis des Projekts | Aktuelles Verzeichnis | |
--json | Strukturierte Ergebnisse ausgeben | false |
Der Befehl meldet jede Prüfung als bestanden, Warnung oder Fehler und beendet sich mit einem Wert ungleich null, wenn eine Prüfung fehlschlägt.
emdash seed
Validiert einen JSON-Seed oder wendet ihn auf eine lokale SQLite-Datenbank an. Der Befehl verwendet den positionalen Pfad, wenn er angegeben ist, dann .emdash/seed.json und schließlich den Pfad emdash.seed aus der package.json.
npx emdash seed [path] [options]
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad der SQLite-Datenbank | ./data.db |
--cwd | Arbeitsverzeichnis des Projekts | Aktuelles Verzeichnis | |
--validate | Den Seed validieren, ohne die Datenbank zu ändern | false | |
--no-content | Einträge, Bylines und Taxonomie-Begriffe überspringen | false | |
--on-conflict | Vorhandene Datensätze mit skip, update oder error behandeln | skip | |
--uploads-dir | Lokales Verzeichnis für Seed-Medien | ./uploads | |
--media-base-url | Basis-URL, die für lokale Seed-Medien gespeichert wird | /_emdash/api/media/file |
Das Anwenden eines Seeds führt zuerst die Core-Migrationen aus. Verwende --validate in der Continuous Integration, wenn du die Datei prüfen willst, ohne die Datenbank zu öffnen oder zu erstellen.
emdash migrate
Prüft oder wendet den Satz an Core-Migrationen an, den ein Astro-Build erzeugt.
npx emdash migrate [options]
npx emdash migrate --check [options]
npx emdash migrate --status --json [options]
npx emdash migrate --release-lock <id> [options]
Standardmäßig ermittelt der Befehl das Projektverzeichnis und liest .emdash/migrations.json. Er validiert das Manifest gegen das im Projekt installierte EmDash-Paket, löst den projektlokalen Executor des Adapters auf und gibt das unveränderliche Ziel aus, bevor irgendein SQL ausgeführt wird.
Optionen
| Option | Beschreibung |
|---|---|
--check | Nichts anwenden; mit einem Wert ungleich null beenden, wenn Migrationen ausstehen oder unbekannte Migrationsdatensätze vorliegen |
--status | Den genauen Status melden, ohne etwas anzuwenden; nach einem erfolgreichen Bericht mit null beenden |
--json | Den stabilen Migrationsbericht als JSON ausgeben |
--manifest <path> | Einen nicht standardmäßigen Manifest-Pfad lesen |
--from-config | Die vertrauenswürdige Astro-Konfiguration ausdrücklich auswerten, statt ein Manifest zu verwenden |
--config <path> | Pfad der Astro-Konfiguration, der zusammen mit --from-config verwendet wird |
--expected-target-fingerprint <sha256> | Erforderliche Absicherung für nicht interaktives Anwenden oder Freigeben der Sperre |
--release-lock <id> | Die D1-Migrationssperre mit der ID freigeben, die --status meldet; kann nicht mit --check oder --status kombiniert werden |
--database <path> | Einen SQLite-Pfad überschreiben |
--database-url-env <name> | Den Namen einer PostgreSQL-Verbindungsvariablen überschreiben |
--d1 <uuid-or-name> | Eine D1-Datenbank ausdrücklich auswählen |
--account-id <id> | Ein Cloudflare-Konto ausdrücklich auswählen |
--wrangler-config <path> | D1-Binding-Metadaten aus einer ausdrücklich angegebenen Wrangler-Konfiguration lesen |
--wrangler-env <name> | Eine Umgebung auswählen; erfordert --wrangler-config |
Interaktives, für Menschen lesbares Anwenden und Freigeben der Sperre fragen nach einer Bestätigung. Nicht interaktives Anwenden oder Freigeben der Sperre sowie jedes Anwenden oder Freigeben mit --json erfordern den exakten Fingerprint, der für das Ziel ausgegeben wird. Es gibt weder down noch --dry-run; verwende --check, um festzustellen, ob Arbeit nötig ist.
Exit-Codes
| Code | Bedeutung |
|---|---|
0 | Erfolg, einschließlich eines erfolgreichen --status-Berichts |
1 | Fehler bei Validierung, Konfiguration, Ziel, Migration oder Aufräumen |
2 | --check hat ausstehende bekannte Migrationen gefunden |
3 | --check hat unbekannte angewendete Datensätze gefunden (hat Vorrang vor ausstehenden) |
4 | Bestätigung fehlt, wurde abgelehnt oder der Ziel-Fingerprint stimmt nicht überein |
130 | Nach begrenztem Aufräumen des Executors unterbrochen |
Siehe Core-Datenbankmigrationen verwalten für die Reihenfolge beim Deployment, Zugangsdaten für das Ziel und die D1-Migrationssperre.
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 oder gespeicherten Anmeldedaten |
--header | -H | Eigener Request-Header; wiederholbar | Aus Umgebung oder gespeicherten Anmeldedaten |
--json | Wird akzeptiert, ändert aber weder die Dateien noch die Fortschrittsausgabe dieses Befehls | — | |
--output | -o | Ausgabepfad für die 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://example.com
# 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 zur Referenz zusätzlich
schema.jsondaneben
emdash login
Meldet sich über den OAuth Device Flow bei einer EmDash-Instanz an.
npx emdash login [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | URL der EmDash-Instanz | http://localhost:4321 |
--header | -H | Eigener Request-Header; wiederholbar | Aus EMDASH_HEADERS |
Verhalten
- Ermittelt die Auth-Endpunkte der Instanz
- Bei localhost ohne konfigurierte Authentifizierung wird der Dev-Bypass automatisch verwendet
- Andernfalls startet er den OAuth Device Flow — es wird ein Code angezeigt und dein Browser geöffnet. Nachdem du den Code eingegeben hast, listet die Admin-Seite die Berechtigungen auf, die die CLI erhalten wird, sowie alle angeforderten Berechtigungen, die deine Rolle nicht erlaubt, bevor du die Anfrage genehmigst.
- Fragt die Autorisierung ab und speichert die Anmeldedaten anschließend in
~/.config/emdash/auth.json
Gespeicherte Anmeldedaten werden von allen folgenden Befehlen, die dieselbe Instanz ansprechen, automatisch verwendet.
emdash logout
Meldet 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 | Als JSON ausgeben |
Zeigt E-Mail-Adresse, 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 |
--locale | Nach Sprachversion (Locale) filtern |
--limit | Maximale Anzahl an Elementen |
--cursor | Paginierungs-Cursor |
content get <collection> <id>
npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
| Option | Beschreibung |
|---|---|
--locale | Zu verwendende Locale, wenn das ID-Argument ein Slug ist |
--raw | Rohen Portable Text statt Markdown zurückgeben |
--published | Einen ausstehenden Entwurf ignorieren und nur veröffentlichte Daten zurückgeben |
Die Antwort enthält ein _rev-Token. Übergib es an content update, um zu bestätigen, dass du den aktuellen Stand gesehen hast, bevor du ihn überschreibst.
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 den Inhaltsdaten |
--file | Daten aus einer JSON-Datei lesen |
--stdin | Daten von stdin lesen |
--slug | Slug des Inhalts |
--locale | Locale des Inhalts |
--translation-of | ID eines Inhaltselements, dessen Übersetzung dieses Element sein soll |
--draft | Als Entwurf behalten, statt automatisch zu veröffentlichen |
Gib die Daten über genau eine der Optionen --data, --file oder --stdin an. Neue Elemente werden automatisch veröffentlicht, sofern nicht --draft gesetzt ist.
content update <collection> <id>
Du musst das _rev-Token aus einem vorherigen get angeben, um zu belegen, dass du den aktuellen Stand gesehen hast. Das verhindert, dass du Änderungen überschreibst, die du nicht gesehen hast. Die folgenden Schritte lesen ein Element und aktualisieren es dann mit diesem Token:
# 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 | Revisions-Token aus get (erforderlich) |
--data | JSON-String mit den Inhaltsdaten |
--file | Daten aus einer JSON-Datei lesen |
--locale | Zu verwendende Locale, wenn das ID-Argument ein Slug ist |
--draft | Die Aktualisierung als Entwurf behalten, statt automatisch zu veröffentlichen |
--override-lock | Auch schreiben, wenn ein anderer Redakteur den Eintrag geöffnet hat |
Wenn sich das Element seit deinem get geändert hat, gibt der Server 409 Conflict zurück — lies es erneut und versuche es noch einmal.
Wenn jemand den Eintrag im Admin geöffnet hat, gibt der Server 409 mit dem Code
ENTRY_LOCKED und einer Meldung zurück, die den Sperrinhaber nennt. Warte, bis
die Person fertig ist, oder übergib --override-lock. Dasselbe Flag ist bei content delete,
content publish, content unpublish und content schedule verfügbar.
content delete <collection> <id>
npx emdash content delete posts 01ABC123
Löscht das Inhaltselement vorläufig (verschiebt es in den Papierkorb).
Übergib --override-lock, um einen Eintrag zu löschen, den ein anderer Redakteur geöffnet hat.
content publish <collection> <id>
npx emdash content publish posts 01ABC123
Übergib --override-lock, um einen Eintrag zu veröffentlichen, den ein anderer Redakteur geöffnet hat.
content unpublish <collection> <id>
npx emdash content unpublish posts 01ABC123
Übergib --override-lock, um die Veröffentlichung eines Eintrags zurückzunehmen, den ein anderer Redakteur geöffnet hat.
content schedule <collection> <id>
npx emdash content schedule posts 01ABC123 --at 2026-03-01T09:00:00Z
| Option | Beschreibung |
|---|---|
--at | ISO-8601-Datum und -Uhrzeit mit Z oder einem expliziten UTC-Offset (erforderlich) |
Übergib --override-lock, um einen Eintrag zeitlich einzuplanen, den ein anderer Redakteur geöffnet hat.
content restore <collection> <id>
npx emdash content restore posts 01ABC123
Stellt ein Inhaltselement aus dem Papierkorb wieder her.
content translations <collection> <id>
Listet jede Übersetzung in der Übersetzungsgruppe des Eintrags auf:
npx emdash content translations posts 01ABC123
Das Ergebnis enthält für jede Übersetzung die ID, die Locale, den Slug, den Status und die Angabe, ob es sich um den angeforderten Eintrag handelt.
emdash schema
Verwaltet Collections und Felder.
schema list
npx emdash schema list
Listet alle Collections auf.
schema get <collection>
npx emdash schema get posts
Zeigt eine Collection mit allen ihren Feldern.
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 | Bezeichnung der Collection (erforderlich) |
--label-singular | Bezeichnung im Singular |
--description | Beschreibung der Collection |
schema delete <collection>
npx emdash schema delete articles
npx emdash schema delete articles --force
| Option | Beschreibung |
|---|---|
--force | Bestätigung überspringen |
Fragt nach einer Bestätigung, sofern nicht --force gesetzt ist.
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, url, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug oder repeater (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 | Paginierungs-Cursor |
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 | Bildunterschrift |
media get <id>
npx emdash media get 01MEDIA123
media delete <id>
npx emdash media delete 01MEDIA123
media repair-usage
Repariert die Nutzungsindizes der Inhaltsmedien für eine Collection oder für jede Inhalts-Collection. Verwende dies nach Importen oder direkten Datenbankschreibzugriffen, wenn die Nutzungsabdeckung veraltet oder nicht vertrauenswürdig ist.
npx emdash media repair-usage --collection posts
npx emdash media repair-usage --all
npx emdash media repair-usage --all --json
| Option | Alias | Beschreibung |
|---|---|---|
--collection | -c | Eine Inhalts-Collection reparieren |
--all | Jede Inhalts-Collection reparieren |
Übergib genau eines von --collection oder --all. Eine Reparatur aus der Ferne erfordert einen Admin-Benutzer und ein Auth-Token mit dem Scope admin.
Die Reparatur aller Inhalte läuft synchron und kann bei großen Websites langsam oder teuer sein. Bevorzuge --collection, wenn du nur eine Collection reparieren musst.
Strukturierte Reparaturergebnisse complete, partial und stale beenden sich mit 0; strukturierte Ergebnisse failed beenden sich mit 1. Automatisierungen und Cron-Jobs sollten --json verwenden und status, failedSourceCount, skippedSourceCount sowie die Zusammenfassungen pro Collection auswerten, statt Exit-Code 0 als vollständige Abdeckung zu behandeln.
emdash search
Volltextsuche über Inhalte.
npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
| Option | Alias | Beschreibung |
|---|---|---|
--collection | -c | Nach Collection filtern |
--locale | Nach Locale filtern | |
--limit | -l | Maximale Anzahl an Ergebnissen |
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 Anzahl an Begriffen |
--cursor | Paginierungs-Cursor |
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 | Bezeichnung des Begriffs (erforderlich) |
--slug | Slug des Begriffs (Standard ist der in einen Slug umgewandelte Name) |
--parent | ID des übergeordneten Begriffs (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 allen seinen Einträgen zurück.
emdash site
Exportiert eine ganze Website in ein .emdash-Websitepaket und importiert ein Paket in eine leere Website. Der Leitfaden zur Website-Übertragung erklärt, was ein Paket enthält, was die Zielwebsite braucht und wie du einen Importplan liest.
Das Token benötigt den Scope admin, den das Token von emdash login hat, oder die passenden Übertragungs-Scopes: transfer:export zum Exportieren sowie transfer:analyze und transfer:execute zum Importieren. Ein Token ohne sie scheitert mit INSUFFICIENT_SCOPE.
Fortschrittsmeldungen gehen immer an stderr, das Ergebnis an stdout. Mit --json oder wenn stdout kein Terminal ist, enthält stdout nur das JSON-Ergebnis. Ein Fehler wird als { "error": { "code": "…", "message": "…" } } geschrieben. Die Codes sind die Fehlercodes des Servers, dazu INVALID_ARGUMENT für fehlerhafte Flags, PACKAGE_FILE_REQUIRED, wenn ein fortgesetzter Import noch die Paketdatei braucht, und UNKNOWN_ERROR.
Die Befehle wiederholen Netzwerkfehler sowie Antworten mit 408, 429 und 5xx mit Backoff.
site export
Exportiert die Website und schreibt sie in eine Paketdatei:
npx emdash site export --output site.emdash
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--output | -o | Zu schreibende Paketdatei (erforderlich) | |
--no-comments | Kommentare und Kommentar-Reaktionen weglassen | Kommentare enthalten |
Der Befehl startet einen Export, führt ihn weiter, bis er abgeschlossen ist, und lädt die Paketdatei Datei für Datei herunter. Er prüft, ob das heruntergeladene Manifest zum Paket-Digest des Exports passt, und scheitert mit TRANSFER_PACKAGE_DIGEST_MISMATCH, bevor irgendetwas geschrieben wird, wenn dies nicht der Fall ist. Er prüft Größe und SHA-256-Digest jeder Datei, bevor er sie schreibt. Das Paket wird nach <output>.partial geschrieben und in den Ausgabepfad umbenannt, wenn es vollständig ist.
Der Befehl speichert seinen Fortschritt in <output>.partial.json und die heruntergeladenen Dateien im Verzeichnis <output>.parts/. Führe nach einer Unterbrechung denselben Befehl erneut aus, um denselben Export fortzusetzen; bereits heruntergeladene Dateien werden geprüft und wiederverwendet, und der Befehl meldet, wie viele er wiederverwendet hat. Beides wird gelöscht, wenn das Paket geschrieben ist. Die Fortschrittsdatei wird ignoriert, wenn sie für eine andere URL oder eine andere Kommentar-Einstellung geschrieben wurde oder wenn ihr Export fehlgeschlagen oder abgelaufen ist; der Befehl startet dann einen neuen Export.
Das JSON-Ergebnis enthält operationId, output, packageDigest, files, bytes und resumed.
site import <file>
Importiert ein Paket in zwei Schritten. Analysiere es zuerst und bestätige dann den Plan-Digest, den die Analyse ausgegeben hat:
npx emdash site import site.emdash --analyze
npx emdash site import site.emdash --plan sha256:3f1c… --confirm
| Option | Beschreibung |
|---|---|
--analyze | Das Paket hochladen, analysieren und den Importplan ausgeben |
--map-principal <from>=<to> | Mit --analyze: einen Principal des Pakets, per ID oder E-Mail-Adresse, einem Benutzer der Website per ID oder E-Mail-Adresse oder none zuordnen. Wiederholbar |
--use-target-title | Mit --analyze: den Titel dieser Website statt den des Pakets beibehalten |
--use-target-tagline | Mit --analyze: den Untertitel dieser Website statt den des Pakets beibehalten |
--plan <digest> | Der auszuführende Plan-Digest, als sha256:<hex> oder reines Hex. Erfordert --confirm |
--confirm | Den mit --plan angegebenen Plan ausführen. Erfordert --plan |
--yes | Alias -y. Bei cancel oder abandon: die Bestätigungsabfrage überspringen |
--analyze verifiziert die gesamte Paketdatei lokal, findet dann den bestehenden Import desselben Pakets auf der Website oder legt einen an. Es lädt die Dateien hoch, die die Website noch nicht hat, führt die Analyse aus und gibt den Plan aus: die Paket- und Plan-Digests, Anzahl der Datensätze, Größen, die Wahl von Titel und Untertitel, jeden Principal und seine Zuordnung, die Transformationen unter „Differences from the source site“, die Warnungen und die Blocker. Wenn ein früherer Import desselben Pakets fehlgeschlagen ist, abgebrochen oder aufgegeben wurde oder abgelaufen ist, warnt der Befehl und startet einen neuen Import.
Entscheidungen werden mit dem Import gespeichert, sodass ein späterer --analyze-Lauf ohne Entscheidungs-Flags sie beibehält. Jede Änderung der Entscheidungen erzeugt einen neuen Plan-Digest. Entscheidungen können nicht mit --plan kombiniert werden, und --plan kann nicht mit --analyze kombiniert werden.
--plan <digest> --confirm führt den Import nur aus, wenn der Digest zum aktuellen Plan passt, führt ihn dann weiter, bis er abgeschlossen ist, und gibt die Quittung aus. Wenn sich der Plan seit deiner Prüfung geändert hat, scheitert der Befehl mit TRANSFER_PLAN_DIGEST_MISMATCH; analysiere erneut und bestätige den neuen Digest.
Das JSON-Ergebnis von --analyze enthält operationId, state, packageDigest, planDigest, executable und den vollständigen plan. Das JSON-Ergebnis von --confirm enthält operationId, state (complete), receipt und receiptDigestValid, das angibt, ob der receiptDigest der Quittung mit ihrem Inhalt übereinstimmt.
Diese Formen arbeiten mit einem Import anhand seiner Operations-ID:
| Befehl | Beschreibung |
|---|---|
emdash site import status <operation-id> | Gibt Status, Phase, Fortschritt, Digests und Fehler des Imports aus sowie, wie viele Dateien hochgeladen sind. Das JSON-Ergebnis ist { operation, files: { declared, verified } }. |
emdash site import resume <operation-id> [file] | Setzt den Import ab seinem aktuellen Zustand fort: den Upload beenden, die Analyse beenden und den Plan ausgeben oder die Ausführung beenden und die Quittung ausgeben. Übergib die Paketdatei nur, solange der Import noch hochlädt. |
emdash site import receipt <operation-id> | Gibt die Quittung eines abgeschlossenen Imports aus, in derselben Form wie bei --confirm. |
emdash site import cancel <operation-id> | Bricht den Import ab. Ein laufender Import stoppt nach seinem aktuellen Batch; was er bereits geschrieben hat, bleibt auf der Website. |
emdash site import abandon <operation-id> | Hebt die Schreibsperre auf, die ein fehlgeschlagener oder abgebrochener Import auf der Website hinterlässt. Was der Import geschrieben hat, wird nicht gelöscht; setze die Website daher zurück oder richte eine neue ein, bevor du erneut importierst. |
cancel und abandon fragen nach einer Bestätigung. Übergib --yes, um die Abfrage zu überspringen; die Abfrage entfällt auch mit --json oder wenn stdout kein Terminal ist. Wenn stdin kein Terminal ist und keiner der Fälle zutrifft, scheitert der Befehl mit INVALID_ARGUMENT. Das Ablehnen der Abfrage ändert nichts und beendet sich mit Code 1. Das JSON-Ergebnis beider ist { operationId, state, operation }.
Die Import-Befehle beenden sich mit diesen Codes:
| Code | Bedeutung |
|---|---|
0 | Erfolg. Bei status ein Import, der läuft oder abgeschlossen ist |
1 | Ein Fehler, eine abgelehnte Abfrage, ein Import, der ohne Quittung endete, oder eine Quittung, deren Digest nicht übereinstimmt. Bei status ein Import, der fehlgeschlagen ist, abgebrochen oder aufgegeben wurde oder abgelaufen ist |
2 | Die Analyse ist abgeschlossen, aber der Plan hat Blocker |
emdash export-seed
Exportiert Datenbankschema und Inhalte als Seed-Datei. Arbeitet direkt mit einer lokalen SQLite-Datei.
Die Datenbank muss jede Migration haben, die die installierte EmDash-Version kennt. Wenn der Befehl
ausstehende Migrationen meldet, führe npx emdash migrate aus und exportiere dann erneut. Wenn die Datenbank
von einer neueren EmDash-Version migriert wurde, aktualisiere die installierte Version, bevor du exportierst. Der Export
öffnet die Datenbank schreibgeschützt und wendet selbst nie Migrationen an.
npx emdash export-seed [options] > seed.json
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Pfad der Datenbankdatei | ./data.db |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis | |
--with-content | Inhalte einschließen (alle oder durch Kommas getrennte Collections) | ||
--pretty / --no-pretty | Eingerückte JSON-Ausgabe aktivieren oder deaktivieren | Formatierte Ausgabe aktiviert | |
--media-base-url | Öffentliche URL der Website, um absolute $media-URLs zu schreiben |
Ausgabeformat
Die exportierte Seed-Datei enthält:
- Einstellungen: Website-Titel, Untertitel, Social-Media-Links
- Collections: Alle Collection-Definitionen mit Feldern
- Block-Typen: Jede aufbewahrte Version und den Zeiger auf die aktive Version jedes Typs
- Taxonomien: Taxonomie-Definitionen und Begriffe
- Menüs: Navigationsmenüs mit Einträgen
- Weiterleitungen: Weiterleitungsregeln mit Status 301, 302, 307 oder 308
- Widget-Bereiche: Widget-Bereiche und Widgets
- Sections: Wiederverwendbare Inhaltsblöcke
- Inhalte (falls angefordert): Einträge mit
$media-Referenzen und der$ref:-Syntax für die Portabilität
Geplante Einträge werden als Entwürfe exportiert, weil ein Seed kein Feld für einen Veröffentlichungszeitpunkt hat. Der Export lässt alles weg, was emdash seed ablehnen würde, und gibt dazu eine Warnung auf stderr aus: Weiterleitungsregeln mit Status 410 oder 451, zusätzliche Regeln mit derselben Quelle (in älteren Datenbanken möglich) und Sections, deren Slug andere Zeichen als Kleinbuchstaben, Ziffern und Bindestriche enthält.
Medien-URLs
emdash seed lädt jede $media-URL herunter und lädt die Datei in den Speicher der Zielwebsite hoch; dafür braucht es eine absolute http- oder https-URL, die es erreichen kann. Übergib die öffentliche URL der Quellwebsite, um absolute URLs zu schreiben:
npx emdash export-seed --with-content=all --media-base-url=https://example.com > seed.json
Die Website muss ihre Medien unter dieser URL von /_emdash/api/media/file/ ausliefern, während der Seed angewendet wird, und die URL darf weder auf localhost noch auf eine Adresse in einem privaten Netzwerk zeigen; von dort lädt emdash seed nicht herunter. Ohne --media-base-url sind $media-URLs websiterelative Pfade, die emdash seed überspringt, sodass die Felder leer bleiben, und der Export gibt eine Warnung auf stderr aus.
Bild- und Dateifelder sowie Bild-Unterfelder von Repeatern werden als $media-Referenzen exportiert. Bilder in Portable-Text-Feldern behalten ihre gespeicherte Medien-ID und URL, die auf einer anderen Website nicht aufgelöst werden.
emdash secrets
Erzeugt und prüft den Schlüssel, mit dem Plugin-Secrets verschlüsselt werden.
secrets generate
Erzeugt einen EMDASH_ENCRYPTION_KEY für dein Deployment. Der Schlüssel wird verwendet, um
Plugin-Secrets im Ruhezustand zu verschlüsseln.
npx emdash secrets generate
Gibt den neuen Schlüssel auf stdout aus. Leite ihn in deinen Secret-Speicher weiter oder schreibe ihn
mit --write direkt in deine lokale .env-Datei. Wrangler und das Cloudflare-
Vite-Plugin lesen diese Datei in der lokalen Entwicklung. Ein eigenständiger Node-Server lädt
.env nicht automatisch; lade sie über den Prozessmanager oder stelle
den Schlüssel über die Prozessumgebung des Servers bereit. Der Leitfaden zum Node.js-Deployment
zeigt den lokalen Befehl.
npx emdash secrets generate --write .env
--write weigert sich, einen vorhandenen Eintrag ohne --force zu überschreiben. Um ein Deployment mit vorhandenen verschlüsselten Daten zu rotieren, stelle den erzeugten Schlüssel dem vorhandenen Wert voran und trenne die Schlüssel mit einem Komma. EmDash verschlüsselt neue Werte mit dem ersten Schlüssel und verwendet ältere Einträge zum Entschlüsseln anhand von kid. Speichere jedes Plugin-Secret erneut, bevor du einen alten Schlüssel entfernst. EmDash listet derzeit nicht auf, welche Schlüssel-IDs noch von gespeicherten Einstellungen verwendet werden; führe daher eine Übersicht über die Zugangsdaten, die du erneut speicherst, und prüfe jede Integration, bevor du ihren alten Schlüssel entfernst.
secrets fingerprint <key>
Gibt den 8-stelligen Fingerprint (kid) eines Schlüssels aus, ohne seinen Wert preiszugeben. Das ist in der CI nützlich, um zu prüfen, ob der richtige Schlüssel ausgerollt wurde. Der folgende Befehl gibt den Fingerprint eines Schlüssels aus:
npx emdash secrets fingerprint emdash_enc_v1_...
Generierte Dateien
emdash-env.d.ts
Die Astro-Integration erzeugt emdash-env.d.ts im Projektstamm, wenn der lokale Entwicklungsserver startet. Sie aktualisiert die Datei nach Schemaänderungen, die über die laufende Entwicklungs-Website vorgenommen werden. Die Deklarationen erweitern EmDashCollections, sodass Aufrufe wie getEmDashCollection("posts") die in der lokalen Datenbank definierten Felder ableiten.
Diese Datei entsteht automatisch und gehört zum lokalen Astro-Entwicklungs-Workflow. Du musst emdash types nicht ausführen, um sie zu erzeugen.
.emdash/types.ts
Der Befehl emdash types ruft das Schema einer laufenden Instanz ab und schreibt eigenständige TypeScript-Interfaces. Verwende ihn, wenn das Schema auf einer entfernten EmDash-Instanz liegt, wenn Tooling eine Datei an einem eigenen Pfad braucht oder wenn der lokale Astro-Entwicklungsserver nicht läuft:
// Generated by EmDash CLI
// Do not edit manually - run `emdash types` to regenerate
import type { PortableTextBlock } from "emdash";
export interface Post {
id: string;
slug: string | null;
status: string;
title: string;
content?: PortableTextBlock[];
createdAt: Date;
updatedAt: Date;
publishedAt: Date | null;
bylines?: ContentBylineCredit[];
terms?: Record<string, TaxonomyTerm[]>;
}
Die Remote-Ausgabe enthält eigenständige Collection-Interfaces und erweitert EmDashCollections nicht. Sie ändert sich nur, wenn du emdash types ausführst; emdash-env.d.ts verwendet Module Augmentation und wird im Rahmen der lokalen Entwicklung aktualisiert.
.emdash/schema.json
Der Befehl schreibt außerdem einen rohen Schema-Export namens schema.json neben die gewählte TypeScript-Ausgabe. Beim Standard-Ausgabepfad ist die Datei .emdash/schema.json:
{
"version": "a1b2c3d4",
"collections": [
{
"slug": "posts",
"label": "Posts",
"fields": [...]
}
]
}
Umgebungsvariablen
| Variable | Beschreibung |
|---|---|
EMDASH_DATABASE_URL | Datenbank-URL überschreiben |
EMDASH_TOKEN | Auth-Token für Remote-Operationen |
EMDASH_URL | Standard-URL für Befehle, die den gemeinsamen Remote-Client verwenden |
EMDASH_HEADERS | Durch Zeilenumbrüche getrennte eigene Request-Header für den gemeinsamen Remote-Client und login |
EMDASH_ENCRYPTION_KEY | Schlüssel zum Verschlüsseln von Plugin-Secrets im Ruhezustand. Vom Betreiber bereitgestellt — wird nie in der Datenbank gespeichert. Mit emdash secrets generate erzeugen. |
EMDASH_PREVIEW_SECRET | Optionale Überschreibung des HMAC-Secrets für die Vorschau. Wenn nicht gesetzt, erzeugt EmDash eines und speichert es in der Options-Tabelle. |
EMDASH_IP_SALT | Optionale Überschreibung des Salts für den IP-Hash von Kommentierenden. Wenn nicht gesetzt, erzeugt EmDash einen und speichert ihn in der Options-Tabelle. |
EMDASH_AUTH_SECRET | Veraltet. Wird, falls gesetzt, als Quelle für den IP-Salt verwendet, damit bestehende Installationen über ein Upgrade hinweg stabile IP-Hashes von Kommentierenden behalten. Neue Installationen sollten es nicht setzen. |
Paketskripte
Füge häufig verwendete Befehle der Bequemlichkeit halber als package.json-Skripte hinzu:
{
"scripts": {
"dev": "astro dev",
"types": "emdash types",
"export-seed": "emdash export-seed",
"db:reset": "rm -f data.db"
}
}
Allgemeine Exit-Codes
Die meisten Befehle verwenden 0 für Erfolg und 1 für einen Fehler. emdash migrate verwendet für die jeweiligen Ergebnisse außerdem die Codes 2, 3, 4 und 130, die in seiner Exit-Code-Tabelle aufgeführt sind. emdash site import verwendet 2, wenn der Importplan Blocker hat.
| Code | Beschreibung |
|---|---|
0 | Erfolg |
1 | Fehler (Konfiguration, Netzwerk, Datenbank) |