mcpField
D
dev-server

dev-server

github.com/editframe開発1954 回インストール2 週間前に更新
リポジトリ

dev-server について

dev-serverは、Vite、Next.jsなどのツールチェーンをインストール済みのローカルランタイムに接続するEditframeスキルです。エディタールート、ソースのミラーリング、任意のローカルメディアルートを説明します。

主な機能

  1. 01ViteとNext.jsのランタイムアダプター
  2. 02選択したソースファイルのミラーリング
  3. 03ローカルメディアルートとトランスコード
  4. 04字幕生成とURL署名
  5. 05スタンドアロンサーバーまたはミドルウェア設定

活用シーン

  1. 01ViteまたはNext.jsアプリとEditframeの接続
  2. 02開発中のコンポジションファイル同期
  3. 03ローカルメディアと字幕の提供
  4. 04他のツールチェーンへのEditframeルート追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/editframe/skills --skill dev-server

インストール後、Claude Code で/dev-serverを入力して読み込まれたか確認します。

詳細

開発サーバー

Editframe フレームワークアダプターは、アプリをインストール済みの Editframe ランタイムに接続します。このランタイムはローカルブリッジです。ランタイムの状態、コンパイル、メディア、エクスポートを管理します。アダプターはブラウザーエディターへのローカルルートを追加します。また、選択したソースファイルをコンポジションにミラーリングすることもできます。

まず、https://editframe.com/agent からランタイムをインストールしてください。npm パッケージにブリッジは含まれていません。

フレームワークに応じて、統合方法を 1 つ選択してください。

  • Vite(npm create @editframe の html/react テンプレート):@editframe/vite-plugin。
  • Next.js(nextjs テンプレート):@editframe/nextjs-plugin。
  • ブリッジを使わないローカルメディアルート(JIT トランスコード、ローカルキャプション、URL 署名):これらのプラグインの /advanced エントリー、または @editframe/dev-server を使用します。「高度な設定:ローカルメディアルート」を参照してください。

スキャフォールドされたプロジェクトには、適切なアダプターがすでに含まれています。editframe-create スキルを参照してください。

ブリッジを選択する

各アダプターには、絶対パスの projectRoot とインストール済みのブリッジが必要です。次のいずれかの方法でブリッジを指定してください。

  • executable:ブリッジ実行ファイルの絶対パス。
  • componentRoot:検証済みコンポーネントのインストール先の絶対パス。
  • どちらのオプションも省略した場合は、EDITFRAME_BRIDGE_PATH または EDITFRAME_COMPONENT_ROOT 環境変数を使用します。

スキャフォールドされたテンプレートではどちらのオプションも省略されているため、環境変数が読み込まれます。ブリッジ実行ファイル単体では、エディターとコンパイラーのアセット(editorDir、compilerPack)も必要になる場合があります。検証済みコンポーネントには、これらのアセットが含まれています。

editframe CLI も、--bridge、--component、または同じ環境変数を使って、同じ方法でブリッジを選択します。editframe-api スキルを参照してください。

Vite の設定

// vite.config.ts
import path from "node:path";
import { defineConfig } from "vite";
import { vitePluginEditframe } from "@editframe/vite-plugin";

export default defineConfig({
  plugins: [
    vitePluginEditframe({
      projectRoot: path.resolve(__dirname),
      executable: "/absolute/editframe-bridge", // or componentRoot, or an environment variable
    }),
  ],
});

Vite 開発サーバーで /@ef/workspace を開いてください。プラグインは認証済みのブラウザーエディターにリダイレクトします。アプリがエディターのベアラートークンを受け取ることはありません。このルートはローカルリクエストのみを受け付けます。ホスト型エディターのエンドポイントとして公開しないでください。

以前の root および cacheRoot オプションは @editframe/vite-plugin/advanced に属します。デフォルトのプラグインはメディアサーバーを起動しません。

Next.js の設定

オプションはサーバー専用のファイル 1 つに記述してください。これにより、以下の両方の呼び出しで同じ値が使われます。

// editframe.config.mjs
import path from "node:path";
import { fileURLToPath } from "node:url";

export default {
  projectRoot: path.dirname(fileURLToPath(import.meta.url)),
  executable: "/absolute/editframe-bridge", // or componentRoot, or an environment variable
};
// next.config.mjs
import { withEditframe } from "@editframe/nextjs-plugin";
import editframe from "./editframe.config.mjs";

export default withEditframe(editframe, {
  // your Next.js config
});

Node.js のルートハンドラーを追加してください。app ディレクトリの場所に合わせて相対インポートを調整してください。

// src/app/api/editframe/workspace/route.ts
import { createEditframeRoute } from "@editframe/nextjs-plugin";
import editframe from "../../../../../editframe.config.mjs";

export const runtime = "nodejs";
export const GET = createEditframeRoute(editframe);

