CLI-Referenz

Auf dieser Seite

Die EmDash-CLI bietet Befehle für Datenbankeinrichtung, Typgenerierung, Erstellen und Bearbeiten von Inhalten, Schemaverwaltung, Medien, Site-Export und -Import sowie Plugin-Entwicklung.

Installation

Die CLI ist im Paket emdash enthalten. Installieren Sie sie mit folgendem Befehl:

npm install emdash

Führen Sie Befehle mit npx emdash aus oder fügen Sie Skripte zu package.json hinzu. Die Binary ist der Kürze halber auch als em verfügbar.

Starten Sie Ihre Site mit ihrem Paketskript, z. B. pnpm dev. Das Paketskript startet Astro; die EmDash-Integration generiert emdash-env.d.ts, während die Runtime ausstehende Migrationen beim ersten Request ausführt und den gebündelten Seed anwendet, wenn die Datenbank leer ist und das Setup noch nicht abgeschlossen wurde.

Authentifizierung

Befehle, die eine Verbindung zu einer laufenden EmDash-Instanz herstellen, lösen die Authentifizierung in dieser Reihenfolge auf:

  1. --token-Flag — explizites Token auf der Befehlszeile
  2. EMDASH_TOKEN-Umgebungsvariable
  3. Gespeicherte Anmeldedaten aus ~/.config/emdash/auth.json (gespeichert von emdash login)
  4. Dev-Bypass — wenn die URL localhost ist und kein Token verfügbar ist, wird automatisch über den Dev-Bypass-Endpunkt authentifiziert

Die Befehle types, whoami, content, schema, media, search, taxonomy, menu und site verbinden sich mit einer laufenden Instanz. Authentifizierungsbefehle haben eigene Verbindungsoptionen. Beim Targeting eines lokalen Entwicklungsservers wird kein Token benötigt.

Gemeinsame Flags

Verbindungsflags variieren je nach Befehl. Die unten gruppierten Befehle bedeuten jeden Unterbefehl in dieser Gruppe.

FlagAliasVerfügbar fürBeschreibung und Standard
--url-utypes, login, logout, whoami, content, schema, media, search, taxonomy, menu, siteInstanz-URL; Standard EMDASH_URL oder http://localhost:4321
--token-ttypes, whoami, content, schema, media, search, taxonomy, menu, siteToken vom Flag, EMDASH_TOKEN oder gespeicherten Anmeldedaten
--header "Name: Value"-Htypes, login, content, schema, media, search, taxonomy, menu, siteWiederholbarer Header, gemerged mit EMDASH_HEADERS und gespeicherten Headern
--jsonwhoami, content, schema, media, search, taxonomy, menu, siteRohes JSON statt terminalformatierter Ausgabe schreiben

Ausgabe

Wenn ein Befehl Ergebnisse in ein interaktives Terminal schreibt, formatiert er sie zum Lesen. Die oben mit --json gelisteten Befehle schreiben rohes JSON, wenn das Flag gesetzt ist oder ihre Ausgabe gepiped wird. emdash migrate gibt JSON nur mit seiner expliziten Option --json aus.

Befehle

emdash init

Initialisiert eine lokale SQLite-Datenbank aus den Template-Metadaten in package.json. Der Befehl führt Kernmigrationen aus und wendet dann die optionale SQL-Datei an, die von emdash.schema benannt wird. Führen Sie emdash seed separat für JSON-Seed-Daten aus.

npx emdash init [options]
OptionAliasBeschreibungStandard
--database-dSQLite-Datenbankpfad./data.db
--cwdArbeitsverzeichnis des ProjektsAktuelles Verzeichnis
--force-fTemplate-Schema erneut anwenden, wenn Collections bereits existierenfalse

Ohne --force bleibt eine initialisierte Datenbank unverändert. Dieser Befehl öffnet eine lokale SQLite-Datei direkt; verwenden Sie emdash migrate für deployment-verwaltete D1-, PostgreSQL-, libSQL- oder Hyperdrive-Migrationen.

emdash doctor

Prüft eine lokale SQLite-Datenbank auf Verbindungs-, Migrations-, Collection-, Tabellen- und Benutzerprobleme. Wenn das Projekt eine Wrangler-Konfiguration hat, prüft der Befehl auch, ob ein Cron Trigger und ein EmDash-scheduled()-Handler zusammen konfiguriert sind.

