ハンズオン:AIとプラグインを作る
完成するもの
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のチャットなど)。使い方の違いは「依頼文の使い方」で説明します |
プラグインの形式をまだ決めていない場合は、先に「プラグイン形式の選び方」を読みます。公式ドキュメントは、ネイティブ型だけが持つ連携が必要な場合を除き、サンドボックス型を選ぶよう説明しています。
手順の全体像
図のテキストを読む
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.mjs の sandboxed に追加します。コマンドはサイトのディレクトリで実行します。
ステップ8:動かして確認する
2つの開発プロセスを起動します。
- プラグインのディレクトリで
pnpm devを実行します。プラグインのソースやマニフェストが変わると、CLIがプラグインをビルドし直します。 - サイトのディレクトリで、サイトの開発用コマンドを実行します。
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/