EmDash CLIは、EmDash CMSインスタンスを管理するためのコマンドを提供します — データベースセットアップ、型生成、コンテンツCRUD、スキーマ管理、メディアなど。
インストール
CLIはemdashパッケージに含まれています。次のコマンドでインストールしてください:
npm install emdash
npx emdashでコマンドを実行するか、package.jsonにスクリプトを追加してください。バイナリは簡潔さのためにemとしても利用できます。
認証
実行中のEmDashインスタンスと通信するコマンドは、次の順序で認証を解決します:
--tokenフラグ — コマンドライン上の明示的なトークンEMDASH_TOKEN環境変数- 保存された認証情報
~/.config/emdash/auth.jsonから(emdash loginで保存) - 開発バイパス — URLがlocalhostでトークンが利用できない場合、開発バイパスエンドポイント経由で自動的に認証
ほとんどのコマンドは--url(デフォルトhttp://localhost:4321)と--tokenフラグを受け入れます。ローカル開発サーバーをターゲットにする場合、トークンは不要です。
共通フラグ
これらのフラグはすべてのリモートコマンドで利用できます:
| フラグ | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--url | -u | EmDashインスタンスURL | http://localhost:4321 |
--token | -t | 認証トークン | 環境変数/保存された認証情報から |
--json | JSON形式で出力(パイピング用) | TTYから自動検出 |
出力
stdoutがTTYの場合、CLIはconsolaで結果を整形して出力します。パイプされている場合、または--jsonが設定されている場合、stdoutに生のJSONを出力します — jqや他のツールに適しています。
コマンド
emdash dev
自動データベースセットアップで開発サーバーを起動します。
npx emdash dev [options]
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--database | -d | データベースファイルパス | ./data.db |
--types | -t | 起動前にリモートから型を生成 | false |
--port | -p | 開発サーバーポート | 4321 |
--cwd | 作業ディレクトリ | 現在のディレクトリ |
例
# 開発サーバーを起動
npx emdash dev
# カスタムポート
npx emdash dev --port 3000
# 起動前にリモートから型を生成
npx emdash dev --types
動作
- 保留中のデータベースマイグレーションをチェックして実行
--typesが設定されている場合、リモートインスタンスからTypeScript型を生成(URLはEMDASH_URL環境変数またはpackage.jsonのemdash.urlから)EMDASH_DATABASE_URLを設定してAstro開発サーバーを起動
emdash types
実行中のEmDashインスタンスのスキーマからTypeScript型を生成します。
npx emdash types [options]
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--url | -u | EmDashインスタンスURL | http://localhost:4321 |
--token | -t | 認証トークン | 環境変数/保存された認証情報から |
--output | -o | 型の出力パス | .emdash/types.ts |
--cwd | 作業ディレクトリ | 現在のディレクトリ |
例
# ローカル開発サーバーから型を生成
npx emdash types
# リモートインスタンスから生成
npx emdash types --url https://my-site.pages.dev
# カスタム出力パス
npx emdash types --output src/types/emdash.ts
動作
- インスタンスからスキーマを取得
- TypeScript型定義を生成
- 出力ファイルに型を書き込み
- 参照用に
schema.jsonを並べて書き込み
emdash login
OAuth Device Flowを使用してEmDashインスタンスにログインします。
npx emdash login [options]
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--url | -u | EmDashインスタンスURL | http://localhost:4321 |
動作
- インスタンスから認証エンドポイントを検出
- localhostで認証が設定されていない場合、自動的に開発バイパスを使用
- それ以外の場合はOAuth Device Flowを開始 — コードを表示してブラウザを開く
- 認証をポーリングし、
~/.config/emdash/auth.jsonに認証情報を保存
保存された認証情報は、同じインスタンスをターゲットとするすべての後続コマンドで自動的に使用されます。
emdash logout
ログアウトして保存された認証情報を削除します。
npx emdash logout [options]
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--url | -u | EmDashインスタンスURL | http://localhost:4321 |
emdash whoami
現在認証されているユーザーを表示します。
npx emdash whoami [options]
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--url | -u | EmDashインスタンスURL | http://localhost:4321 |
--token | -t | 認証トークン | 環境変数/保存された認証情報から |
--json | JSON形式で出力 |
メール、名前、ロール、認証方法、インスタンスURLを表示します。
emdash content
コンテンツアイテムを管理します。すべてのサブコマンドはEmDashClient経由でリモートAPIを使用します。
content list <collection>
npx emdash content list posts
npx emdash content list posts --status published --limit 10
| オプション | 説明 |
|---|---|
--status | ステータスでフィルタ |
--limit | 最大アイテム数 |
--cursor | ページネーションカーソル |
content get <collection> <id>
npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
| オプション | 説明 |
|---|---|
--raw | 生のPortable Textを返す(markdown変換をスキップ) |
レスポンスには_revトークンが含まれます。content updateに渡して、上書きする前に現在の状態を見たことを確認してください。
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
| オプション | 説明 |
|---|---|
--data | コンテンツデータを含むJSON文字列 |
--file | JSONファイルからデータを読み込む |
--stdin | stdinからデータを読み込む |
--slug | コンテンツスラッグ |
--locale | コンテンツロケール |
--translation-of | これを翻訳としてリンクするコンテンツアイテムのID |
--draft | 自動公開せずに下書きとして保持 |
--data、--file、--stdinのいずれか1つを使用してデータを提供してください。新しいアイテムは--draftが設定されていない限り自動的に公開されます。
content update <collection> <id>
現在の状態を見たことを証明するために、以前のgetからの_revトークンを提供する必要があります。これにより、見ていない変更を上書きすることを防ぎます。次の手順でアイテムを読み取り、そのトークンで更新します:
# 1. アイテムを読み取り、_revをメモ
npx emdash content get posts 01ABC123
# 2. ステップ1の_revで更新
npx emdash content update posts 01ABC123 \
--rev MToyMDI2LTAyLTE0... \
--data '{"title": "Updated"}'
| オプション | 説明 |
|---|---|
--rev | getからのリビジョントークン(必須) |
--data | コンテンツデータを含むJSON文字列 |
--file | JSONファイルからデータを読み込む |
get以降にアイテムが変更されている場合、サーバーは409 Conflictを返します — 再度読み取ってもう一度試してください。
content delete <collection> <id>
npx emdash content delete posts 01ABC123
コンテンツアイテムをソフト削除します(ゴミ箱に移動)。
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
| オプション | 説明 |
|---|---|
--at | ISO 8601日時(必須) |
content restore <collection> <id>
npx emdash content restore posts 01ABC123
ゴミ箱に入れられたコンテンツアイテムを復元します。
emdash schema
コレクションとフィールドを管理します。
schema list
npx emdash schema list
すべてのコレクションをリストします。
schema get <collection>
npx emdash schema get posts
すべてのフィールドを含むコレクションを表示します。
schema create <collection>
npx emdash schema create articles --label Articles
npx emdash schema create articles --label Articles --label-singular Article --description "Blog articles"
| オプション | 説明 |
|---|---|
--label | コレクションラベル(必須) |
--label-singular | 単数形ラベル |
--description | コレクション説明 |
schema delete <collection>
npx emdash schema delete articles
npx emdash schema delete articles --force
| オプション | 説明 |
|---|---|
--force | 確認をスキップ |
--forceが設定されていない限り、確認を求めます。
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
| オプション | 説明 |
|---|---|
--type | フィールドタイプ:string, text, number, integer, boolean, datetime, image, reference, portableText, json(必須) |
--label | フィールドラベル(デフォルトはフィールドスラッグ) |
--required | フィールドが必須かどうか |
schema remove-field <collection> <field>
npx emdash schema remove-field posts featured
emdash media
メディアアイテムを管理します。
media list
npx emdash media list
npx emdash media list --mime image/png --limit 20
| オプション | 説明 |
|---|---|
--mime | MIMEタイプでフィルタ |
--limit | アイテム数 |
--cursor | ページネーションカーソル |
media upload <file>
npx emdash media upload ./photo.jpg
npx emdash media upload ./photo.jpg --alt "A sunset" --caption "Taken in Bristol"
| オプション | 説明 |
|---|---|
--alt | 代替テキスト |
--caption | キャプションテキスト |
media get <id>
npx emdash media get 01MEDIA123
media delete <id>
npx emdash media delete 01MEDIA123
emdash search
コンテンツ全体の全文検索。
npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
| オプション | エイリアス | 説明 |
|---|---|---|
--collection | -c | コレクションでフィルタ |
--limit | -l | 最大結果数 |
emdash taxonomy
タクソノミーとタームを管理します。
taxonomy list
npx emdash taxonomy list
taxonomy terms <name>
npx emdash taxonomy terms categories
npx emdash taxonomy terms tags --limit 50
| オプション | エイリアス | 説明 |
|---|---|---|
--limit | -l | 最大ターム数 |
--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
| オプション | 説明 |
|---|---|
--name | タームラベル(必須) |
--slug | タームスラッグ(デフォルトはスラッグ化された名前) |
--parent | 親タームID(階層的タクソノミー用) |
emdash menu
ナビゲーションメニューを管理します。
menu list
npx emdash menu list
menu get <name>
npx emdash menu get primary
すべてのアイテムを含むメニューを返します。
emdash export-seed
データベーススキーマとコンテンツをシードファイルとしてエクスポートします。ローカルSQLiteファイルで直接動作します。
npx emdash export-seed [options] > seed.json
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--database | -d | データベースファイルパス | ./data.db |
--cwd | 作業ディレクトリ | 現在のディレクトリ | |
--with-content | コンテンツを含める(すべてまたはカンマ区切りのコレクション) | ||
--no-pretty | JSONフォーマットを無効化 | false |
出力形式
エクスポートされたシードファイルには以下が含まれます:
- 設定:サイトタイトル、タグライン、ソーシャルリンク
- コレクション:フィールドを含むすべてのコレクション定義
- タクソノミー:タクソノミー定義とターム
- メニュー:アイテムを含むナビゲーションメニュー
- ウィジェットエリア:ウィジェットエリアとウィジェット
- コンテンツ(要求された場合):ポータビリティのための
$media参照と$ref:構文を含むエントリー
emdash secrets generate
デプロイ用のEMDASH_ENCRYPTION_KEYを生成します。このキーはプラグインシークレットを静止時に暗号化するために使用されます。
npx emdash secrets generate
新しいキーをstdoutに出力します。シークレットストアにパイプするか、--writeで開発ファイルに直接書き込みます。次のコマンドはキーを.dev.varsまたは.envに書き込みます:
npx emdash secrets generate --write .dev.vars
npx emdash secrets generate --write .env
--writeは--forceなしで既存のエントリーを上書きすることを拒否します。既存の暗号化データを持つデプロイでキーを置き換えると、それらのシークレットが読めなくなるため、この保護は意図的です。
emdash secrets fingerprint <key>
値を公開せずにキーの8文字のフィンガープリント(kid)を出力します。これはCIで正しいキーがデプロイされたことを確認するのに便利です。次のコマンドはキーのフィンガープリントを出力します:
npx emdash secrets fingerprint emdash_enc_v1_...
生成されたファイル
.emdash/types.ts
emdash typesコマンドは各コレクションのTypeScriptインターフェースを生成します:
// Generated by EmDash CLI
// Do not edit manually - run `emdash types` to regenerate
import type { PortableTextBlock } from "emdash";
export interface Post {
id: string;
title: string;
content: PortableTextBlock[];
publishedAt: Date | null;
}
.emdash/schema.json
コマンドはツール用に生のスキーマエクスポートも書き込みます:
{
"version": "a1b2c3d4",
"collections": [
{
"slug": "posts",
"label": "Posts",
"fields": [...]
}
]
}
環境変数
| 変数 | 説明 |
|---|---|
EMDASH_DATABASE_URL | データベースURL(devによって自動設定) |
EMDASH_TOKEN | リモート操作用の認証トークン |
EMDASH_URL | typesとdev --typesのデフォルトリモートURL |
EMDASH_ENCRYPTION_KEY | プラグインシークレットを静止時に暗号化するためのキー。オペレーターが提供 — データベースには決して保存されません。emdash secrets generateで生成。 |
EMDASH_PREVIEW_SECRET | プレビューHMACシークレットのオプション上書き。設定されていない場合、EmDashがoptionsテーブルに生成して保持。 |
EMDASH_IP_SALT | コメンターIPハッシュソルトのオプション上書き。設定されていない場合、EmDashがoptionsテーブルに生成して保持。 |
EMDASH_AUTH_SECRET | レガシー。設定されている場合、IPソルトソースとして使用され、既存のインストールはアップグレード後も安定したコメンターIPハッシュを保持。新規インストールではこれを設定すべきではありません。 |
パッケージスクリプト
便利なようにpackage.jsonスクリプトとしてCLIコマンドを追加してください:
{
"scripts": {
"dev": "emdash dev",
"types": "emdash types",
"export-seed": "emdash export-seed",
"db:reset": "rm -f data.db"
}
}
終了コード
| コード | 説明 |
|---|---|
0 | 成功 |
1 | エラー(設定、ネットワーク、データベース) |