npx emdash doctor [options]
OptionAliasBeschreibungStandard
--database-dSQLite-Datenbankpfad./data.db
--cwdArbeitsverzeichnis des ProjektsAktuelles Verzeichnis
--jsonStrukturierte Ergebnisse ausgebenfalse

Der Befehl meldet jede Prüfung als bestanden, Warnung oder Fehler und beendet mit Nicht-Null, wenn eine Prüfung fehlschlägt.

emdash seed

Validiert oder wendet einen JSON-Seed auf eine lokale SQLite-Datenbank an. Der Befehl verwendet den positionalen Pfad, falls angegeben, dann .emdash/seed.json, dann den Pfad emdash.seed aus package.json.

npx emdash seed [path] [options]
OptionAliasBeschreibungStandard
--database-dSQLite-Datenbankpfad./data.db
--cwdArbeitsverzeichnis des ProjektsAktuelles Verzeichnis
--validateSeed validieren, ohne die Datenbank zu ändernfalse
--no-contentEinträge, Bylines und Taxonomy-Terms ü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 Kernmigrationen aus. Verwenden Sie --validate in der Continuous Integration, wenn Sie die Datei prüfen müssen, ohne die Datenbank zu öffnen oder zu erstellen.

emdash migrate

Prüft oder wendet den Kernmigrationssatz an, der von einem Astro-Build ausgegeben wird.

npx emdash migrate [options]
npx emdash migrate --check [options]
npx emdash migrate --status --json [options]
npx emdash migrate --release-lock <id> [options]

Standardmäßig findet der Befehl die Projektwurzel und liest .emdash/migrations.json. Er validiert das Manifest gegen das installierte EmDash-Paket des Projekts, löst den projektlokalen Executor des Adapters auf und gibt das unveränderliche Ziel aus, bevor SQL ausgeführt wird.

Optionen

OptionBeschreibung
--checkNichts anwenden; Nicht-Null beenden bei ausstehenden oder unbekannten Migrationsdatensätzen
--statusExakten Status ohne Anwenden melden; nach erfolgreichem Bericht mit Null beenden
--jsonStabilen Migrationsbericht als JSON ausgeben
--manifest <path>Nicht-Standard-Manifestpfad lesen
--from-configVertrauenswürdige Astro-Konfiguration explizit auswerten statt eines Manifests
--config <path>Astro-Konfigurationspfad, verwendet mit --from-config
--expected-target-fingerprint <sha256>Erforderliche Absicherung für nicht interaktives Anwenden oder Lock-Freigabe
--release-lock <id>D1-Migrations-Lock mit der von --status gemeldeten ID freigeben; nicht kombinierbar mit --check oder --status
--database <path>SQLite-Pfad überschreiben
--database-url-env <name>PostgreSQL-Verbindungsvariablennamen überschreiben
--d1 <uuid-or-name>D1-Datenbank explizit auswählen
--account-id <id>Cloudflare-Konto explizit auswählen
--wrangler-config <path>D1-Binding-Metadaten aus einer expliziten Wrangler-Konfiguration lesen
--wrangler-env <name>Umgebung auswählen; erfordert --wrangler-config

Interaktives menschenlesbares Anwenden und Lock-Freigabe fragen nach Bestätigung. Nicht interaktives Anwenden oder Lock-Freigabe sowie jedes Anwenden oder Lock-Freigabe mit --json erfordern den exakten Fingerprint, der für das Ziel gedruckt wurde. Es gibt kein down oder --dry-run; verwenden Sie --check, um zu bestimmen, ob Arbeit erforderlich ist.

Exit-Codes

CodeBedeutung
0Erfolg, einschließlich eines erfolgreichen --status-Berichts
1Validierungs-, Konfigurations-, Ziel-, Migrations- oder Cleanup-Fehler
2--check fand ausstehende bekannte Migrationen
3--check fand unbekannte angewendete Datensätze (hat Vorrang vor ausstehend)
4Bestätigung fehlt, abgelehnt oder Ziel-Fingerprint stimmt nicht überein
130Unterbrochen nach begrenztem Executor-Cleanup

Siehe Manage Core Database Migrations für Deployment-Reihenfolge, Zielanmeldedaten und den D1-Migrations-Lock.

emdash dev (veraltet)