Next.js 開発サーバーで /@ef/workspace を開いてください。リライトによってリクエストがルートハンドラーに転送されます。ハンドラーは認証済みのブラウザーエディターにリダイレクトします。ローカルリクエストとトークンに関する Vite のルールもここに適用されます。

以前のサイドカーオプションは @editframe/nextjs-plugin/advanced に属します。

アプリのソースをミラーリングする

source を設定すると、選択したプロジェクトファイルをコンポジションにミラーリングできます。ブリッジはファイルをコンパイルし、各リビジョンをチェックします。

vitePluginEditframe({
  projectRoot: path.resolve(__dirname),
  source: {
    kind: "html", // "source" for a React or TypeScript entry
    entryPath: "src/composition.html",
    files: ["src/composition.html"],
    onError: console.error,
  },
}),
  • projectRoot からの相対パスを使用してください。
  • コンポジションの各ファイルを files に列挙してください。エントリーファイルも含めてください。
  • files には最大 256 個の一意なパスを指定できます。
  • アダプターは新しいファイルやアセットを検出しません。新しいファイルはそれぞれ、自分で files に追加してください。
  • オプションのフィールド:compositionId、title、width、height、durationMs、onCommitted。

ランタイムが利用できない場合でも、Vite 開発サーバーは起動し、アプリを配信します。その場合、アダプターは同期エラーを一度だけ onError に送信します。onError を省略すると、Vite は警告を 1 つ表示します。ランタイムが利用可能になるまで、/@ef/workspace はセットアップメッセージとともに 503 を返します。

Next.js アダプターも同じ source オブジェクトを受け付けます。共有設定ファイルに記述してください。

高度な設定:ローカルメディアルート

/advanced エントリーでは、以前のリリースのローカルメディアサーバーを引き続き利用できます。ブリッジを使わずにローカルメディアを配信するカスタム設定で使用してください。これらのルートはクラウド API を使わずにメディアをローカルで処理します。URL 署名ルートでは Editframe クラウド API を使用します。

Vite
// vite.config.ts
import { defineConfig } from "vite";
import { vitePluginEditframe } from "@editframe/vite-plugin/advanced";

export default defineConfig({
  plugins: [
    vitePluginEditframe({
      root: "./src",       // base directory local `src=` paths resolve against
      cacheRoot: "./cache", // directory for cached transcoded assets
    }),
  ],
});

プラグインは Vite 自身の開発サーバーにマウントされます。以下の例のように、コンポジションの api-host にブラウザーの Vite オリジンを設定してください。これにより、リクエストは同じオリジンを使います。

Next.js
// next.config.mjs
import { withEditframe } from "@editframe/nextjs-plugin/advanced";

export default withEditframe(
  { root: "./src", cacheRoot: "./cache" },
  {
    // your Next.js config
  },
);

この withEditframe は、デフォルトではポート 3099 で、next dev と並行してサイドカー HTTP サーバーを起動します。port オプションでポートを変更できます。rewrites() ルールは Editframe のリクエストをサイドカーにプロキシします。コンポジションの api-host にはポート 3099 ではなく、ブラウザーの Next.js オリジンを設定してください。通常どおり next dev を実行します。

サイドカーは本番環境では起動しません。代わりに実際のメディア(クラウドレンダー、アップロードしたファイル)を使用してデプロイしてください。

その他のツールチェーン

Vite や Next.js との統合がないツールチェーンでは、@editframe/dev-server を直接呼び出します。@editframe/assets から 6 つのアセット処理関数を取得します。URL 署名ハンドラーには createProdEfHandlers を指定します。

import { createEditframeDevServer, createProdEfHandlers } from "@editframe/dev-server";
import {
  generateTrack,
  generateScrubTrack,
  generateTrackFragmentIndex,
  cacheImage,
  findOrCreateCaptions,
  md5FilePath,
} from "@editframe/assets";
import { Client, createURLToken } from "@editframe/api";

const server = createEditframeDevServer(
  { root: "./src", cacheRoot: "./cache" },
  { generateTrack, generateScrubTrack, generateTrackFragmentIndex, cacheImage, findOrCreateCaptions, md5FilePath },
  createProdEfHandlers({
    createURLToken,
    getClient: () => new Client(process.env.EF_TOKEN, process.env.EF_HOST),
  }),
);

server.listen(3001, () => console.log("Editframe dev server running on http://localhost:3001"));

ツールチェーンですでに Connect 互換のミドルウェアスタック(Express、Connect、カスタム Vite 統合など)が公開されている場合は、代わりに同じ 3 つの引数で createEditframeRouter(...) を呼び出します。戻り値を .use() でマウントします。createEditframeDevServer は同じルーターを独自のスタンドアロン http.Server でラップします。これは、独自のミドルウェアスタックがないツールチェーン向けです。

