完成するもの

  • save-log という名前のサンドボックス型プラグイン。次の2つの機能を持ちます
    • フック:コンテンツが保存されるたびに、保存イベントをプラグインのストレージに記録する
    • APIルート:health という公開ルートで、プラグインが動いていることを返す
  • このプラグインを登録し、両方の機能が動くことを確認したローカルのEmDashサイト

(公式「はじめてのサンドボックス型プラグイン」)

所要時間

目安:45分

AIエージェントによる実測のあとに、この時間を更新します。

必要なもの

種類 必要なもの 補足
ツール Node.jsとpnpm プラグインの作成ツールはpnpmで動かします
EmDashのサイト サンドボックスランナーを設定したサイト このハンズオンでは、公式「はじめてのEmDashサイト作成」で作るNode.jsのサイト(my-emdash-site)を使い、ステップ1でランナーを設定します
アカウント Atmosphereアカウントのハンドル、またはDID マニフェストの publisher に使います。Blueskyのアカウントは、Atmosphereアカウントの1つです(公式「バンドルと公開」)
ツール 生成AIツール ターミナルでコマンドを実行できるAIツール(Claude Code、Cursor、Codexなど)、またはチャット型のAI(ChatGPT、Claudeのチャットなど)。使い方の違いは「依頼文の使い方」で説明します

プラグインの形式をまだ決めていない場合は、先に「プラグイン形式の選び方」を読みます。公式ドキュメントは、ネイティブ型だけが持つ連携が必要な場合を除き、サンドボックス型を選ぶよう説明しています。

手順の全体像

1.サイトにサンドボックスランナーを設定2.プラグインの雛形を作る3.マニフェストに権限とストレージを書く4.フックとルートを書く5.テストを書き換える6.検証してビルド7. サイトに登録8. 動かして確認
図のテキストを読む
flowchart TD
    S1["1. サイトにサンドボックスランナーを設定"] --> S2["2. プラグインの雛形を作る"]
    S2 --> S3["3. マニフェストに権限とストレージを書く"]
    S3 --> S4["4. フックとルートを書く"]
    S4 --> S5["5. テストを書き換える"]
    S5 --> S6["6. 検証してビルド"]
    S6 --> S7["7. サイトに登録"]
    S7 --> S8["8. 動かして確認"]

ディレクトリは、サイト(my-emdash-site)とプラグイン(save-log)を同じ階層に並べます。公式の登録コマンドは、この並びを前提にしています。

依頼文の使い方

  • 依頼文は、そのままコピーしてAIに貼り付けられる形にしています。
  • AIツールによって、コマンドを実行する人が違います。依頼文はどちらの種類でも同じ文面で使えます。
    • ターミナルでコマンドを実行できるAIツール(Claude Code、Cursor、Codexなど):依頼文を渡すと、AIがファイルの書き換えとコマンドの実行をします。
    • チャット型のAI(ChatGPT、Claudeのチャットなど):AIが示したコードとコマンドを、自分でファイルとターミナルに貼って実行します。
  • コードは公式ドキュメントに載っているものをそのまま使うよう、依頼文で指定しています。AIが独自のコードに書き換えた場合は、公式ページのコードと見比べます。

ステップ

ステップ1:サイトにサンドボックスランナーを設定する

サンドボックス型プラグインを動かすには、プラグインの登録に加えて、実行環境ごとのランナーが必要です。ランナーが使えないとき、EmDashは sandboxed に登録したプラグインを読み込みません。Node.jsでは、ランナーと workerd をインストールし、emdash()sandboxRunner でランナーを指定します。(公式「プラグインサンドボックス」)

ステップ2:プラグインの雛形を作る

新しいプロジェクトを置くディレクトリで、プラグインの作成ツールを実行します。作成ツールは、公開者(publisher)、作者、セキュリティの連絡先、ソースリポジトリを質問し、プロジェクトの概要を表示してからファイルを作ります。

ステップ3:マニフェストに権限とストレージを書く