Der Legacy-Befehl initialisiert und migriert eine lokale SQLite-Datenbank, bevor Astro gestartet wird. Dieses Verhalten verwendet nicht den von der Site konfigurierten Datenbankadapter und ist inkompatibel mit der Cloudflare-D1-Entwicklung. Bestehende Aufrufe drucken jetzt eine Deprecation-Warnung, bevor Datenbankarbeit ausgeführt wird.

OptionAliasBeschreibungStandard
--database-dLokaler SQLite-Datenbankpfad./data.db
--types-tRemote-Typen vor dem Start von Astro abrufenfalse
--port-pPort des Astro-Entwicklungsservers4321
--cwdArbeitsverzeichnis des ProjektsAktuelles Verzeichnis

emdash types

Generiert TypeScript-Typen aus dem Schema einer laufenden EmDash-Instanz.

npx emdash types [options]

Optionen

OptionAliasBeschreibungStandard
--url-uEmDash-Instanz-URLhttp://localhost:4321
--token-tAuth-TokenAus Env oder gespeicherten Anmeldedaten
--header-HBenutzerdefinierter Request-Header; wiederholbarAus Env oder gespeicherten Anmeldedaten
--jsonAkzeptiert, ändert aber weder die Dateien noch die Fortschrittsausgabe dieses Befehls—
--output-oAusgabepfad für 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://my-site.pages.dev

# 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 Typen in die Ausgabedatei
  4. Schreibt schema.json daneben als Referenz

emdash login

Meldet sich bei einer EmDash-Instanz mit OAuth Device Flow an.

npx emdash login [options]

Optionen

OptionAliasBeschreibungStandard
--url-uEmDash-Instanz-URLhttp://localhost:4321
--header-HBenutzerdefinierter Request-Header; wiederholbarAus EMDASH_HEADERS

Verhalten

  1. Entdeckt Auth-Endpunkte von der Instanz
  2. Wenn localhost und keine Auth konfiguriert, verwendet automatisch Dev-Bypass
  3. Andernfalls startet OAuth Device Flow — zeigt einen Code an und öffnet Ihren Browser. Nach Eingabe des Codes listet die Admin-Seite die Berechtigungen auf, die die CLI erhält, und alle angeforderten Berechtigungen, die Ihre Rolle nicht erlaubt, bevor Sie genehmigen.
  4. Pollt auf Autorisierung und speichert dann Anmeldedaten in ~/.config/emdash/auth.json

Gespeicherte Anmeldedaten werden automatisch von allen nachfolgenden Befehlen verwendet, die dieselbe Instanz anvisieren.

emdash logout

Meldet ab und entfernt gespeicherte Anmeldedaten.

npx emdash logout [options]

Optionen

OptionAliasBeschreibungStandard
--url-uEmDash-Instanz-URLhttp://localhost:4321

emdash whoami

Zeigt den aktuell authentifizierten Benutzer.

npx emdash whoami [options]

Optionen

OptionAliasBeschreibungStandard
--url-uEmDash-Instanz-URLhttp://localhost:4321
--token-tAuth-TokenAus Env/gespeicherten Creds
--jsonAls JSON ausgeben

Zeigt E-Mail, Name, Rolle, Auth-Methode und Instanz-URL an.

emdash content

Verwaltet Inhaltsobjekte. 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 Locale filtern
--limitMaximale Anzahl Items
--cursorPaginierungs-Cursor

content get <collection> <id>

npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
OptionBeschreibung
--localeLocale, wenn das ID-Argument ein Slug ist
--rawRohes Portable Text statt Markdown zurückgeben
--publishedAusstehenden Entwurf ignorieren und nur veröffentlichte Daten zurückgeben

Die Antwort enthält ein _rev-Token. Übergeben Sie es an content update, um zu bestätigen, dass Sie den aktuellen Zustand gesehen haben, bevor Sie ihn ü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
OptionBeschreibung
--dataJSON-String mit Inhaltsdaten
--fileDaten aus einer JSON-Datei lesen
--stdinDaten von stdin lesen
--slugInhalts-Slug
--localeInhalts-Locale
--translation-ofID eines Inhaltsobjekts, mit dem dies als Übersetzung verknüpft wird
--draftAls Entwurf behalten statt automatisch zu veröffentlichen