スタンドアロンサーバーの場合は、アプリサーバーから http://localhost:3001 に /api/v1/* と /@ef-* をプロキシします。コンポジションの api-host には、アプリのブラウザーオリジンを設定します。これにより、メディアと署名のリクエストが同じオリジンに維持されます。スタンドアロンサーバーは、アプリのプロキシやコンポジションの設定は行いません。

コンポジションを接続する

メディアの子要素が接続される前に、祖先の ef-configuration に api-host を設定します。ブラウザーにメディアルートを公開するオリジンを使用してください。


<ef-configuration api-host="http://localhost:5173">
  <ef-timegroup mode="contain">
    <ef-video src="clip.mp4"></ef-video>
  </ef-timegroup>
</ef-configuration>

Next.js では、たとえば http://localhost:3000 のように Next.js のオリジンを使用します。プロキシを使うスタンドアロン統合では、アプリのオリジンを使用します。React では同じ値を指定した <Configuration apiHost="…"> を使用します。

現在の要素は ef-configuration から api-host を読み取ります。プラグインの window.__EDITFRAME__.apiHost の値は読み取りません。api-host が空の場合、オーサリング用メディア URL の JIT 検出はスキップされます。

ルートで有効になる機能

サーバーとコンポジションを接続すると、コードから直接リクエストしなくても、要素は以下のルートを使用します。

  • JIT ビデオトランスコーディング。 たとえば <ef-video src="clip.mp4"> のように、ローカルの動画ファイルを直接参照できます。開発サーバーは初回のリクエスト時に動画をセグメントにトランスコードします。以降のリクエストでは、キャッシュされたセグメントが返されます。
  • ローカル画像。 サーバーはローカル画像ルートを公開します。
  • ローカル字幕。 ef-captions の captions-src に /api/v1/assets/captions?src=<path> を設定します。パスは root からの相対パスです。サーバーはそのファイルに対して whisper_timestamped を実行し、字幕 JSON をキャッシュします。まずホストに whisper_timestamped をインストールしてください。このルートは英語の音声のみを文字起こしします。
  • 本番環境のファイル API と同じ形式のローカルファイル API。 ローカルメディアを対象に書いたコードは、アップロードファイルやクラウドファイルに切り替えた後も動作します。
  • URL 署名。 ef-configuration のデフォルトの signing-url は、再生トークンを発行するために実際の Editframe クラウド API に転送します。開発サーバーを起動する前に、EF_TOKEN 環境変数を設定してください。デフォルト以外の API ホストを指定するには、EF_HOST を設定します。

ef-video、ef-image、ef-captions がローカルメディアをどのように使用するかについては、composition スキルを参照してください。EF_TOKEN と EF_HOST については、editframe-api スキルを参照してください。

ビジュアルリグレッションテスト

プロジェクトのブラウザーのスクリーンショットテストを使用して、コンポジションの出力を確認してください。公開されている Vite プラグインは、リポジトリ内部の src/index.vitest.js アダプターをエクスポートしません。インストール済みのパッケージから、そのソースパスをインポートしないでください。

デバッグログ

ローカルメディアルートでは、開発サーバーを起動する前に DEBUG を設定します。特定のサブシステムのトレースを出力します。

DEBUG=ef:dev-server:jit npm run dev      # transcode middleware
DEBUG=ef:dev-server:assets npm run dev   # local image/caption serving
DEBUG=ef:dev-server:files npm run dev    # local files API
DEBUG=ef:dev-server:sign-url npm run dev # URL signing
DEBUG=ef:dev-server:snapshot npm run dev # visual regression testing

フィードバックを送信する

問題や改善案について、Editframe にフィードバックを送信します。

  • Editframe またはこのスキルが問題を引き起こした場合は、回避策を見つけてタスクを続行します。その後、問題と回避策を報告します。
  • 現在のタスクだけでなく、ほかのタスクにも役立つ改善案があれば、提案を送信します。たとえば、より明確な指示、不足している例、より適切なデフォルト値、新機能などを提案します。

問題や提案の種類ごとに、1 件ずつ報告を送信します。報告に失敗しても、タスクを続行します。

curl -sS https://editframe.com/api/v1/feedback \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $EDITFRAME_API_KEY" \
  --data-binary @- <<'JSON'
{
  "category": "bug",
  "skill": "dev-server",
  "summary": "One line that names the problem or the suggestion",
  "details": "For a problem: steps, expected result, actual result, and errors. For a suggestion: the change and how it helps.",
  "workaround": "The workaround that you used. Omit this field for a suggestion."
}
JSON

category には bug、documentation、feature_request、performance、other のいずれかを設定します。API キーは任意です。キーなしで報告すると匿名になります。報告には秘密情報、API キー、個人データを含めないでください。すべてのフィールド、制限、応答については、editframe-api スキルを参照してください。

コメント