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:
--token-Flag — explizites Token auf der BefehlszeileEMDASH_TOKEN-Umgebungsvariable- Gespeicherte Anmeldedaten aus
~/.config/emdash/auth.json(gespeichert vonemdash login) - 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.
| Flag | Alias | Verfügbar für | Beschreibung und Standard |
|---|---|---|---|
--url | -u | types, login, logout, whoami, content, schema, media, search, taxonomy, menu, site | Instanz-URL; Standard EMDASH_URL oder http://localhost:4321 |
--token | -t | types, whoami, content, schema, media, search, taxonomy, menu, site | Token vom Flag, EMDASH_TOKEN oder gespeicherten Anmeldedaten |
--header "Name: Value" | -H | types, login, content, schema, media, search, taxonomy, menu, site | Wiederholbarer Header, gemerged mit EMDASH_HEADERS und gespeicherten Headern |
--json | whoami, content, schema, media, search, taxonomy, menu, site | Rohes 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]
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | SQLite-Datenbankpfad | ./data.db |
--cwd | Arbeitsverzeichnis des Projekts | Aktuelles Verzeichnis | |
--force | -f | Template-Schema erneut anwenden, wenn Collections bereits existieren | false |
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]
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | SQLite-Datenbankpfad | ./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 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]
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | SQLite-Datenbankpfad | ./data.db |
--cwd | Arbeitsverzeichnis des Projekts | Aktuelles Verzeichnis | |
--validate | Seed validieren, ohne die Datenbank zu ändern | false | |
--no-content | Einträge, Bylines und Taxonomy-Terms ü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 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
| Option | Beschreibung |
|---|---|
--check | Nichts anwenden; Nicht-Null beenden bei ausstehenden oder unbekannten Migrationsdatensätzen |
--status | Exakten Status ohne Anwenden melden; nach erfolgreichem Bericht mit Null beenden |
--json | Stabilen Migrationsbericht als JSON ausgeben |
--manifest <path> | Nicht-Standard-Manifestpfad lesen |
--from-config | Vertrauenswü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
| Code | Bedeutung |
|---|---|
0 | Erfolg, einschließlich eines erfolgreichen --status-Berichts |
1 | Validierungs-, Konfigurations-, Ziel-, Migrations- oder Cleanup-Fehler |
2 | --check fand ausstehende bekannte Migrationen |
3 | --check fand unbekannte angewendete Datensätze (hat Vorrang vor ausstehend) |
4 | Bestätigung fehlt, abgelehnt oder Ziel-Fingerprint stimmt nicht überein |
130 | Unterbrochen 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.
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Lokaler SQLite-Datenbankpfad | ./data.db |
--types | -t | Remote-Typen vor dem Start von Astro abrufen | false |
--port | -p | Port des Astro-Entwicklungsservers | 4321 |
--cwd | Arbeitsverzeichnis des Projekts | Aktuelles Verzeichnis |
emdash types
Generiert TypeScript-Typen aus dem Schema einer laufenden EmDash-Instanz.
npx emdash types [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | EmDash-Instanz-URL | http://localhost:4321 |
--token | -t | Auth-Token | Aus Env oder gespeicherten Anmeldedaten |
--header | -H | Benutzerdefinierter Request-Header; wiederholbar | Aus Env oder gespeicherten Anmeldedaten |
--json | Akzeptiert, ändert aber weder die Dateien noch die Fortschrittsausgabe dieses Befehls | — | |
--output | -o | Ausgabepfad für Typen | .emdash/types.ts |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis |
Beispiele
# Generate types from local dev server
npx emdash types
# Generate from remote instance
npx emdash types --url https://my-site.pages.dev
# Custom output path
npx emdash types --output src/types/emdash.ts
Verhalten
- Ruft das Schema von der Instanz ab
- Generiert TypeScript-Typdefinitionen
- Schreibt Typen in die Ausgabedatei
- Schreibt
schema.jsondaneben als Referenz
emdash login
Meldet sich bei einer EmDash-Instanz mit OAuth Device Flow an.
npx emdash login [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | EmDash-Instanz-URL | http://localhost:4321 |
--header | -H | Benutzerdefinierter Request-Header; wiederholbar | Aus EMDASH_HEADERS |
Verhalten
- Entdeckt Auth-Endpunkte von der Instanz
- Wenn localhost und keine Auth konfiguriert, verwendet automatisch Dev-Bypass
- 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.
- 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
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | EmDash-Instanz-URL | http://localhost:4321 |
emdash whoami
Zeigt den aktuell authentifizierten Benutzer.
npx emdash whoami [options]
Optionen
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--url | -u | EmDash-Instanz-URL | http://localhost:4321 |
--token | -t | Auth-Token | Aus Env/gespeicherten Creds |
--json | Als 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
| Option | Beschreibung |
|---|---|
--status | Nach Status filtern |
--locale | Nach Locale filtern |
--limit | Maximale Anzahl Items |
--cursor | Paginierungs-Cursor |
content get <collection> <id>
npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
| Option | Beschreibung |
|---|---|
--locale | Locale, wenn das ID-Argument ein Slug ist |
--raw | Rohes Portable Text statt Markdown zurückgeben |
--published | Ausstehenden 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
| Option | Beschreibung |
|---|---|
--data | JSON-String mit Inhaltsdaten |
--file | Daten aus einer JSON-Datei lesen |
--stdin | Daten von stdin lesen |
--slug | Inhalts-Slug |
--locale | Inhalts-Locale |
--translation-of | ID eines Inhaltsobjekts, mit dem dies als Übersetzung verknüpft wird |
--draft | Als 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"}'
| Option | Beschreibung |
|---|---|
--rev | Revisions-Token von get (erforderlich) |
--data | JSON-String mit Inhaltsdaten |
--file | Daten aus einer JSON-Datei lesen |
--locale | Locale, wenn das ID-Argument ein Slug ist |
--draft | Update als Entwurf behalten statt automatisch zu veröffentlichen |
--override-lock | Schreiben, 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
| Option | Beschreibung |
|---|---|
--at | ISO-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"
| Option | Beschreibung |
|---|---|
--label | Collection-Label (erforderlich) |
--label-singular | Singular-Label |
--description | Collection-Beschreibung |
schema delete <collection>
npx emdash schema delete articles
npx emdash schema delete articles --force
| Option | Beschreibung |
|---|---|
--force | Bestä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
| Option | Beschreibung |
|---|---|
--type | Feldtyp: string, text, url, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug oder repeater (erforderlich) |
--label | Feldlabel (Standard: Feld-Slug) |
--required | Ob 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
| Option | Beschreibung |
|---|---|
--mime | Nach MIME-Typ filtern |
--limit | Anzahl der Items |
--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 | Alt-Text |
--caption | Caption-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
| Option | Alias | Beschreibung |
|---|---|---|
--collection | -c | Eine Inhalts-Collection reparieren |
--all | Jede 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.
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 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
| Option | Alias | Beschreibung |
|---|---|---|
--limit | -l | Maximale Terms |
--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 | Term-Label (erforderlich) |
--slug | Term-Slug (Standard: slugifizierter Name) |
--parent | Eltern-Term-ID (für hierarchische Taxonomien) |
emdash menu
Verwaltet Navigationsmenüs.
menu list
npx emdash menu list
menu get <name>
npx emdash menu get primary
Gibt das Menü mit 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
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--output | -o | Zu schreibende Paketdatei (erforderlich) | |
--no-comments | Kommentare und Kommentarreaktionen weglassen | Kommentare 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
| Option | Beschreibung |
|---|---|
--analyze | Paket 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-title | Mit --analyze: Titel dieser Site behalten statt den des Pakets |
--use-target-tagline | Mit --analyze: Tagline dieser Site behalten statt die des Pakets |
--plan <digest> | Auszuführender Plan-Digest als sha256:<hex> oder bare hex. Erfordert --confirm |
--confirm | Den von --plan angegebenen Plan ausführen. Erfordert --plan |
--yes | Alias -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:
| Command | Description |
|---|---|
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:
| Code | Meaning |
|---|---|
0 | Success. For status, an import that is in progress or complete |
1 | An 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 |
2 | Analysis 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
| Option | Beschreibung | Standard |
|---|---|---|
--dir | Zu erstellendes Verzeichnis | Aktuelles Verzeichnis |
--name | Plugin-Paketname oder ID | Interaktive Abfrage |
--format | sandboxed oder native | Interaktive Abfrage |
--native | Kurzform für --format native | false |
plugin bundle
Validiert ein Plugin und erstellt seinen Marketplace-Tarball:
npx emdash plugin bundle --dir ./my-plugin --outDir ./artifacts
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--dir | Plugin-Verzeichnis | Aktuelles Verzeichnis | |
--outDir | -o | Tarball-Ausgabeverzeichnis | ./dist |
--validateOnly | Validierung ohne Tarball-Erstellung ausführen | false |
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
| Option | Beschreibung | Standard |
|---|---|---|
--tarball | Vorhandener Plugin-Tarball | — |
--dir | Plugin-Verzeichnis, verwendet mit --build | Aktuelles Verzeichnis |
--build | Plugin vor dem Upload bauen | false |
--registry | Marketplace-Basis-URL | https://marketplace.emdashcms.com |
--no-wait | Nach dem Upload beenden, ohne auf das Verarbeitungsergebnis zu warten | false |
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
| Option | Alias | Beschreibung | Standard |
|---|---|---|---|
--database | -d | Datenbankdateipfad | ./data.db |
--cwd | Arbeitsverzeichnis | Aktuelles Verzeichnis | |
--with-content | Inhalt einschließen (alle oder komma-getrennte Collections) | ||
--pretty / --no-pretty | Eingrückte JSON-Ausgabe aktivieren oder deaktivieren | Pretty-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
| 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 Zeilenumbruch getrennte benutzerdefinierte Request-Header für den gemeinsamen Remote-Client und login |
EMDASH_ENCRYPTION_KEY | Schlüssel zum Verschlüsseln von Plugin-Geheimnissen im Ruhezustand. Vom Operator bereitgestellt — nie in der Datenbank gespeichert. Mit emdash secrets generate generieren. |
EMDASH_PREVIEW_SECRET | Optionaler Override für das Preview-HMAC-Geheimnis. Wenn nicht gesetzt, generiert und persistiert EmDash eines in der Options-Tabelle. |
EMDASH_IP_SALT | Optionaler Override für das Kommentator-IP-Hash-Salt. Wenn nicht gesetzt, generiert und persistiert EmDash eines in der Options-Tabelle. |
EMDASH_AUTH_SECRET | Legacy. 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.
| Code | Beschreibung |
|---|---|
0 | Erfolg |
1 | Fehler (Konfiguration, Netzwerk, Datenbank) |