Stellen Sie Daten über genau eines von --data, --file oder --stdin bereit. Neue Items werden automatisch veröffentlicht, sofern nicht --draft gesetzt ist.

content update <collection> <id>

Sie müssen das _rev-Token von einem vorherigen get bereitstellen, um zu beweisen, dass Sie den aktuellen Zustand gesehen haben. Das verhindert das Überschreiben von Änderungen, die Sie nicht gesehen haben. Die folgenden Schritte lesen ein Item 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 von get (erforderlich)
--dataJSON-String mit Inhaltsdaten
--fileDaten aus einer JSON-Datei lesen
--localeLocale, wenn das ID-Argument ein Slug ist
--draftUpdate als Entwurf behalten statt automatisch zu veröffentlichen
--override-lockSchreiben, obwohl ein anderer Editor den Eintrag geöffnet hat

Wenn sich das Item seit Ihrem get geändert hat, gibt der Server 409 Conflict zurück — erneut lesen und erneut versuchen.

Wenn jemand den Eintrag im Admin geöffnet hat, gibt der Server 409 mit Code ENTRY_LOCKED und einer Nachricht zurück, die den Inhaber nennt. Warten Sie, bis er fertig ist, oder übergeben Sie --override-lock. Dasselbe Flag ist für content delete, content publish, content unpublish und content schedule verfügbar.

content delete <collection> <id>

npx emdash content delete posts 01ABC123

Löscht das Inhaltsobjekt soft (verschiebt in den Papierkorb).

Übergeben Sie --override-lock, um einen Eintrag zu löschen, den ein anderer Editor geöffnet hat.

content publish <collection> <id>

npx emdash content publish posts 01ABC123

Übergeben Sie --override-lock, um einen Eintrag zu veröffentlichen, den ein anderer Editor geöffnet hat.

content unpublish <collection> <id>

npx emdash content unpublish posts 01ABC123

Übergeben Sie --override-lock, um die Veröffentlichung eines Eintrags aufzuheben, den ein anderer Editor geöffnet hat.

content schedule <collection> <id>

npx emdash content schedule posts 01ABC123 --at 2026-03-01T09:00:00Z
OptionBeschreibung
--atISO-8601-Datetime mit Z oder einem expliziten UTC-Offset (erforderlich)

Übergeben Sie --override-lock, um einen Eintrag zu planen, den ein anderer Editor geöffnet hat.

content restore <collection> <id>

npx emdash content restore posts 01ABC123

Stellt ein in den Papierkorb verschobenes Inhaltsobjekt wieder her.

content translations <collection> <id>

Listet jede Übersetzung in der Übersetzungsgruppe des Eintrags:

npx emdash content translations posts 01ABC123

Das Ergebnis enthält ID, Locale, Slug, Status jeder Übersetzung und ob es der angeforderte Eintrag ist.

emdash schema

Verwaltet Collections und Felder.

schema list

npx emdash schema list

Listet alle Collections.

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
--labelCollection-Label (erforderlich)
--label-singularSingular-Label
--descriptionCollection-Beschreibung

schema delete <collection>

npx emdash schema delete articles
npx emdash schema delete articles --force
OptionBeschreibung
--forceBestätigung überspringen

Fragt nach 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)
--labelFeldlabel (Standard: Feld-Slug)
--requiredOb das Feld erforderlich ist

schema remove-field <collection> <field>

npx emdash schema remove-field posts featured

emdash media

Verwaltet Medienobjekte.

media list

npx emdash media list
npx emdash media list --mime image/png --limit 20
OptionBeschreibung
--mimeNach MIME-Typ filtern
--limitAnzahl der Items
--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
--altAlt-Text
--captionCaption-Text

media get <id>

npx emdash media get 01MEDIA123

media delete <id>

npx emdash media delete 01MEDIA123

media repair-usage

Repariert Inhalts-Mediennutzungsindizes für eine Collection oder für jede Inhalts-Collection. Verwenden Sie dies nach Importen oder direkten Datenbankschreibvorgängen, 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

Übergeben Sie genau eines von --collection oder --all. Remote-Reparatur erfordert einen Admin-Benutzer und ein Auth-Token mit dem Scope admin.

Die Reparatur für alle Inhalte läuft synchron und kann auf großen Sites langsam oder teuer sein. Bevorzugen Sie --collection, wenn Sie nur eine Collection reparieren müssen.

