CLI-Referenz

Auf dieser Seite

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:

  1. --token-Flag — explizites Token in der Befehlszeile
  2. EMDASH_TOKEN-Umgebungsvariable
  3. Gespeicherte Anmeldedaten aus ~/.config/emdash/auth.json (von emdash login gespeichert)
  4. 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.

FlagAliasVerfügbar beiBeschreibung und Standardwert
--url-utypes, login, logout, whoami, content, schema, media, search, taxonomy, menu, siteInstanz-URL; Standard ist EMDASH_URL oder http://localhost:4321
--token-ttypes, whoami, content, schema, media, search, taxonomy, menu, siteToken aus dem Flag, aus EMDASH_TOKEN oder aus den gespeicherten Anmeldedaten
--header "Name: Value"-Htypes, login, content, schema, media, search, taxonomy, menu, siteWiederholbarer Header, der mit EMDASH_HEADERS und gespeicherten Headern zusammengeführt wird
--jsonwhoami, content, schema, media, search, taxonomy, menu, siteRohes 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]
OptionAliasBeschreibungStandard
--database-dPfad der SQLite-Datenbank./data.db
--cwdArbeitsverzeichnis des ProjektsAktuelles Verzeichnis
--force-fWendet das Template-Schema erneut an, wenn bereits Collections existierenfalse

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]
OptionAliasBeschreibungStandard
--database-dPfad der SQLite-Datenbank./data.db
--cwdArbeitsverzeichnis des ProjektsAktuelles Verzeichnis
--jsonStrukturierte Ergebnisse ausgebenfalse

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]
OptionAliasBeschreibungStandard
--database-dPfad der SQLite-Datenbank./data.db
--cwdArbeitsverzeichnis des ProjektsAktuelles Verzeichnis
--validateDen Seed validieren, ohne die Datenbank zu ändernfalse
--no-contentEinträge, Bylines und Taxonomie-Begriffe überspringenfalse
--on-conflictVorhandene Datensätze mit skip, update oder error behandelnskip
--uploads-dirLokales Verzeichnis für Seed-Medien./uploads
--media-base-urlBasis-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

OptionBeschreibung
--checkNichts anwenden; mit einem Wert ungleich null beenden, wenn Migrationen ausstehen oder unbekannte Migrationsdatensätze vorliegen
--statusDen genauen Status melden, ohne etwas anzuwenden; nach einem erfolgreichen Bericht mit null beenden
--jsonDen stabilen Migrationsbericht als JSON ausgeben
--manifest <path>Einen nicht standardmäßigen Manifest-Pfad lesen
--from-configDie 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

CodeBedeutung
0Erfolg, einschließlich eines erfolgreichen --status-Berichts
1Fehler 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)
4Bestätigung fehlt, wurde abgelehnt oder der Ziel-Fingerprint stimmt nicht überein
130Nach 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

OptionAliasBeschreibungStandard
--url-uURL der EmDash-Instanzhttp://localhost:4321
--token-tAuth-TokenAus Umgebung oder gespeicherten Anmeldedaten
--header-HEigener Request-Header; wiederholbarAus Umgebung oder gespeicherten Anmeldedaten
--jsonWird akzeptiert, ändert aber weder die Dateien noch die Fortschrittsausgabe dieses Befehls—
--output-oAusgabepfad für die Typen.emdash/types.ts
--cwdArbeitsverzeichnisAktuelles 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

  1. Ruft das Schema von der Instanz ab
  2. Generiert TypeScript-Typdefinitionen
  3. Schreibt die Typen in die Ausgabedatei
  4. Schreibt zur Referenz zusätzlich schema.json daneben

emdash login

Meldet sich über den OAuth Device Flow bei einer EmDash-Instanz an.

npx emdash login [options]

Optionen

OptionAliasBeschreibungStandard
--url-uURL der EmDash-Instanzhttp://localhost:4321
--header-HEigener Request-Header; wiederholbarAus EMDASH_HEADERS

Verhalten

  1. Ermittelt die Auth-Endpunkte der Instanz
  2. Bei localhost ohne konfigurierte Authentifizierung wird der Dev-Bypass automatisch verwendet
  3. 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.
  4. 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

OptionAliasBeschreibungStandard
--url-uURL der EmDash-Instanzhttp://localhost:4321

emdash whoami

Zeigt den aktuell authentifizierten Benutzer an.

npx emdash whoami [options]

Optionen

OptionAliasBeschreibungStandard
--url-uURL der EmDash-Instanzhttp://localhost:4321
--token-tAuth-TokenAus Umgebung/gespeicherten Anmeldedaten
--jsonAls 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
OptionBeschreibung
--statusNach Status filtern
--localeNach Sprachversion (Locale) filtern
--limitMaximale Anzahl an Elementen
--cursorPaginierungs-Cursor

