すべてのサンドボックスプラグインには package.json の隣に emdash-plugin.jsonc があります。これは手動で編集され、プラグインのアイデンティティ、信頼契約(ケイパビリティ、ホスト、ストレージ)、およびレジストリが表示するプロフィールフィールドを保持します。emdash-plugin init がスキャフォールドを生成します。CLIは build、dev、validate、bundle、publish で ./emdash-plugin.jsonc を自動的に読み取ります。
ファイルは JSONC です:コメントと末尾のカンマが許可されています。
以下の例は、画像ギャラリープラグインの完全なマニフェストを示しています:
{
"$schema": "./node_modules/@emdash-cms/plugin-cli/schemas/emdash-plugin.schema.json",
"slug": "gallery",
"publisher": "did:plc:abc123def456",
"license": "MIT",
"author": { "name": "Jane Doe", "url": "https://example.com" },
"security": { "email": "[email protected]" },
// オプションのプロフィール
"name": "Gallery",
"description": "EmDash用の画像ギャラリーブロック。",
"keywords": ["gallery", "images"],
"repo": "https://github.com/example/plugin-gallery",
// 信頼契約
"capabilities": ["content:read"],
"allowedHosts": [],
"storage": {}
}
アイデンティティ
| フィールド | 必須 | 備考 |
|---|---|---|
slug | はい | パブリッシャーの名前空間内のURL安全なID。/^[a-z][a-z0-9_-]*$/、最大64文字。 |
publisher | はい | AtmosphereアカウントのDIDまたはハンドル。パブリッシャーピニングを参照。 |
version | いいえ | ビルドメタデータなしのSemver 2.0。通常は省略 — 以下を参照。 |
slug と publisher を合わせてパッケージのアイデンティティとなります。EmDashはそこからパッケージの完全な識別子を自動的に導出します。
version は package.json に置く
ビルドはマニフェストの version を package.json#version と照合します:
- 両方設定されていて同じ → OK。
- 両方設定されていて異なる → ハードエラー。
- 片方だけ設定 → その値が優先。
- どちらも未設定 → ハードエラー。
npm配布プラグインの推奨パターンは、マニフェストから version を省略し、package.json を唯一の真実の源とすることです(リリースツーリングがそこですでにバンプしています)。package.json のないレジストリ専用プラグインは、マニフェストに version を設定する必要があります — 他に置く場所がありません。
プロフィール
これらはレジストリリスティングに反映されます。license、著者(author または authors)、セキュリティ連絡先(security または securityContacts)は必須です。残りはオプションです。
| フィールド | 必須 | 備考 |
|---|---|---|
license | はい | SPDX式("MIT"、"Apache-2.0"、"MIT OR Apache-2.0")。初回公開時に使用され、以降の公開では既存プロフィールが優先。 |
author / authors | はい | どちらか一方。author: { name, url?, email? } は単一著者用、authors: [...](≤ 32)は複数著者用。両方設定するとエラー。 |
security / securityContacts | はい | どちらか一方。各連絡先には少なくとも email または url が必要。securityContacts: [...](≤ 8)は複数用。両方設定するとエラー。 |
name | いいえ | 表示名。デフォルトはslug。 |
description | いいえ | 短くしてください(約140文字)。長い値はリストで切り詰められる可能性があります。 |
keywords | いいえ | ≤ 5エントリ。 |
repo | いいえ | ソースリポジトリの https:// URL。 |
実際に複数いる場合を除き、単数形の author / security を使用してください — これが一般的なケースで、スキャフォールドもそう出力します。
信頼契約
信頼契約は capabilities、allowedHosts、storage です。3つともデフォルトは空なので、追加の特権を必要としないプラグインは完全に省略できます。
{
"capabilities": ["network:request", "content:read"],
"allowedHosts": ["api.example.com", "*.cdn.example.com"],
"storage": {
"events": { "indexes": ["timestamp"] },
"submissions": { "indexes": ["email"], "uniqueIndexes": ["token"] }
}
}
ケイパビリティ
認識される名前:
| ケイパビリティ | 許可するもの |
|---|---|
content:read / content:write | ctx を通じてサイトコンテンツの読み取り / 変更。 |
taxonomies:read | タクソノミー定義と用語の読み取り(読み取り専用)。 |
media:read / media:write | メディアの読み取り / 書き込み。 |
users:read | ユーザーレコードの読み取り。 |
email:send | ctx を通じてメール送信。 |
network:request | ctx.http を通じた送信HTTP、allowedHosts に制限。 |
network:request:unrestricted | 任意のホストへの送信HTTP。network:request の代わりに使用。 |
hooks.email-transport:register | メールトランスポートフックの登録。 |
hooks.email-events:register | メールライフサイクルフックの登録。 |
hooks.page-fragments:register | page:fragments フックの登録(ネイティブのみ)。 |
CLIが強制する2つのクロスフィールドルール(エディターのJSON-Schemaチェックでは強制されません — emdash-plugin validate を実行してください):
network:requestは空でないallowedHostsを必要とします。プラグインが本当に任意のホストに到達する必要がある場合は、代わりにnetwork:request:unrestrictedを使用してください。network:request:unrestrictedはallowedHostsが空であることを必要とします — 制限なしのケイパビリティはすでにすべてのホストを許可しているため、リストは矛盾します。
ホストパターンは裸のホスト名です(スキーム、パス、空白なし)。先頭の *. はサブドメインを許可します:*.cdn.example.com。
ストレージ
コレクション名 → インデックス設定のマップ。コレクション名は同じ /^[a-z][a-z0-9_]*$/ ルールに従います(ランタイムは名前をSQLテーブルサフィックスとして使用します)。インデックスはフィールド名または複合配列です。uniqueIndexes もクエリ可能です — indexes に追加でリストしないでください。
"storage": {
"events": { "indexes": ["timestamp", ["collection", "timestamp"]] }
}
管理画面
オプション。サンドボックスプラグインは Block Kit を通じて管理ページとダッシュボードウィジェットをレンダリングします。マニフェストはそれらがどこに表示されるかだけを宣言します。プラグインに管理UIがない場合は admin キーを完全に省略してください。
"admin": {
"pages": [{ "path": "/gallery", "label": "ギャラリー", "icon": "image" }],
"widgets": [{ "id": "recent-uploads", "title": "最近のアップロード", "size": "half" }]
}
admin.pages または admin.widgets を宣言するプラグインは、Block Kitコンテンツをレンダリングする admin ルートを src/plugin.ts で提供する必要もあります — スキーマはそれを強制できません(ルート名はマニフェストからではなくソースから探索されます)が、ランタイムがチェックします。
パブリッシャーピニング
publisher は公開アイデンティティを固定し、誤って間違いアカウントでプラグインを公開することを防ぎます。
最初の成功した公開時に、マニフェストの publisher がアクティブセッションと一致していれば、そのまま維持されます。emdash-plugin init でスキャフォールドを作成して空のままにした場合、CLIはアクティブセッションのDIDをマニフェストに書き戻します。
以下の例は、CLIが書き込む行を示しています。解決されたハンドルが可読性のためにコメントとして追加されています:
"publisher": "did:plc:abc123def456", // jane.example.com
その後の各公開時に、CLIはアクティブセッションと固定された publisher をDIDに解決して比較します。不一致の場合は即座に MANIFEST_PUBLISHER_MISMATCH で失敗します — オーバーライドフラグはありません。意図的に解決してください:
- 間違ったセッション:
emdash-plugin switch <did>を実行し、再度公開。 - プラグインの新しいパブリッシャーへの正式な移転:マニフェストの
publisherを編集。
公開せずに検証
emdash-plugin validate # ./emdash-plugin.jsonc
emdash-plugin validate path/ # 特定のディレクトリ
クロスフィールドルールを含む tsc スタイルの ファイル:行:列 診断によるオフラインスキーマチェック。プレコミットフックやCIステップに適しています。重複キーと不明なキーはエラーです(厳密モードは "licens" のようなタイプミスを検出します)。
CLIフラグが常に優先
明示的なフラグ(--license、--author-name、…)は両方が設定されている場合にマニフェストの値を上書きします — CIオーバーライドに便利です。--no-manifest はマニフェストを完全にスキップします(デフォルトパスに存在する場合は警告を出し、パブリッシャーピンのセキュリティストーリーが見えるままにします)。