Strukturierte Ergebnisse complete, partial und stale beenden mit 0; strukturierte failed-Ergebnisse beenden mit 1. Automatisierung und Cron-Jobs sollten --json verwenden und status, failedSourceCount, skippedSourceCount sowie pro-Collection-Zusammenfassungen parsen, statt Exit 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 Ergebnisse

emdash taxonomy

Verwaltet Taxonomien und Terms.

taxonomy list

npx emdash taxonomy list

taxonomy terms <name>

npx emdash taxonomy terms categories
npx emdash taxonomy terms tags --limit 50
OptionAliasBeschreibung
--limit-lMaximale Terms
--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
--nameTerm-Label (erforderlich)
--slugTerm-Slug (Standard: slugifizierter Name)
--parentEltern-Term-ID (für hierarchische Taxonomien)

emdash menu

Verwaltet Navigationsmenüs.

npx emdash menu list
npx emdash menu get primary

Gibt das Menü mit allen seinen Items zurück.

emdash site

Exportiert eine ganze Site in ein .emdash-Site-Paket und importiert ein Paket in eine leere Site. Der Site-Transfer-Leitfaden erklärt, was ein Paket enthält, was die Zielsite braucht und wie man einen Importplan liest.

Das Token braucht den Scope admin, den das Token von emdash login hat, oder die passenden Transfer-Scopes: transfer:export zum Exportieren und transfer:analyze sowie transfer:execute zum Importieren. Ein Token ohne sie schlägt mit INSUFFICIENT_SCOPE fehl.

Fortschrittsmeldungen gehen immer nach stderr, das Ergebnis nach 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, plus INVALID_ARGUMENT für ungültige Flags, PACKAGE_FILE_REQUIRED, wenn ein fortgesetzter Import die Paketdatei noch braucht, und UNKNOWN_ERROR.

Die Befehle wiederholen Netzwerkfehler und Antworten 408, 429 und 5xx mit Backoff.

site export

Exportiert die Site und schreibt sie in eine Paketdatei:

npx emdash site export --output site.emdash
OptionAliasBeschreibungStandard
--output-oZu schreibende Paketdatei (erforderlich)
--no-commentsKommentare und Kommentarreaktionen weglassenKommentare eingeschlossen

Der Befehl startet einen Export, führt ihn bis zum Abschluss fort und lädt die Paketdatei Datei für Datei herunter. Er prüft, dass das heruntergeladene Manifest mit dem Paket-Digest des Exports übereinstimmt, und schlägt mit TRANSFER_PACKAGE_DIGEST_MISMATCH fehl, bevor etwas geschrieben wird, wenn nicht. Er prüft Größe und SHA-256-Digest jeder Datei vor dem Schreiben. Das Paket wird nach <output>.partial geschrieben und bei Abschluss zum Ausgabepfad umbenannt.

Der Befehl speichert seinen Fortschritt in <output>.partial.json und die heruntergeladenen Dateien im Verzeichnis <output>.parts/. Führen Sie denselben Befehl nach einer Unterbrechung erneut aus, um denselben Export fortzusetzen; bereits heruntergeladene Dateien werden geprüft und wiederverwendet, und der Befehl meldet, wie viele wiederverwendet wurden. Beide werden 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. Analysieren Sie es zuerst und bestätigen Sie dann den Plan-Digest, den die Analyse gedruckt hat:

npx emdash site import site.emdash --analyze
npx emdash site import site.emdash --plan sha256:3f1c… --confirm
OptionBeschreibung
--analyzePaket hochladen, analysieren und den Importplan drucken
--map-principal <from>=<to>Mit --analyze: einen Paket-Principal nach ID oder E-Mail-Adresse auf einen Site-Benutzer nach ID oder E-Mail-Adresse oder auf none abbilden. Wiederholbar
--use-target-titleMit --analyze: Titel dieser Site behalten statt den des Pakets
--use-target-taglineMit --analyze: Tagline dieser Site behalten statt die des Pakets
--plan <digest>Auszuführender Plan-Digest als sha256:<hex> oder bare hex. Erfordert --confirm
--confirmDen von --plan angegebenen Plan ausführen. Erfordert --plan
--yesAlias -y. Mit cancel oder abandon: Bestätigungsabfrage überspringen

