EmDash CLI は EmDash CMS インスタンスを管理するためのコマンドを提供します — データベースセットアップ、型生成、コンテンツ CRUD、スキーマ管理、メディアなど。
インストール
CLI は emdash パッケージに含まれています:
npm install emdash
npx emdash でコマンドを実行するか、package.json にスクリプトを追加します。短縮形として em バイナリも使用できます。
認証
実行中の EmDash インスタンスと通信するコマンド(init、seed、export-seed、auth secret を除くすべて)は、以下の順序で認証を解決します:
--tokenフラグ — コマンドラインで明示的に指定するトークンEMDASH_TOKEN環境変数- 保存された認証情報 —
emdash loginで保存された~/.config/emdash/auth.json - Dev バイパス — URL が localhost でトークンが利用できない場合、dev バイパスエンドポイント経由で自動認証
ほとんどのコマンドは --url(デフォルト http://localhost:4321)と --token フラグを受け付けます。ローカル開発サーバーを対象とする場合、トークンは不要です。
共通フラグ
これらのフラグはすべてのリモートコマンドで利用可能です:
| フラグ | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--url | -u | EmDash インスタンス URL | http://localhost:4321 |
--token | -t | 認証トークン | 環境変数/保存された認証情報 |
--json | JSON として出力(パイプ用) | TTY から自動検出 |
出力
stdout が TTY の場合、CLI は consola で整形出力します。パイプされた場合または --json が設定された場合、生の JSON を stdout に出力します — jq やその他のツールに適しています。
コマンド
emdash init
コアスキーマと任意のテンプレートデータでデータベースを初期化します。
npx emdash init [options]
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--database | -d | データベースファイルパス | ./data.db |
--cwd | 作業ディレクトリ | カレントディレクトリ | |
--force | -f | スキーマとシードを再実行 | false |
動作
package.jsonからemdash設定を読み取り- 必要に応じてデータベースファイルを作成
- コアマイグレーションを実行(システムテーブルの作成)
- 設定されている場合はテンプレート
schema.sqlを実行 - 設定されている場合はテンプレート
seed.sqlを実行
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 デバイスフローを使用して EmDash インスタンスにログインします。
npx emdash login [options]
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--url | -u | EmDash インスタンス URL | http://localhost:4321 |
動作
- インスタンスから認証エンドポイントを検出
- localhost で認証が未設定の場合、自動的に dev バイパスを使用
- それ以外の場合、OAuth デバイスフローを開始 — コードを表示してブラウザを開く
- 認証をポーリングし、
~/.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 | コンテンツスラッグ |
--status | 初期ステータス(draft、published) |
--data、--file、--stdin のいずれか 1 つでデータを提供します。
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 seed
シードファイルをデータベースに適用します。このコマンドはローカル SQLite ファイルに直接動作します(実行中のサーバーは不要)。
npx emdash seed [path] [options]
引数
| 引数 | 説明 | デフォルト |
|---|---|---|
path | シードファイルのパス | .emdash/seed.json |
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--database | -d | データベースファイルパス | ./data.db |
--cwd | 作業ディレクトリ | カレントディレクトリ | |
--validate | バリデーションのみ、適用しない | false | |
--no-content | サンプルコンテンツをスキップ | false | |
--on-conflict | 競合処理: skip, update, error | skip | |
--uploads-dir | メディアアップロードのディレクトリ | .emdash/uploads | |
--media-base-url | メディアファイルのベース URL | /_emdash/api/media/file | |
--base-url | サイトベース URL(絶対メディア URL 用) |
シードファイルの解決
コマンドは以下の順序でシードファイルを検索します:
- 位置引数(指定された場合)
.emdash/seed.json(規約)package.jsonのemdash.seedフィールドのパス
emdash export-seed
データベースのスキーマとコンテンツをシードファイルとしてエクスポートします。ローカル SQLite ファイルに直接動作します。
npx emdash export-seed [options] > seed.json
オプション
| オプション | エイリアス | 説明 | デフォルト |
|---|---|---|---|
--database | -d | データベースファイルパス | ./data.db |
--cwd | 作業ディレクトリ | カレントディレクトリ | |
--with-content | コンテンツを含める(すべてまたはカンマ区切りのコレクション) | ||
--no-pretty | JSON フォーマットを無効化 | false |
出力フォーマット
エクスポートされたシードファイルには以下が含まれます:
- Settings: サイトタイトル、タグライン、ソーシャルリンク
- Collections: フィールド付きのすべてのコレクション定義
- Taxonomies: タクソノミー定義とターム
- Menus: アイテム付きのナビゲーションメニュー
- Widget Areas: ウィジェットエリアとウィジェット
- Content(リクエスト時): ポータビリティのため
$media参照と$ref:構文付きのエントリ
emdash auth secret
デプロイメント用の安全な認証シークレットを生成します。
npx emdash auth secret
EMDASH_AUTH_SECRET に適したランダムシークレットを出力します。
生成されるファイル
.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_AUTH_SECRET | パスキー認証用のシークレット |
EMDASH_PREVIEW_SECRET | プレビュートークン生成用のシークレット |
パッケージスクリプト
{
"scripts": {
"dev": "emdash dev",
"init": "emdash init",
"types": "emdash types",
"seed": "emdash seed",
"export-seed": "emdash export-seed",
"db:reset": "rm -f data.db && emdash init"
}
}
終了コード
| コード | 説明 |
|---|---|
0 | 成功 |
1 | エラー(設定、ネットワーク、データベース) |