building-emdash-site について
building-emdash-siteは、EmDash CMSを使うAstro開発者向けのサイト構築スキルです。設定、スキーマ、コンテンツ表示、見落としやすい注意点を扱います。
主な機能
- 01Astroプロジェクトの設定案内
- 02スキーマとシードデータの設計
- 03コンテンツの取得と表示
- 04キャッシュと動的ページの注意点
- 05CMSプラグインの拡張案内
活用シーン
- 01EmDashサイトの構成
- 02投稿一覧や詳細ページの実装
- 03コンテンツ取得結果が空になる原因の調査
- 04管理画面やコンテンツ形式の拡張
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ emdash-cms/ emdash --skill building-emdash-siteインストール後、Claude Code で/building-emdash-siteを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/configuration.mdquerying-and-rendering.mdschema-and-seed.mdsite-features.md詳細
EmDash サイトの構築
EmDash は Astro をベースにした CMS です。スキーマをコードではなくデータベースに保存し、ライブコンテンツコレクションを通じてコンテンツを配信し、/_emdash/admin に完全な管理 UI を提供します。サイトは emdash インテグレーションを使用する標準的な Astro プロジェクトです。
よくある落とし穴
サイトを気づかないうちに壊してしまう原因となる項目です。作業を始める前に把握しておいてください。
-
画像フィールドは文字列ではなくオブジェクトです。
post.data.featured_imageは{ id, src, alt }です。<img src={post.data.featured_image} />と記述すると、[object Object]が表示されます。"emdash/ui"の<Image image={post.data.featured_image} />を使用してください。 -
entry.idとentry.data.idは別のものです。entry.idはスラッグで、URL にロケールのプレフィックスが付く場合はロケールが先頭に付きます(en/my-post)。URL にはこちらを使用してください。entry.data.slugはプレフィックスのないスラッグです。entry.data.idはデータベースの ULID です(実際の ID を必要とするgetEntryTerms、Comments、その他の API 呼び出しに使用します)。これらを取り違えると、エラーが出ないまま結果が空になります。 -
タクソノミー名はシードと完全に一致させる必要があります。 シードで
"name": "category"と定義した場合は、getTerm("category", slug)をクエリしてください。"categories"ではありません。名前が違うと、エラーが出ずに結果が空になります。 -
Astro のキャッシュが有効な場合は、キャッシュヒントを登録してください。 コンテンツクエリは
cacheHintを返します。これをAstro.cache.set(cacheHint)に渡してください。キャッシュされたルートでサイト設定、メニュー、タクソノミーの用語、ウィジェットエリアをレンダリングする場合は、getSiteSettingsWithCacheHint()、getMenuWithCacheHint()、getTaxonomyTermsWithCacheHint()、getWidgetAreaWithCacheHint()を使用してください。 -
CMS コンテンツに
getStaticPathsは使用しません。 EmDash のコンテンツは動的です。ページはサーバーサイドでレンダリングする必要があります(astro.config.mjsでoutput: "server"を指定します)。
ファイル構成
すべての EmDash サイトには、次の重要なファイルがあります。
my-site/
├── astro.config.mjs # Astro config with emdash() integration
├── src/
│ ├── live.config.ts # EmDash loader registration (boilerplate)
│ ├── pages/ # Astro pages (all server-rendered)
│ ├── layouts/ # Layout components
│ └── components/ # Reusable components
├── seed/
│ └── seed.json # Schema + demo content
├── emdash-env.d.ts # Generated types (from `emdash types`)
└── package.json
ワークフロー
1. プロジェクトを設定する
astro.config.mjs、live.config.ts、デプロイ先(Node または Cloudflare)、型生成については、references/configuration.md を参照してください。
2. スキーマを設計する
コレクション定義、フィールドの型、タクソノミー、メニュー、ウィジェットエリア、セクション、署名欄、シードファイルの完全な形式については、references/schema-and-seed.md を参照してください。
3. ページを構築する
コンテンツクエリ、Portable Text のレンダリング、Image コンポーネント、ビジュアル編集用属性、キャッシュ、一般的なページパターン(一覧、詳細、タクソノミーアーカイブ、RSS、検索、404)については、references/querying-and-rendering.md を参照してください。
4. サイト機能を組み込む
サイト設定、ナビゲーションメニュー、タクソノミー、ウィジェットエリア、検索、SEO メタ情報、コメント、ページのコントリビューションについては、references/site-features.md を参照してください。
5. シードファイルを作成する
コレクション、フィールド、タクソノミー、メニュー、ウィジェット、サンプルコンテンツを含む seed/seed.json を作成してください。
6. 実行して確認する
pnpm dev # Start the Astro dev server
ランタイムは最初のリクエスト時に保留中のマイグレーションを実行し、セットアップが完了するまではシードのスキーマと構造を一度だけ適用します。サンプルコンテンツの適用には明示的な手順が必要です。シードの適用を参照してください。サーバーの起動時に Astro インテグレーションが emdash-env.d.ts を生成します。管理 UI は http://localhost:4321/_emdash/admin にあります。
API クイックリファレンス
// Content (entries have .data.byline and .data.bylines eagerly loaded)
import { getEmDashCollection, getEmDashEntry } from "emdash";
const { entries, nextCursor, cacheHint } = await getEmDashCollection("posts", {
limit: 10,
cursor,
orderBy: { published_at: "desc" },
});
const { entry: post, cacheHint: entryCacheHint } = await getEmDashEntry("posts", slug);
// Site features
import {
getSiteSettings,
getSiteSettingsWithCacheHint,
getMenu,
getMenuWithCacheHint,
getTaxonomyTerms,
getTaxonomyTermsWithCacheHint,
getTerm,
getEntryTerms,
getEntriesByTerm,
getWidgetArea,
getWidgetAreaWithCacheHint,
search,
getSection,
getSeoMeta,
} from "emdash";
// Bylines (standalone queries -- usually not needed since entries have bylines attached)
import { getByline, getBylineBySlug } from "emdash";
// UI components
import {
PortableText,
Blocks,
defineBlockComponents,
Image,
WidgetArea,
EmDashHead,
EmDashBodyStart,
EmDashBodyEnd,
} from "emdash/ui";
import { Comments, CommentForm } from "emdash/ui/comments";
import LiveSearch from "emdash/ui/search";
// Page context (for plugin contributions)
import { createPublicPageContext } from "emdash/page";
プラグイン
EmDash は、フック、ストレージ、設定、管理 UI、API ルート、カスタム Portable Text ブロックタイプを使って CMS を拡張するプラグインに対応しています。次のような場合は、プラグインの使用を検討してください。
- コンテンツのライフサイクルイベントに対応する(例:公開時に通知を送信する、外部サービスと同期する)
- カスタム管理ページやダッシュボードウィジェットを追加する
- 再利用可能な動作やカスタム Portable Text タイプを追加する(例:埋め込みマップやコードプレイグラウンド)
- 再利用可能なサービスを提供する(例:サードパーティープロバイダーを介した分析、フォーム、コメント)
プラグインは astro.config.mjs に登録します。
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file" }),
plugins: [myPlugin()],
}),
プラグインを作成するには、creating-plugins スキルを読み込んでください(.agents/skills/creating-plugins/)。プラグインの構成、フック、ストレージ、管理 UI、API ルート、Portable Text ブロック、機能、definePlugin() API の全容について解説しています。
リファレンスドキュメント
| ファイル | 内容 |
|---|---|
| references/configuration.md | プロジェクトのセットアップ、astro.config、live.config、デプロイ、型 |
| references/schema-and-seed.md | コレクション、フィールド、分類、メニュー、ウィジェット、シード形式 |
| references/querying-and-rendering.md | コンテンツ API、PortableText、画像、キャッシュ、ページのパターン |
| references/site-features.md | 設定、メニュー、ウィジェット、検索、SEO、コメント、ページへの機能追加 |