--analyze verifiziert die gesamte Paketdatei lokal, findet dann den vorhandenen Import derselben Pakets der Site oder erstellt einen. Es lädt die Dateien hoch, die die Site noch nicht hat, führt die Analyse aus und druckt den Plan: Paket- und Plan-Digests, Datensatzanzahlen, Größen, Titel- und Tagline-Wahl, jeden Principal und seine Abbildung, die Transformationen unter „Differences from the source site“, die Warnungen und die Blocker. Wenn ein früherer Import desselben Pakets fehlgeschlagen, 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 Entscheidungsflags sie behä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 mit dem aktuellen Plan übereinstimmt, führt ihn dann bis zum Abschluss fort und druckt die Quittung. Wenn sich der Plan seit Ihrer Prüfung geändert hat, schlägt der Befehl mit TRANSFER_PLAN_DIGEST_MISMATCH fehl; analysieren Sie erneut und bestätigen Sie 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 meldet, ob der receiptDigest der Quittung mit ihrem Inhalt übereinstimmt.

Diese Formen arbeiten mit einem Import über seine Operations-ID:

CommandDescription
emdash site import status <operation-id>Print the import’s state, stage, progress, digests, and error, and how many files are uploaded. The JSON result is { operation, files: { declared, verified } }.
emdash site import resume <operation-id> [file]Continue the import from its current state: finish uploading, finish analysis and print the plan, or finish execution and print the receipt. Pass the package file only while the import is still uploading.
emdash site import receipt <operation-id>Print the receipt of a complete import, in the same shape as --confirm.
emdash site import cancel <operation-id>Cancel the import. A running import stops after its current batch; what it already wrote stays on the site.
emdash site import abandon <operation-id>Lift the write block that a failed or cancelled import leaves on the site. What the import wrote is not deleted, so reset the site or set up a new one before importing again.

cancel und abandon fragen nach Bestätigung. Übergeben Sie --yes, um die Abfrage zu überspringen; die Abfrage wird auch mit --json oder wenn stdout kein Terminal ist übersprungen. Wenn stdin kein Terminal ist und keines davon gilt, schlägt der Befehl mit INVALID_ARGUMENT fehl. Das Ablehnen der Abfrage ändert nichts und beendet mit Code 1. Das JSON-Ergebnis beider ist { operationId, state, operation }.

Die Importbefehle beenden mit diesen Codes:

CodeMeaning
0Success. For status, an import that is in progress or complete
1An error, a declined prompt, an import that ended without a receipt, or a receipt whose digest does not match. For status, an import that failed, was cancelled or abandoned, or expired
2Analysis finished, but the plan has blockers

emdash plugin

Erstellt, validiert, bündelt und veröffentlicht EmDash-Plugins. Marketplace-Login ist getrennt vom Login bei einer CMS-Instanz.

plugin init

Gerüstet ein sandboxed oder natives Plugin:

npx emdash plugin init --dir ./my-plugin --name my-plugin --format sandboxed
OptionBeschreibungStandard
--dirZu erstellendes VerzeichnisAktuelles Verzeichnis
--namePlugin-Paketname oder IDInteraktive Abfrage
--formatsandboxed oder nativeInteraktive Abfrage
--nativeKurzform für --format nativefalse

plugin bundle

Validiert ein Plugin und erstellt seinen Marketplace-Tarball:

npx emdash plugin bundle --dir ./my-plugin --outDir ./artifacts
OptionAliasBeschreibungStandard
--dirPlugin-VerzeichnisAktuelles Verzeichnis
--outDir-oTarball-Ausgabeverzeichnis./dist
--validateOnlyValidierung ohne Tarball-Erstellung ausführenfalse

plugin validate

Führt dieselbe Validierung wie plugin bundle ohne Tarball-Erstellung aus:

npx emdash plugin validate --dir ./my-plugin

Das optionale --dir wählt das Plugin-Verzeichnis und ist standardmäßig das aktuelle Verzeichnis.

plugin publish

Lädt ein Bundle in den Marketplace hoch und wartet standardmäßig auf sein Verarbeitungsergebnis:

npx emdash plugin publish --tarball ./dist/my-plugin-1.0.0.tar.gz
OptionBeschreibungStandard
--tarballVorhandener Plugin-Tarball—
--dirPlugin-Verzeichnis, verwendet mit --buildAktuelles Verzeichnis
--buildPlugin vor dem Upload bauenfalse
--registryMarketplace-Basis-URLhttps://marketplace.emdashcms.com
--no-waitNach dem Upload beenden, ohne auf das Verarbeitungsergebnis zu wartenfalse