content get <collection> <id>

npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
OptionBeschreibung
--localeZu verwendende Locale, wenn das ID-Argument ein Slug ist
--rawRohen Portable Text statt Markdown zurückgeben
--publishedEinen 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
OptionBeschreibung
--dataJSON-String mit den Inhaltsdaten
--fileDaten aus einer JSON-Datei lesen
--stdinDaten von stdin lesen
--slugSlug des Inhalts
--localeLocale des Inhalts
--translation-ofID eines Inhaltselements, dessen Übersetzung dieses Element sein soll
--draftAls 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"}'
OptionBeschreibung
--revRevisions-Token aus get (erforderlich)
--dataJSON-String mit den Inhaltsdaten
--fileDaten aus einer JSON-Datei lesen
--localeZu verwendende Locale, wenn das ID-Argument ein Slug ist
--draftDie Aktualisierung als Entwurf behalten, statt automatisch zu veröffentlichen
--override-lockAuch 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
OptionBeschreibung
--atISO-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"
OptionBeschreibung
--labelBezeichnung der Collection (erforderlich)
--label-singularBezeichnung im Singular
--descriptionBeschreibung der Collection

schema delete <collection>

npx emdash schema delete articles
npx emdash schema delete articles --force
OptionBeschreibung
--forceBestä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
OptionBeschreibung
--typeFeldtyp: string, text, url, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug oder repeater (erforderlich)
--labelFeldbezeichnung (Standard ist der Feld-Slug)
--requiredOb 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
OptionBeschreibung
--mimeNach MIME-Typ filtern
--limitAnzahl der Elemente
--cursorPaginierungs-Cursor

media upload <file>

npx emdash media upload ./photo.jpg
npx emdash media upload ./photo.jpg --alt "A sunset" --caption "Taken in Bristol"
OptionBeschreibung
--altAlternativtext
--captionBildunterschrift

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
OptionAliasBeschreibung
--collection-cEine Inhalts-Collection reparieren
--allJede 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.

Volltextsuche über Inhalte.

npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
OptionAliasBeschreibung
--collection-cNach Collection filtern
--localeNach Locale filtern
--limit-lMaximale 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
OptionAliasBeschreibung
--limit-lMaximale Anzahl an Begriffen
--cursorPaginierungs-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
OptionBeschreibung
--nameBezeichnung des Begriffs (erforderlich)
--slugSlug des Begriffs (Standard ist der in einen Slug umgewandelte Name)
--parentID des übergeordneten Begriffs (für hierarchische Taxonomien)

emdash menu

Verwaltet Navigationsmenüs.

npx emdash menu list
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
OptionAliasBeschreibungStandard
--output-oZu schreibende Paketdatei (erforderlich)
--no-commentsKommentare und Kommentar-Reaktionen weglassenKommentare 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
OptionBeschreibung
--analyzeDas 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-titleMit --analyze: den Titel dieser Website statt den des Pakets beibehalten
--use-target-taglineMit --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
--confirmDen mit --plan angegebenen Plan ausführen. Erfordert --plan
--yesAlias -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:

BefehlBeschreibung
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:

CodeBedeutung
0Erfolg. Bei status ein Import, der läuft oder abgeschlossen ist
1Ein 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
2Die 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

OptionAliasBeschreibungStandard
--database-dPfad der Datenbankdatei./data.db
--cwdArbeitsverzeichnisAktuelles Verzeichnis
--with-contentInhalte einschließen (alle oder durch Kommas getrennte Collections)
--pretty / --no-prettyEingerückte JSON-Ausgabe aktivieren oder deaktivierenFormatierte 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

VariableBeschreibung
EMDASH_DATABASE_URLDatenbank-URL überschreiben
EMDASH_TOKENAuth-Token für Remote-Operationen
EMDASH_URLStandard-URL für Befehle, die den gemeinsamen Remote-Client verwenden
EMDASH_HEADERSDurch Zeilenumbrüche getrennte eigene Request-Header für den gemeinsamen Remote-Client und login
EMDASH_ENCRYPTION_KEYSchlü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_SECRETOptionale Überschreibung des HMAC-Secrets für die Vorschau. Wenn nicht gesetzt, erzeugt EmDash eines und speichert es in der Options-Tabelle.
EMDASH_IP_SALTOptionale Ü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_SECRETVeraltet. 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.

CodeBeschreibung
0Erfolg
1Fehler (Konfiguration, Netzwerk, Datenbank)