Le CLI d’EmDash fournit des commandes pour gérer une instance EmDash CMS — configuration de base de données, génération de types, CRUD de contenu, gestion de schéma, médias et plus encore.
Installation
Le CLI est inclus avec le package emdash. Installez-le avec la commande suivante :
npm install emdash
Exécutez les commandes avec npx emdash ou ajoutez des scripts à package.json. Le binaire est aussi disponible sous le nom em pour plus de concision.
Authentification
Les commandes utilisant le client distant partagé résolvent l’authentification dans cet ordre :
- Flag
--token— token explicite sur la ligne de commande - Variable d’env
EMDASH_TOKEN - Identifiants stockés depuis
~/.config/emdash/auth.json(sauvés paremdash login) - Bypass de développement — si l’URL est localhost et qu’aucun token n’est disponible, s’authentifie automatiquement via l’endpoint de bypass de dev
Ces commandes acceptent les flags --url (depuis EMDASH_URL, avec fallback sur http://localhost:4321) et --token. Les commandes d’authentification ont leurs propres options de connexion. En ciblant un serveur de dev local, aucun token n’est nécessaire.
Flags communs
Ces flags sont disponibles sur les commandes utilisant le client distant partagé :
| Flag | Alias | Description | Par défaut |
|---|---|---|---|
--url | -u | URL de l’instance EmDash | EMDASH_URL ou http://localhost:4321 |
--token | -t | Token d’authentification | Depuis env/identifiants stockés |
--header "Name: Value" | -H | En-tête de requête personnalisé ; répétable | Depuis EMDASH_HEADERS/identifiants stockés |
--json | Sortie en JSON (pour le piping) | Auto-détecté depuis TTY |
Sortie
Quand stdout est un TTY, le CLI affiche les résultats formatés avec consola. Quand pipé ou quand --json est défini, il produit du JSON brut sur stdout — adapté pour jq ou d’autres outils.
Commandes
emdash dev
Démarre le serveur de développement avec configuration automatique de la base de données.
npx emdash dev [options]
Options
| Option | Alias | Description | Par défaut |
|---|---|---|---|
--database | -d | Chemin du fichier de base de données | ./data.db |
--types | -t | Générer les types depuis le distant avant de démarrer | false |
--port | -p | Port du serveur de dev | 4321 |
--cwd | Répertoire de travail | Répertoire courant |
Exemples
# Démarrer le serveur de dev
npx emdash dev
# Port personnalisé
npx emdash dev --port 3000
# Générer les types depuis le distant avant de démarrer
npx emdash dev --types
Comportement
- Vérifie et exécute les migrations de base de données en attente
- Si
--typesest défini, génère des types TypeScript depuis une instance distante (URL depuis la variableEMDASH_URLouemdash.urldanspackage.json) - Démarre le serveur de dev Astro avec
EMDASH_DATABASE_URLdéfini
emdash types
Génère des types TypeScript depuis le schéma d’une instance EmDash en cours d’exécution.
npx emdash types [options]
Options
| Option | Alias | Description | Par défaut |
|---|---|---|---|
--url | -u | URL de l’instance EmDash | http://localhost:4321 |
--token | -t | Token d’authentification | Depuis env/identifiants stockés |
--output | -o | Chemin de sortie pour les types | .emdash/types.ts |
--cwd | Répertoire de travail | Répertoire courant |
Exemples
# Générer les types depuis le serveur de dev local
npx emdash types
# Générer depuis une instance distante
npx emdash types --url https://my-site.pages.dev
# Chemin de sortie personnalisé
npx emdash types --output src/types/emdash.ts
Comportement
- Récupère le schéma depuis l’instance
- Génère les définitions de types TypeScript
- Écrit les types dans le fichier de sortie
- Écrit un
schema.jsonà côté pour référence
emdash login
Connectez-vous à une instance EmDash en utilisant OAuth Device Flow.
npx emdash login [options]
Options
| Option | Alias | Description | Par défaut |
|---|---|---|---|
--url | -u | URL de l’instance EmDash | http://localhost:4321 |
Comportement
- Découvre les endpoints d’authentification de l’instance
- Si localhost et aucune auth configurée, utilise automatiquement le bypass de dev
- Sinon initie OAuth Device Flow — affiche un code et ouvre votre navigateur
- Sonde l’autorisation, puis sauvegarde les identifiants dans
~/.config/emdash/auth.json
Les identifiants sauvés sont utilisés automatiquement par toutes les commandes ultérieures ciblant la même instance.
emdash logout
Déconnexion et suppression des identifiants stockés.
npx emdash logout [options]
Options
| Option | Alias | Description | Par défaut |
|---|---|---|---|
--url | -u | URL de l’instance EmDash | http://localhost:4321 |
emdash whoami
Affiche l’utilisateur authentifié actuel.
npx emdash whoami [options]
Options
| Option | Alias | Description | Par défaut |
|---|---|---|---|
--url | -u | URL de l’instance EmDash | http://localhost:4321 |
--token | -t | Token d’authentification | Depuis env/identifiants stockés |
--json | Sortie en JSON |
Affiche l’email, le nom, le rôle, la méthode d’authentification et l’URL de l’instance.
emdash content
Gérer les éléments de contenu. Tous les sous-commandes utilisent l’API distante via EmDashClient.
content list <collection>
npx emdash content list posts
npx emdash content list posts --status published --limit 10
| Option | Description |
|---|---|
--status | Filtrer par statut |
--limit | Maximum d’éléments |
--cursor | Curseur de pagination |
content get <collection> <id>
npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
| Option | Description |
|---|---|
--raw | Retourner le Portable Text brut (ignorer la conversion markdown) |
La réponse inclut un token _rev. Passez-le à content update pour confirmer que vous avez vu l’état actuel avant d’écraser.
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 | Description |
|---|---|
--data | Chaîne JSON avec les données de contenu |
--file | Lire les données depuis un fichier JSON |
--stdin | Lire les données depuis stdin |
--slug | Slug du contenu |
--locale | Locale du contenu |
--translation-of | ID d’un élément de contenu pour lier comme traduction |
--draft | Garder comme brouillon au lieu de publier automatiquement |
Fournissez les données via exactement une des options --data, --file ou --stdin. Les nouveaux éléments sont auto-publiés sauf si --draft est défini.
content update <collection> <id>
Vous devez fournir le token _rev d’un get précédent pour prouver que vous avez vu l’état actuel. Cela empêche d’écraser des modifications que vous n’avez pas vues. Les étapes suivantes lisent un élément, puis le mettent à jour avec ce token :
# 1. Lire l'élément, noter le _rev
npx emdash content get posts 01ABC123
# 2. Mettre à jour avec le _rev de l'étape 1
npx emdash content update posts 01ABC123 \
--rev MToyMDI2LTAyLTE0... \
--data '{"title": "Mis à jour"}'
| Option | Description |
|---|---|
--rev | Token de révision de get (requis) |
--data | Chaîne JSON avec les données de contenu |
--file | Lire les données depuis un fichier JSON |
Si l’élément a changé depuis votre get, le serveur renvoie 409 Conflict — relisez et réessayez.
content delete <collection> <id>
npx emdash content delete posts 01ABC123
Suppression douce de l’élément de contenu (déplacé à la corbeille).
content publish <collection> <id>
npx emdash content publish posts 01ABC123
content unpublish <collection> <id>
npx emdash content unpublish posts 01ABC123
content schedule <collection> <id>
npx emdash content schedule posts 01ABC123 --at 2026-03-01T09:00:00Z
| Option | Description |
|---|---|
--at | Date et heure ISO 8601 (requis) |
content restore <collection> <id>
npx emdash content restore posts 01ABC123
Restaure un élément de contenu supprimé.
emdash schema
Gérer les collections et les champs.
schema list
npx emdash schema list
Liste toutes les collections.
schema get <collection>
npx emdash schema get posts
Affiche une collection avec tous ses champs.
schema create <collection>
npx emdash schema create articles --label Articles
npx emdash schema create articles --label Articles --label-singular Article --description "Articles de blog"
| Option | Description |
|---|---|
--label | Libellé de la collection (requis) |
--label-singular | Libellé au singulier |
--description | Description de la collection |
schema delete <collection>
npx emdash schema delete articles
npx emdash schema delete articles --force
| Option | Description |
|---|---|
--force | Ignorer la confirmation |
Demande confirmation sauf si --force est défini.
schema add-field <collection> <field>
npx emdash schema add-field posts body --type portableText --label "Contenu du corps"
npx emdash schema add-field posts featured --type boolean --required
| Option | Description |
|---|---|
--type | Type de champ : string, text, number, integer, boolean, datetime, image, reference, portableText, json (requis) |
--label | Libellé du champ (par défaut le slug du champ) |
--required | Si le champ est requis |
schema remove-field <collection> <field>
npx emdash schema remove-field posts featured
emdash media
Gérer les éléments média.
media list
npx emdash media list
npx emdash media list --mime image/png --limit 20
| Option | Description |
|---|---|
--mime | Filtrer par type MIME |
--limit | Nombre d’éléments |
--cursor | Curseur de pagination |
media upload <file>
npx emdash media upload ./photo.jpg
npx emdash media upload ./photo.jpg --alt "Un coucher de soleil" --caption "Prise à Bristol"
| Option | Description |
|---|---|
--alt | Texte alternatif |
--caption | Légende |
media get <id>
npx emdash media get 01MEDIA123
media delete <id>
npx emdash media delete 01MEDIA123
media repair-usage
Réparer les index d’utilisation des médias de contenu pour une collection ou pour toutes les collections de contenu. Utilisez ceci après des importations ou des écritures directes en base de données quand la couverture d’utilisation est obsolète ou non fiable.
npx emdash media repair-usage --collection posts
npx emdash media repair-usage --all
npx emdash media repair-usage --all --json
| Option | Alias | Description |
|---|---|---|
--collection | -c | Réparer une collection de contenu |
--all | Réparer toutes les collections de contenu |
Passez exactement une des options --collection ou --all. La réparation distante nécessite un utilisateur Admin et un token d’auth avec le scope admin.
La réparation de tout le contenu s’exécute de manière synchrone et peut être lente ou coûteuse sur les grands sites. Préférez --collection quand vous n’avez besoin de réparer qu’une seule collection.
Les résultats de réparation structurés complete, partial et stale sortent avec 0 ; les résultats failed structurés sortent avec 1. L’automatisation et les tâches cron devraient utiliser --json et parser status, failedSourceCount, skippedSourceCount et les résumés par collection au lieu de traiter la sortie 0 comme une couverture complète.
emdash search
Recherche plein texte à travers le contenu.
npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
| Option | Alias | Description |
|---|---|---|
--collection | -c | Filtrer par collection |
--limit | -l | Maximum de résultats |
emdash taxonomy
Gérer les taxonomies et les termes.
taxonomy list
npx emdash taxonomy list
taxonomy terms <name>
npx emdash taxonomy terms categories
npx emdash taxonomy terms tags --limit 50
| Option | Alias | Description |
|---|---|---|
--limit | -l | Maximum de termes |
--cursor | Curseur de pagination |
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 | Description |
|---|---|
--name | Libellé du terme (requis) |
--slug | Slug du terme (par défaut le nom slugifié) |
--parent | ID du terme parent (pour les taxonomies hiérarchiques) |
emdash menu
Gérer les menus de navigation.
menu list
npx emdash menu list
menu get <name>
npx emdash menu get primary
Retourne le menu avec tous ses éléments.
emdash export-seed
Exporter le schéma de base de données et le contenu comme fichier de semence. Fonctionne directement sur un fichier SQLite local.
npx emdash export-seed [options] > seed.json
Options
| Option | Alias | Description | Par défaut |
|---|---|---|---|
--database | -d | Chemin du fichier de base de données | ./data.db |
--cwd | Répertoire de travail | Répertoire courant | |
--with-content | Inclure le contenu (tout ou collections séparées par virgules) | ||
--no-pretty | Désactiver le formatage JSON | false |
Format de sortie
Le fichier de semence exporté inclut :
- Paramètres : Titre du site, accroche, liens sociaux
- Collections : Toutes les définitions de collections avec champs
- Taxonomies : Définitions de taxonomies et termes
- Menus : Menus de navigation avec éléments
- Zones de widgets : Zones de widgets et widgets
- Contenu (si demandé) : Entrées avec références
$mediaet syntaxe$ref:pour la portabilité
emdash secrets generate
Génère un EMDASH_ENCRYPTION_KEY pour votre déploiement. La clé est utilisée pour chiffrer les secrets de plugins au repos.
npx emdash secrets generate
Affiche la nouvelle clé sur stdout. Redirigez-la vers votre magasin de secrets, ou écrivez-la directement dans votre fichier .env local avec --write. Le même fichier .env est lu par Node et, en développement local, par Wrangler et le plugin Vite de Cloudflare :
npx emdash secrets generate --write .env
--write refuse d’écraser une entrée existante sans --force. Remplacer une clé dans un déploiement avec des données chiffrées existantes rendra ces secrets illisibles, donc la protection est intentionnelle.
emdash secrets fingerprint <key>
Affiche l’empreinte digitale de 8 caractères (kid) d’une clé sans exposer sa valeur. Utile en CI pour vérifier que la bonne clé a été déployée. La commande suivante affiche l’empreinte d’une clé :
npx emdash secrets fingerprint emdash_enc_v1_...
Fichiers générés
.emdash/types.ts
La commande emdash types génère des interfaces TypeScript pour chaque collection :
// Généré par le CLI EmDash
// Ne pas éditer manuellement - exécutez `emdash types` pour régénérer
import type { PortableTextBlock } from "emdash";
export interface Post {
id: string;
title: string;
content: PortableTextBlock[];
publishedAt: Date | null;
}
.emdash/schema.json
La commande écrit aussi une exportation de schéma brut pour l’outillage :
{
"version": "a1b2c3d4",
"collections": [
{
"slug": "posts",
"label": "Posts",
"fields": [...]
}
]
}
Variables d’environnement
| Variable | Description |
|---|---|
EMDASH_DATABASE_URL | URL de base de données (définie automatiquement par dev) |
EMDASH_TOKEN | Token d’auth pour les opérations distantes |
EMDASH_URL | URL par défaut pour les commandes utilisant le client distant partagé |
EMDASH_HEADERS | En-têtes de requête personnalisés séparés par des sauts de ligne pour le client distant partagé et login |
EMDASH_ENCRYPTION_KEY | Clé pour chiffrer les secrets de plugins au repos. Fournie par l’opérateur — jamais stockée dans la base de données. Générer avec emdash secrets generate. |
EMDASH_PREVIEW_SECRET | Remplacement optionnel pour le secret HMAC d’aperçu. Quand non défini, EmDash génère et persiste un dans la table des options. |
EMDASH_IP_SALT | Remplacement optionnel pour le sel de hash IP du commentateur. Quand non défini, EmDash génère et persiste un dans la table des options. |
EMDASH_AUTH_SECRET | Obsolète. Utilisé comme source de sel IP si défini, pour que les installations existantes conservent des hashes IP de commentateurs stables à travers les mises à jour. Les nouvelles installations ne devraient pas le définir. |
Scripts de package
Ajoutez les commandes du CLI comme scripts package.json par commodité :
{
"scripts": {
"dev": "emdash dev",
"types": "emdash types",
"export-seed": "emdash export-seed",
"db:reset": "rm -f data.db"
}
}
Codes de sortie
| Code | Description |
|---|---|
0 | Succès |
1 | Erreur (configuration, réseau, base de données) |