Stellen Sie --tarball bereit oder übergeben Sie --build, um zuerst aus --dir zu bauen.

plugin login

Authentifiziert sich beim Marketplace über GitHub Device Flow. --registry wählt einen anderen Marketplace und ist standardmäßig https://marketplace.emdashcms.com.

npx emdash plugin login

plugin logout

Entfernt die gespeicherte Marketplace-Anmeldedaten. Das optionale --registry muss denselben Marketplace wie beim Login identifizieren.

npx emdash plugin logout

emdash export-seed

Exportiert Datenbankschema und Inhalt als Seed-Datei. Arbeitet direkt auf einer lokalen SQLite-Datei.

Die Datenbank muss jede Migration haben, die der installierten EmDash-Version bekannt ist. Wenn der Befehl ausstehende Migrationen meldet, führen Sie npx emdash migrate aus und exportieren Sie erneut. Wenn die Datenbank von einer neueren EmDash-Version migriert wurde, aktualisieren Sie die installierte Version vor dem Export. Der Export öffnet die Datenbank schreibgeschützt und wendet selbst nie Migrationen an.

npx emdash export-seed [options] > seed.json

Optionen

OptionAliasBeschreibungStandard
--database-dDatenbankdateipfad./data.db
--cwdArbeitsverzeichnisAktuelles Verzeichnis
--with-contentInhalt einschließen (alle oder komma-getrennte Collections)
--pretty / --no-prettyEingrückte JSON-Ausgabe aktivieren oder deaktivierenPretty-Ausgabe aktiviert
--media-base-urlÖffentliche URL der Site, verwendet um absolute $media-URLs zu schreiben

Ausgabeformat

Die exportierte Seed-Datei enthält:

  • Settings: Site-Titel, Tagline, Social Links
  • Collections: Alle Collection-Definitionen mit Feldern
  • Block types: Jede beibehaltene Version und der aktive Versionszeiger jedes Typs
  • Taxonomies: Taxonomy-Definitionen und Terms
  • Menus: Navigationsmenüs mit Items
  • Redirects: Redirect-Regeln mit Status 301, 302, 307 oder 308
  • Widget Areas: Widget-Bereiche und Widgets
  • Sections: Wiederverwendbare Inhaltsblöcke
  • Content (falls angefordert): Einträge mit $media-Referenzen und $ref:-Syntax für Portabilität

Geplante Einträge werden als Entwürfe exportiert, weil ein Seed kein Feld für eine Veröffentlichungszeit hat. Der Export lässt mit einer Warnung auf stderr weg, was emdash seed ablehnen würde: Redirect-Regeln mit Status 410 oder 451, zusätzliche Regeln, die dieselbe Quelle teilen (möglich in älteren Datenbanken), 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 Zielsite hoch, daher braucht es eine absolute http- oder https-URL, die erreichbar ist. Übergeben Sie die öffentliche URL der Quellsite, um absolute URLs zu schreiben:

npx emdash export-seed --with-content=all --media-base-url=https://example.com > seed.json

Die Site muss ihre Medien unter /_emdash/api/media/file/ unter dieser URL bedienen, während der Seed angewendet wird, und die URL darf nicht auf localhost oder eine private Netzadresse zeigen, von der emdash seed den Download verweigert. Ohne --media-base-url sind $media-URLs site-relative Pfade, die emdash seed überspringt, wodurch die Felder leer bleiben, und der Export druckt eine Warnung auf stderr.

Bild- und Dateifeldern sowie Bild-Unterfelder von Repeaters werden als $media-Referenzen exportiert. Bilder in Portable-Text-Feldern behalten ihre gespeicherte Medien-ID und URL, die auf einer anderen Site nicht aufgelöst werden.

emdash secrets

Generiert und prüft den Schlüssel, der zum Verschlüsseln von Plugin-Geheimnissen verwendet wird.

secrets generate

Generiert einen EMDASH_ENCRYPTION_KEY für Ihr Deployment. Der Schlüssel wird verwendet, um Plugin-Geheimnisse im Ruhezustand zu verschlüsseln.

npx emdash secrets generate