emdash-plugin.jsonc は、プラグインの識別情報、レジストリ用の情報、信頼に関する約束事を持つマニフェストです。content:afterSave フックは保存されたコンテンツをプラグインに渡すため、権限(Capability)content:read を追加します。保存イベントを検索できる形で残すため、events というストレージのコレクションを宣言します。作成ツールが書き込んだ publisher、author、security の値は、そのまま残します。(公式「はじめてのサンドボックス型プラグイン」)

ステップ4:フックとルートを書く

生成された src/plugin.ts を、公式ドキュメントのコードに置き換えます。フックのハンドラーは (event, ctx)、ルートのハンドラーは (routeCtx, ctx) を受け取ります。health ルートは公開・読み取り専用のため、管理画面にログインしていなくても確認できます。公開ルートはインターネットから呼び出せるため、実際のデータや更新処理を公開する前に、公式「APIルート」の認証とブラウザのオリジンに関するルールを読みます。(公式「はじめてのサンドボックス型プラグイン」)

ステップ5:生成されたテストを書き換える

作成ツールが生成したテストは、元の hello ルートを呼び出します。これを health ルートのテストに置き換えます。

ステップ6:検証してビルドする

テストを実行し、マニフェストを検証して、npm用の成果物をビルドします。

ステップ7:サイトにプラグインを登録する

ローカルのパッケージをEmDashのサイトにインストールし、astro.config.mjssandboxed に追加します。コマンドはサイトのディレクトリで実行します。

ステップ8:動かして確認する

2つの開発プロセスを起動します。

  1. プラグインのディレクトリで pnpm dev を実行します。プラグインのソースやマニフェストが変わると、CLIがプラグインをビルドし直します。
  2. サイトのディレクトリで、サイトの開発用コマンドを実行します。my-emdash-site の場合は npm run dev です。(公式「はじめてのEmDashサイト作成」)

うまくいかないときの確認点

症状 確認すること 公式ページ
プラグインが読み込まれない ランナーが使えないとき、EmDashは sandboxed のプラグインを読み込みません。ステップ1のランナーの設定を確認します はじめてのサンドボックス型プラグインプラグインサンドボックス
Plugin sandbox is configured but not available on this platform と表示される コロンのあとの文が原因を示します。Node.jsで workerd is missing or its binary does not run on this platform と表示された場合は、./node_modules/.bin/workerd --version を実行します。失敗する場合は、動かす環境で、オプションの依存パッケージを有効にしてインストールし直します プラグインサンドボックス(トラブルシューティング)
workerd failed to start within 10 seconds と表示される このメッセージより前の、[emdash:workerd] で始まる行に、workerd 自身の出力(設定や起動時のエラー)があります プラグインサンドボックス(トラブルシューティング)
workerd crashed 5 times in 60 seconds, giving up と表示される このメッセージより前の [emdash:workerd] workerd exited with <reason> の行が、終了した理由を示します。原因を直してからサーバーを再起動します プラグインサンドボックス(トラブルシューティング)
ctx.storage.events でエラーになる マニフェストに events のストレージコレクションが宣言されていないと、ctx.storage.events へのアクセスはエラーになります。ステップ3を確認します はじめてのサンドボックス型プラグイン
ctx.content がない content:read を宣言していないプラグインには、ctx.content が渡されません 権限(Capabilities)とセキュリティ

このほかの症状は「つまずきやすいポイント」にまとめています。

根拠にした公式ページ

  • はじめてのサンドボックス型プラグイン:https://docs.emdashcms.com/plugins/creating-plugins/your-first-plugin/
  • プラグイン形式の選び方:https://docs.emdashcms.com/plugins/creating-plugins/choosing-a-format/
  • プラグインサンドボックス:https://docs.emdashcms.com/deployment/plugin-sandbox/
  • 権限(Capabilities)とセキュリティ:https://docs.emdashcms.com/plugins/creating-plugins/capabilities/
  • バンドルと公開:https://docs.emdashcms.com/plugins/creating-plugins/publishing/
  • はじめてのEmDashサイト作成:https://docs.emdashcms.com/getting-started/
  • AIツール向けDocs MCP:https://docs.emdashcms.com/docs-mcp/

次に読むページ