Druckt den neuen Schlüssel nach stdout. Pipen Sie ihn in Ihren Secret-Store oder schreiben Sie ihn mit --write direkt in Ihre 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; laden Sie sie über den Process Manager oder stellen Sie den Schlüssel über die Prozessumgebung des Servers bereit. Der Node.js-Deployment- Leitfaden 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, stellen Sie den generierten Schlüssel dem vorhandenen Wert voran und trennen Sie die Schlüssel mit einem Komma. EmDash verschlüsselt neue Werte mit dem ersten Schlüssel und verwendet ältere Einträge zur Entschlüsselung per kid. Speichern Sie jedes Plugin-Geheimnis erneut, bevor Sie einen alten Schlüssel entfernen. EmDash listet derzeit nicht die Key-IDs auf, die noch von gespeicherten Einstellungen verwendet werden, daher führen Sie eine Inventarisierung der erneut gespeicherten Anmeldedaten und verifizieren Sie jede Integration, bevor Sie deren alten Schlüssel entfernen.

secrets fingerprint <key>

Druckt den 8-Zeichen-Fingerprint (kid) eines Schlüssels, ohne seinen Wert preiszugeben. Das ist in CI nützlich, um zu prüfen, dass der richtige Schlüssel deployed wurde. Der folgende Befehl druckt den Fingerprint eines Schlüssels:

npx emdash secrets fingerprint emdash_enc_v1_...

emdash auth (veraltet)

auth secret

Generiert einen Legacy-EMDASH_AUTH_SECRET-Wert:

npx emdash auth secret

Bestehende Installationen können diese Variable behalten, um stabile Kommentator-IP-Hashes zu bewahren. Sie verschlüsselt keine Plugin-Geheimnisse.

Generierte Dateien

emdash-env.d.ts

Die Astro-Integration generiert emdash-env.d.ts im Projektstamm, wenn der lokale Entwicklungsserver startet. Sie aktualisiert die Datei nach Schemaänderungen, die über die laufende Entwicklungs-Site vorgenommen wurden. Die Deklarationen erweitern EmDashCollections, sodass Aufrufe wie getEmDashCollection("posts") die in der lokalen Datenbank definierten Felder inferieren.

Diese Datei ist automatisch und gehört zum lokalen Astro-Entwicklungsworkflow. Sie müssen emdash types nicht ausführen, um sie zu erstellen.

.emdash/types.ts

Der Befehl emdash types ruft das Schema einer laufenden Instanz ab und schreibt eigenständige TypeScript-Interfaces. Verwenden Sie ihn, wenn das Schema auf einer Remote-EmDash-Instanz liegt, wenn Tools eine Datei an einem benutzerdefinierten Pfad brauchen 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 Sie emdash types ausführen; emdash-env.d.ts verwendet Modul-Augmentation und aktualisiert sich als Teil der lokalen Entwicklung.

.emdash/schema.json

Der Befehl schreibt auch einen rohen Schema-Export namens schema.json neben der gewählten TypeScript-Ausgabe. Mit dem 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 Zeilenumbruch getrennte benutzerdefinierte Request-Header für den gemeinsamen Remote-Client und login
EMDASH_ENCRYPTION_KEYSchlüssel zum Verschlüsseln von Plugin-Geheimnissen im Ruhezustand. Vom Operator bereitgestellt — nie in der Datenbank gespeichert. Mit emdash secrets generate generieren.
EMDASH_PREVIEW_SECRETOptionaler Override für das Preview-HMAC-Geheimnis. Wenn nicht gesetzt, generiert und persistiert EmDash eines in der Options-Tabelle.
EMDASH_IP_SALTOptionaler Override für das Kommentator-IP-Hash-Salt. Wenn nicht gesetzt, generiert und persistiert EmDash eines in der Options-Tabelle.
EMDASH_AUTH_SECRETLegacy. Wird als IP-Salt-Quelle verwendet, falls gesetzt, damit bestehende Installationen stabile Kommentator-IP-Hashes über Upgrades behalten. Neue Installationen sollten dies nicht setzen.

Paketskripte

Fügen Sie gängige Befehle als package.json-Skripte zur Bequemlichkeit 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 auch die Codes 2, 3, 4 und 130 für die spezifischen Ergebnisse in seiner Exit-Code-Tabelle. emdash site import verwendet 2, wenn der Importplan Blocker hat.

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