cmx-sdk 0.2.9 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/add-studio-YUDYE2OH.js +0 -0
- package/dist/chunk-7TDMLYBI.js +0 -0
- package/dist/chunk-EDXXR5BE.js +0 -0
- package/dist/chunk-FPQYL5GE.js +0 -0
- package/dist/chunk-IIQLQIDP.js +0 -0
- package/dist/chunk-NZQ6SBFS.js +0 -0
- package/dist/{chunk-EZMBZWH7.js → chunk-Y3S3K6M3.js} +73 -28
- package/dist/cli.js +2 -2
- package/dist/init-FLRQXJX4.js +0 -0
- package/dist/{interactive-menu-FYVOQSTL.js → interactive-menu-5PRQIESI.js} +1 -1
- package/dist/studio-HAS6DYLO.js +0 -0
- package/dist/{update-sdk-KJZ6VB4M.js → update-sdk-ZXMWQF3I.js} +2 -1
- package/dist/update-studio-TWCYSYIS.js +0 -0
- package/package.json +14 -16
- package/templates/AGENTS.md +0 -173
- package/templates/CLAUDE.md +0 -28
- package/templates/claude/commands/check.md +0 -64
- package/templates/claude/commands/next-action.md +0 -66
- package/templates/claude/skills/cmx-cache/SKILL.md +0 -50
- package/templates/claude/skills/cmx-cache/references/cache-patterns.md +0 -153
- package/templates/claude/skills/cmx-component/SKILL.md +0 -108
- package/templates/claude/skills/cmx-component/references/component-schema.md +0 -123
- package/templates/claude/skills/cmx-content/SKILL.md +0 -158
- package/templates/claude/skills/cmx-content/references/migration-patterns.md +0 -120
- package/templates/claude/skills/cmx-content/references/seed-patterns.md +0 -146
- package/templates/claude/skills/cmx-dev/SKILL.md +0 -266
- package/templates/claude/skills/cmx-dev/references/api-patterns.md +0 -220
- package/templates/claude/skills/cmx-dev/references/cli-reference.md +0 -54
- package/templates/claude/skills/cmx-form/SKILL.md +0 -103
- package/templates/claude/skills/cmx-form/references/form-template.md +0 -152
- package/templates/claude/skills/cmx-migrate/SKILL.md +0 -501
- package/templates/claude/skills/cmx-migrate/references/analysis-guide.md +0 -127
- package/templates/claude/skills/cmx-migrate/references/html-to-mdx.md +0 -99
- package/templates/claude/skills/cmx-migrate/references/intermediate-format.md +0 -196
- package/templates/claude/skills/cmx-migrate/references/tool-setup.md +0 -150
- package/templates/claude/skills/cmx-schema/SKILL.md +0 -159
- package/templates/claude/skills/cmx-schema/references/field-types.md +0 -164
- package/templates/claude/skills/cmx-schema/references/migration-scenarios.md +0 -44
- package/templates/claude/skills/cmx-seo/SKILL.md +0 -54
- package/templates/claude/skills/cmx-seo/references/seo-patterns.md +0 -216
- package/templates/claude/skills/cmx-style/SKILL.md +0 -48
- package/templates/claude/skills/cmx-style/references/style-patterns.md +0 -114
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# HTML → MDX 変換ルール
|
|
2
|
-
|
|
3
|
-
子エージェントがコンテンツ変換時に参照するルール。
|
|
4
|
-
|
|
5
|
-
## 基本変換テーブル
|
|
6
|
-
|
|
7
|
-
| HTML | MDX |
|
|
8
|
-
|------|-----|
|
|
9
|
-
| `<h1>` | `# `(通常はtitleフィールドに抽出、本文には含めない) |
|
|
10
|
-
| `<h2>` | `## ` |
|
|
11
|
-
| `<h3>` | `### ` |
|
|
12
|
-
| `<h4>` | `#### ` |
|
|
13
|
-
| `<p>` | そのまま(タグ除去、前後に空行) |
|
|
14
|
-
| `<strong>`, `<b>` | `**テキスト**` |
|
|
15
|
-
| `<em>`, `<i>` | `*テキスト*` |
|
|
16
|
-
| `<a href="url">` | `[テキスト](url)` |
|
|
17
|
-
| `<ul><li>` | `- テキスト` |
|
|
18
|
-
| `<ol><li>` | `1. テキスト` |
|
|
19
|
-
| `<blockquote>` | `> テキスト` |
|
|
20
|
-
| `<code>` | `` `テキスト` `` |
|
|
21
|
-
| `<pre><code>` | ` ```lang\nコード\n``` ` |
|
|
22
|
-
| `<img src="url" alt="text">` | `` |
|
|
23
|
-
| `<table>` | Markdown テーブル |
|
|
24
|
-
| `<hr>` | `---` |
|
|
25
|
-
| `<br>` | 改行(`\n`) |
|
|
26
|
-
|
|
27
|
-
## 除去するもの
|
|
28
|
-
|
|
29
|
-
- `<script>` タグとその中身
|
|
30
|
-
- `<style>` タグとその中身
|
|
31
|
-
- `<iframe>` タグ(広告、埋め込み等)
|
|
32
|
-
- `<nav>` タグ(ナビゲーション)
|
|
33
|
-
- `<header>` タグ(サイト共通ヘッダー)
|
|
34
|
-
- `<footer>` タグ(サイト共通フッター)
|
|
35
|
-
- `<aside>` タグ(サイドバー)
|
|
36
|
-
- `class` 属性、`id` 属性、`style` 属性
|
|
37
|
-
- `data-*` 属性
|
|
38
|
-
- コメント `<!-- ... -->`
|
|
39
|
-
- 広告関連の要素
|
|
40
|
-
|
|
41
|
-
## URL 変換
|
|
42
|
-
|
|
43
|
-
- 相対URL → 絶対URL に変換
|
|
44
|
-
- `/images/photo.jpg` → `https://old-site.com/images/photo.jpg`
|
|
45
|
-
- 内部リンクは移行先のパスに変換可能であれば変換
|
|
46
|
-
- `/blog/post-1` → `/blog/post-1`(パスが同じなら変更不要)
|
|
47
|
-
- 画像は外部URLのまま維持(後で Admin にアップロード可能)
|
|
48
|
-
|
|
49
|
-
## メタデータ抽出
|
|
50
|
-
|
|
51
|
-
コンテンツ本文とは別に以下を抽出:
|
|
52
|
-
|
|
53
|
-
| フィールド | 抽出元 |
|
|
54
|
-
|-----------|-------|
|
|
55
|
-
| title | `<h1>` or `<title>` |
|
|
56
|
-
| description | `<meta name="description">` |
|
|
57
|
-
| slug | URLパスの末尾部分(`/blog/my-post` → `my-post`) |
|
|
58
|
-
| publishedAt | `<time>` or `<meta property="article:published_time">` |
|
|
59
|
-
| thumbnail | `<meta property="og:image">` or 記事内最初の `<img>` |
|
|
60
|
-
|
|
61
|
-
## slug 生成ルール
|
|
62
|
-
|
|
63
|
-
- URLパスの末尾セグメントを使用
|
|
64
|
-
- `https://old-site.com/blog/2024/01/my-article` → `my-article`
|
|
65
|
-
- 日本語URLの場合はローマ字化または英語化
|
|
66
|
-
- 使用可能文字: 英数字、ハイフン
|
|
67
|
-
- 重複チェック: 既存slugと衝突する場合は `-2`, `-3` を付加
|
|
68
|
-
|
|
69
|
-
## MDXコンポーネント置換
|
|
70
|
-
|
|
71
|
-
既存サイトのUIパターンがMDXコンポーネントとして定義されている場合、対応するHTMLをコンポーネントに置換する。
|
|
72
|
-
|
|
73
|
-
```html
|
|
74
|
-
<!-- 移行元 -->
|
|
75
|
-
<div class="feature-card">
|
|
76
|
-
<span class="icon">✨</span>
|
|
77
|
-
<h3>高速</h3>
|
|
78
|
-
<p>パフォーマンスに優れています</p>
|
|
79
|
-
</div>
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
```mdx
|
|
83
|
-
<!-- 移行後 -->
|
|
84
|
-
<FeatureCard icon="✨" title="高速">
|
|
85
|
-
パフォーマンスに優れています
|
|
86
|
-
</FeatureCard>
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
ただし、コンポーネント置換は `src/components/custom/index.ts` に export されているもののみ使用可能。
|
|
90
|
-
|
|
91
|
-
## 品質チェック
|
|
92
|
-
|
|
93
|
-
変換後のMDXが以下を満たすか確認:
|
|
94
|
-
- Markdownとして正しい構文か
|
|
95
|
-
- 空行が適切に挿入されているか
|
|
96
|
-
- リスト、テーブルのインデントが正しいか
|
|
97
|
-
- コードブロックの言語指定があるか
|
|
98
|
-
- 画像のalt属性が設定されているか
|
|
99
|
-
- 不要なHTMLタグが残っていないか
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
# 中間フォーマット定義
|
|
2
|
-
|
|
3
|
-
## site-map.json
|
|
4
|
-
|
|
5
|
-
Step 1(解析)で生成し、Step 2(計画)以降で参照する構造化データ。
|
|
6
|
-
|
|
7
|
-
```json
|
|
8
|
-
{
|
|
9
|
-
"sourceUrl": "https://example.com",
|
|
10
|
-
"analyzedAt": "2026-02-17",
|
|
11
|
-
|
|
12
|
-
"navigation": {
|
|
13
|
-
"primary": [
|
|
14
|
-
{ "label": "ブログ", "href": "/blog" },
|
|
15
|
-
{ "label": "会社概要", "href": "/about" },
|
|
16
|
-
{ "label": "お問い合わせ", "href": "/contact" }
|
|
17
|
-
],
|
|
18
|
-
"footer": [
|
|
19
|
-
{ "label": "プライバシーポリシー", "href": "/privacy" }
|
|
20
|
-
]
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
"pageGroups": [
|
|
24
|
-
{
|
|
25
|
-
"pattern": "/blog/*",
|
|
26
|
-
"type": "collection",
|
|
27
|
-
"suggestedCmxType": "post",
|
|
28
|
-
"suggestedSlug": "blog",
|
|
29
|
-
"suggestedName": "ブログ",
|
|
30
|
-
"listPage": "/blog",
|
|
31
|
-
"sampleDetailPages": ["/blog/article-1", "/blog/article-2"],
|
|
32
|
-
"totalCount": 25,
|
|
33
|
-
"fields": [
|
|
34
|
-
{ "key": "title", "type": "text", "selector": "h1", "required": true },
|
|
35
|
-
{ "key": "date", "type": "date", "selector": "time" },
|
|
36
|
-
{ "key": "category", "type": "relation", "values": ["技術", "デザイン", "ビジネス"] },
|
|
37
|
-
{ "key": "tags", "type": "relation_multi", "values": ["Next.js", "TypeScript", "React"] },
|
|
38
|
-
{ "key": "thumbnail", "type": "image" },
|
|
39
|
-
{ "key": "author", "type": "text" },
|
|
40
|
-
{ "key": "body", "type": "richtext", "selector": "article" }
|
|
41
|
-
],
|
|
42
|
-
"suggestedDataTypes": ["categories", "tags"]
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"pattern": "/news/*",
|
|
46
|
-
"type": "collection",
|
|
47
|
-
"suggestedCmxType": "news",
|
|
48
|
-
"suggestedSlug": "news",
|
|
49
|
-
"suggestedName": "お知らせ",
|
|
50
|
-
"listPage": "/news",
|
|
51
|
-
"sampleDetailPages": ["/news/announcement-1"],
|
|
52
|
-
"totalCount": 15,
|
|
53
|
-
"fields": [
|
|
54
|
-
{ "key": "title", "type": "text", "required": true },
|
|
55
|
-
{ "key": "date", "type": "date" },
|
|
56
|
-
{ "key": "category", "type": "relation", "values": ["プレスリリース", "イベント"] },
|
|
57
|
-
{ "key": "body", "type": "richtext" }
|
|
58
|
-
],
|
|
59
|
-
"suggestedDataTypes": ["categories"]
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"pattern": "/about",
|
|
63
|
-
"type": "static-page",
|
|
64
|
-
"sections": [
|
|
65
|
-
{ "id": "hero", "description": "ヒーローセクション(キャッチコピー + CTA)" },
|
|
66
|
-
{ "id": "mission", "description": "ミッション・ビジョン" },
|
|
67
|
-
{ "id": "team", "description": "メンバー一覧(カード型、5名)" },
|
|
68
|
-
{ "id": "history", "description": "沿革タイムライン" }
|
|
69
|
-
]
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"pattern": "/contact",
|
|
73
|
-
"type": "form",
|
|
74
|
-
"fields": [
|
|
75
|
-
{ "key": "name", "type": "text", "label": "お名前", "required": true },
|
|
76
|
-
{ "key": "email", "type": "email", "label": "メールアドレス", "required": true },
|
|
77
|
-
{ "key": "company", "type": "text", "label": "会社名" },
|
|
78
|
-
{ "key": "message", "type": "textarea", "label": "お問い合わせ内容", "required": true }
|
|
79
|
-
]
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"pattern": "/faq",
|
|
83
|
-
"type": "data-type-page",
|
|
84
|
-
"suggestedSlug": "faq",
|
|
85
|
-
"description": "アコーディオン型FAQ一覧"
|
|
86
|
-
}
|
|
87
|
-
],
|
|
88
|
-
|
|
89
|
-
"dataTypeCandidates": [
|
|
90
|
-
{
|
|
91
|
-
"slug": "staff",
|
|
92
|
-
"name": "スタッフ",
|
|
93
|
-
"source": "/about セクション #team",
|
|
94
|
-
"entryCount": 5,
|
|
95
|
-
"fields": [
|
|
96
|
-
{ "key": "name", "label": "名前", "type": "text", "required": true },
|
|
97
|
-
{ "key": "position", "label": "役職", "type": "text" },
|
|
98
|
-
{ "key": "bio", "label": "自己紹介", "type": "textarea" },
|
|
99
|
-
{ "key": "photo", "label": "写真", "type": "image" }
|
|
100
|
-
]
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
"slug": "faq",
|
|
104
|
-
"name": "よくある質問",
|
|
105
|
-
"source": "/faq ページ",
|
|
106
|
-
"entryCount": 12,
|
|
107
|
-
"fields": [
|
|
108
|
-
{ "key": "question", "label": "質問", "type": "text", "required": true },
|
|
109
|
-
{ "key": "answer", "label": "回答", "type": "richtext", "required": true },
|
|
110
|
-
{ "key": "category", "label": "カテゴリ", "type": "select", "options": { "choices": ["一般", "料金", "技術"] } }
|
|
111
|
-
]
|
|
112
|
-
}
|
|
113
|
-
],
|
|
114
|
-
|
|
115
|
-
"componentCandidates": [
|
|
116
|
-
{
|
|
117
|
-
"name": "FeatureCard",
|
|
118
|
-
"description": "3カラムの特徴紹介カード",
|
|
119
|
-
"foundAt": ["/", "/about"],
|
|
120
|
-
"props": [
|
|
121
|
-
{ "name": "icon", "type": "string", "description": "アイコン(絵文字)" },
|
|
122
|
-
{ "name": "title", "type": "string", "description": "タイトル", "required": true },
|
|
123
|
-
{ "name": "children", "type": "string", "description": "説明文", "required": true }
|
|
124
|
-
]
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
"name": "CTA",
|
|
128
|
-
"description": "コールトゥアクションバナー",
|
|
129
|
-
"foundAt": ["/", "/about", "/blog"],
|
|
130
|
-
"props": [
|
|
131
|
-
{ "name": "title", "type": "string", "required": true },
|
|
132
|
-
{ "name": "description", "type": "string" },
|
|
133
|
-
{ "name": "buttonText", "type": "string", "required": true },
|
|
134
|
-
{ "name": "buttonUrl", "type": "string", "required": true }
|
|
135
|
-
]
|
|
136
|
-
}
|
|
137
|
-
],
|
|
138
|
-
|
|
139
|
-
"style": {
|
|
140
|
-
"colors": {
|
|
141
|
-
"primary": "#2563eb",
|
|
142
|
-
"secondary": "#64748b",
|
|
143
|
-
"accent": "#f59e0b",
|
|
144
|
-
"background": "#ffffff",
|
|
145
|
-
"text": "#1e293b",
|
|
146
|
-
"muted": "#f1f5f9"
|
|
147
|
-
},
|
|
148
|
-
"fonts": {
|
|
149
|
-
"heading": "Noto Sans JP, sans-serif",
|
|
150
|
-
"body": "Noto Sans JP, sans-serif",
|
|
151
|
-
"code": "JetBrains Mono, monospace"
|
|
152
|
-
},
|
|
153
|
-
"fontSizes": {
|
|
154
|
-
"h1": "2.5rem",
|
|
155
|
-
"h2": "2rem",
|
|
156
|
-
"body": "1rem"
|
|
157
|
-
},
|
|
158
|
-
"tone": "プロフェッショナル・クリーン",
|
|
159
|
-
"layoutPattern": "container-centered",
|
|
160
|
-
"cardStyle": "shadow-sm with rounded corners"
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
## migration-plan.json
|
|
166
|
-
|
|
167
|
-
Step 2(計画)で生成。ユーザーと対話して確定した移行計画。
|
|
168
|
-
|
|
169
|
-
site-map.json の「提案」をユーザーが承認・修正した「確定版」。
|
|
170
|
-
|
|
171
|
-
```json
|
|
172
|
-
{
|
|
173
|
-
"sourceUrl": "https://example.com",
|
|
174
|
-
"confirmedAt": "2026-02-17",
|
|
175
|
-
"collections": [...],
|
|
176
|
-
"dataTypes": [...],
|
|
177
|
-
"components": [...],
|
|
178
|
-
"forms": [...],
|
|
179
|
-
"routes": [...],
|
|
180
|
-
"style": {...}
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
`site-map.json` との違い:
|
|
185
|
-
- `pageGroups` → `collections` + `routes` に分解・確定
|
|
186
|
-
- `suggestedCmxType` → `type` に確定
|
|
187
|
-
- `dataTypeCandidates` → `dataTypes` に確定(不要なものは除外済み)
|
|
188
|
-
- `componentCandidates` → `components` に確定(選択されたもののみ)
|
|
189
|
-
|
|
190
|
-
## build-result.json
|
|
191
|
-
|
|
192
|
-
Step 3(構築)で生成。SDK コマンドで登録した結果のID一覧。
|
|
193
|
-
|
|
194
|
-
## content-result.json
|
|
195
|
-
|
|
196
|
-
Step 4(コンテンツ投入)で生成。各バッチの結果を集約した投入結果。
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
# ツールセットアップガイド
|
|
2
|
-
|
|
3
|
-
## Firecrawl CLI
|
|
4
|
-
|
|
5
|
-
### インストール
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install -g firecrawl-cli
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
### APIキー設定
|
|
12
|
-
|
|
13
|
-
1. https://firecrawl.dev でアカウント作成(無料枠: 500クレジット)
|
|
14
|
-
2. APIキーを取得
|
|
15
|
-
3. `.env.local`(または `.env`)に追加:
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
FIRECRAWL_API_KEY=fc-your-api-key
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
4. firecrawl コマンド実行前に環境変数をシェルに読み込む:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
ENV_FILE=$( [ -f .env.local ] && echo .env.local || echo .env )
|
|
25
|
-
set -a && source "$ENV_FILE" 2>/dev/null && set +a
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
> **補足**: `firecrawl login --api-key fc-your-api-key` でCLI自体に認証情報を保存する方法もあるが、上記の環境変数読み込みで十分。
|
|
29
|
-
|
|
30
|
-
### セルフホスト(無料・無制限)
|
|
31
|
-
|
|
32
|
-
APIクレジットを消費せず使いたい場合:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
git clone https://github.com/firecrawl/firecrawl.git
|
|
36
|
-
cd firecrawl
|
|
37
|
-
cp .env.example .env
|
|
38
|
-
docker compose up -d
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
セルフホスト時は `.env.local`(または `.env`)に接続先を指定:
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
FIRECRAWL_API_URL=http://localhost:3002
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### 主要コマンド
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
# サイト内の全URLを発見(コンテンツ取得なし、高速)
|
|
51
|
-
firecrawl map https://example.com --limit 1000 -o urls.json
|
|
52
|
-
|
|
53
|
-
# サイト全体をクロール(Markdown取得)
|
|
54
|
-
firecrawl crawl https://example.com --limit 200 --max-depth 3 --wait --progress -o crawl-result.json
|
|
55
|
-
|
|
56
|
-
# 単一ページをスクレイプ(スクショ付き)
|
|
57
|
-
firecrawl scrape https://example.com --format markdown,screenshot -o page.json
|
|
58
|
-
|
|
59
|
-
# 構造化データ抽出(LLMが解析)
|
|
60
|
-
firecrawl scrape https://example.com/blog --format json --json-prompt "Extract list items with their fields" -o structure.json
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### クレジット消費目安
|
|
64
|
-
|
|
65
|
-
| 操作 | クレジット消費 |
|
|
66
|
-
|------|-------------|
|
|
67
|
-
| map(URL発見) | 1クレジット/リクエスト |
|
|
68
|
-
| scrape(単一ページ) | 1クレジット/ページ |
|
|
69
|
-
| crawl(サイトクロール) | 1クレジット/ページ |
|
|
70
|
-
| extract(構造化抽出) | 5クレジット/リクエスト |
|
|
71
|
-
|
|
72
|
-
無料枠 500 クレジットで中小サイト(〜200ページ)の移行が1回可能。
|
|
73
|
-
|
|
74
|
-
## agent-browser
|
|
75
|
-
|
|
76
|
-
Claude Code に組み込みのスキルとして利用可能。追加インストール不要。
|
|
77
|
-
|
|
78
|
-
### 主要コマンド
|
|
79
|
-
|
|
80
|
-
```
|
|
81
|
-
# ページを開く
|
|
82
|
-
open https://example.com
|
|
83
|
-
|
|
84
|
-
# スクリーンショット撮影
|
|
85
|
-
screenshot output-path.png
|
|
86
|
-
|
|
87
|
-
# DOMスナップショット(セマンティック構造)
|
|
88
|
-
snapshot
|
|
89
|
-
|
|
90
|
-
# JavaScript実行
|
|
91
|
-
eval "document.title"
|
|
92
|
-
eval "JSON.stringify(getComputedStyle(document.body))"
|
|
93
|
-
|
|
94
|
-
# 要素クリック
|
|
95
|
-
click @e5
|
|
96
|
-
|
|
97
|
-
# テキスト取得
|
|
98
|
-
text @e10
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### スタイル情報抽出のパターン
|
|
102
|
-
|
|
103
|
-
```javascript
|
|
104
|
-
// 主要な CSS 変数/カラーを一括取得
|
|
105
|
-
eval "JSON.stringify({
|
|
106
|
-
bodyBg: getComputedStyle(document.body).backgroundColor,
|
|
107
|
-
bodyColor: getComputedStyle(document.body).color,
|
|
108
|
-
bodyFont: getComputedStyle(document.body).fontFamily,
|
|
109
|
-
bodyFontSize: getComputedStyle(document.body).fontSize,
|
|
110
|
-
h1Font: document.querySelector('h1') ? getComputedStyle(document.querySelector('h1')).fontFamily : null,
|
|
111
|
-
h1Size: document.querySelector('h1') ? getComputedStyle(document.querySelector('h1')).fontSize : null,
|
|
112
|
-
h1Weight: document.querySelector('h1') ? getComputedStyle(document.querySelector('h1')).fontWeight : null,
|
|
113
|
-
linkColor: document.querySelector('a') ? getComputedStyle(document.querySelector('a')).color : null,
|
|
114
|
-
navBg: document.querySelector('nav') ? getComputedStyle(document.querySelector('nav')).backgroundColor : null,
|
|
115
|
-
footerBg: document.querySelector('footer') ? getComputedStyle(document.querySelector('footer')).backgroundColor : null
|
|
116
|
-
})"
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## cmx-sdk CLI
|
|
120
|
-
|
|
121
|
-
プロジェクト内蔵。`npx cmx-sdk` で実行。
|
|
122
|
-
|
|
123
|
-
### 移行で使用する主要コマンド
|
|
124
|
-
|
|
125
|
-
<!-- cmx-sync:start id="skill-cmx-migrate-tool-setup-command-block" -->
|
|
126
|
-
```bash
|
|
127
|
-
# スキーマ登録
|
|
128
|
-
npx cmx-sdk create-collection --json '{...}'
|
|
129
|
-
npx cmx-sdk create-data-type --json '{...}'
|
|
130
|
-
npx cmx-sdk create-data-entry --type-slug staff --json '{...}'
|
|
131
|
-
|
|
132
|
-
# コード生成
|
|
133
|
-
npx cmx-sdk codegen types
|
|
134
|
-
npx cmx-sdk codegen pages --template layered
|
|
135
|
-
|
|
136
|
-
# コンテンツ投入
|
|
137
|
-
npx cmx-sdk create-content --collection blog --json '{...}'
|
|
138
|
-
npx cmx-sdk create-content --collection blog --file content.json
|
|
139
|
-
|
|
140
|
-
# 参照設定
|
|
141
|
-
npx cmx-sdk set-content-references --id {contentId} --json '{...}'
|
|
142
|
-
|
|
143
|
-
# ステータス変更
|
|
144
|
-
npx cmx-sdk request-review-content --id {contentId}
|
|
145
|
-
npx cmx-sdk publish-content --id {contentId}
|
|
146
|
-
|
|
147
|
-
# コンポーネント
|
|
148
|
-
npx cmx-sdk components scaffold --name FeatureCard
|
|
149
|
-
```
|
|
150
|
-
<!-- cmx-sync:end -->
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cmx-schema
|
|
3
|
-
description: |
|
|
4
|
-
CMXのデータタイプ・コレクションのJSON定義を生成し、SDK API 経由で自動登録する。
|
|
5
|
-
既存サイトのデータ構造をCMXに移行する際のスキーマ変換・定義生成を担う。
|
|
6
|
-
トリガー: 「スキーマを生成」「データタイプのJSON」「コレクションのJSON」「移行用のスキーマ」
|
|
7
|
-
「CMXにインポートするJSON」「データ構造を定義」「サイトを移行」「データタイプを作りたい」
|
|
8
|
-
「コレクションを追加したい」「フィールド定義」「JSON定義」「インポート用JSON」
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# CMX スキーマ JSON 生成ガイド
|
|
12
|
-
|
|
13
|
-
既存サイトのデータ構造をCMXに移行するためのJSON定義を生成する。
|
|
14
|
-
生成したJSONは、ユーザーに確認後、SDK API 経由で自動登録する。
|
|
15
|
-
|
|
16
|
-
## タスク判定
|
|
17
|
-
|
|
18
|
-
- **フィールドタイプの詳細やオプションを確認** → [references/field-types.md](references/field-types.md)
|
|
19
|
-
- **サイト種別ごとの構成例が必要** → [references/migration-scenarios.md](references/migration-scenarios.md)
|
|
20
|
-
|
|
21
|
-
## データタイプ JSON
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"slug": "英数字-ハイフン",
|
|
26
|
-
"name": "表示名",
|
|
27
|
-
"description": "説明(任意)",
|
|
28
|
-
"fields": [
|
|
29
|
-
{
|
|
30
|
-
"key": "英数字_アンダースコア",
|
|
31
|
-
"label": "表示ラベル",
|
|
32
|
-
"type": "text",
|
|
33
|
-
"required": true,
|
|
34
|
-
"description": "ヘルプテキスト(任意)",
|
|
35
|
-
"options": {}
|
|
36
|
-
}
|
|
37
|
-
]
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
フィールドの `type` は `text`, `textarea`, `richtext`, `number`, `date`, `datetime`, `boolean`, `select`, `multiselect`, `image`, `file`, `json`, `url`, `email`, `relation` のいずれか。各タイプの `options` 詳細は [references/field-types.md](references/field-types.md) を参照。
|
|
42
|
-
|
|
43
|
-
## コレクション JSON
|
|
44
|
-
|
|
45
|
-
```json
|
|
46
|
-
{
|
|
47
|
-
"type": "post",
|
|
48
|
-
"slug": "英数字-ハイフン",
|
|
49
|
-
"name": "表示名",
|
|
50
|
-
"description": "説明(任意)",
|
|
51
|
-
"dataTypes": ["categories", "tags"]
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
`type` の選択:
|
|
56
|
-
|
|
57
|
-
| type | 用途 | おすすめデータタイプ | フロントマターフィールド |
|
|
58
|
-
|------|------|---------------------|------------------------|
|
|
59
|
-
| `post` | ブログ、コラム(時系列コンテンツ) | カテゴリ、タグ、著者、連載 | title, description, published_at, locale |
|
|
60
|
-
| `page` | 固定ページ(会社概要、サービス紹介) | なし | title, description, locale |
|
|
61
|
-
| `doc` | ドキュメント(ツリー構造、マニュアル) | なし | title, description, order, locale |
|
|
62
|
-
| `news` | ニュース、お知らせ | カテゴリ | title, description, published_at, expires_at, important, locale |
|
|
63
|
-
|
|
64
|
-
### 付属データタイプ(プリセット)
|
|
65
|
-
|
|
66
|
-
コレクション作成時に `dataTypes` フィールドでプリセットslugの配列を指定すると、対応するデータタイプが自動作成される。省略時はそのCollectionTypeのデフォルトプリセットが適用される。
|
|
67
|
-
|
|
68
|
-
利用可能なプリセット:
|
|
69
|
-
|
|
70
|
-
| slug | 名前 | 選択方式 | デフォルト(post) | デフォルト(news) |
|
|
71
|
-
|------|------|---------|-----------------|-----------------|
|
|
72
|
-
| `categories` | カテゴリ | 単一選択 | ✅ | ✅ |
|
|
73
|
-
| `tags` | タグ | 複数選択 | ✅ | - |
|
|
74
|
-
| `authors` | 著者 | 単一選択 | - | - |
|
|
75
|
-
| `series` | 連載 | 単一選択 | - | - |
|
|
76
|
-
|
|
77
|
-
プリセット一覧を確認:
|
|
78
|
-
```bash
|
|
79
|
-
npx cmx-sdk list-collection-presets --type post
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
データタイプ不要(`doc`, `page` 等)の場合は空配列 `"dataTypes": []` を指定。
|
|
83
|
-
|
|
84
|
-
## 登録手順
|
|
85
|
-
|
|
86
|
-
### 1. JSON定義の生成
|
|
87
|
-
|
|
88
|
-
要件に基づいてコレクションまたはデータタイプのJSON定義を生成する。
|
|
89
|
-
|
|
90
|
-
### 2. 既存データの確認
|
|
91
|
-
|
|
92
|
-
まず既存のコレクション・データタイプを確認して、重複がないことを確認:
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
npx cmx-sdk list-collections
|
|
96
|
-
npx cmx-sdk list-data-types
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### 3. ユーザーへの確認
|
|
100
|
-
|
|
101
|
-
生成したJSON定義をユーザーに提示し、登録の承認を得る:
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
以下のスキーマを CMX Admin に登録します:
|
|
105
|
-
|
|
106
|
-
【コレクション】
|
|
107
|
-
- {name} ({slug}) — type: {type}
|
|
108
|
-
|
|
109
|
-
【データタイプ】
|
|
110
|
-
- {name} ({slug}) — フィールド数: {n}
|
|
111
|
-
|
|
112
|
-
重複はありません。
|
|
113
|
-
|
|
114
|
-
**このまま Admin に登録しますか?**
|
|
115
|
-
(または、JSON を出力して手動で登録することもできます)
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### 4. cmx-sdk で登録
|
|
119
|
-
|
|
120
|
-
承認されたら、`cmx-sdk` コマンドで登録する。
|
|
121
|
-
|
|
122
|
-
**コレクションの登録(プリセットデータタイプ付き):**
|
|
123
|
-
```bash
|
|
124
|
-
npx cmx-sdk create-collection --json '{"type":"post","slug":"blog","name":"ブログ","description":"ブログ記事を管理","dataTypes":["categories","tags"]}'
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
コレクション作成時にプリセットが自動適用され、`blog-categories`、`blog-tags` などのデータタイプが自動作成される。
|
|
128
|
-
|
|
129
|
-
**コレクションの付属データタイプを後から追加:**
|
|
130
|
-
```bash
|
|
131
|
-
# プリセットから追加
|
|
132
|
-
npx cmx-sdk add-collection-data-type --collection blog --preset authors
|
|
133
|
-
|
|
134
|
-
# カスタムで追加
|
|
135
|
-
npx cmx-sdk add-collection-data-type --collection blog --json '{"slug":"custom-field","name":"カスタム","referenceType":"single","fields":[{"key":"name","label":"名前","type":"text","required":true}]}'
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**グローバルデータタイプの登録:**
|
|
139
|
-
```bash
|
|
140
|
-
# カスタムフィールドで登録(推奨)
|
|
141
|
-
npx cmx-sdk create-data-type --json '{"slug":"products","name":"商品","description":"商品情報","fields":[{"key":"name","label":"名前","type":"text","required":true},{"key":"published","label":"公開","type":"boolean","required":true,"defaultValue":false}]}'
|
|
142
|
-
|
|
143
|
-
# プリセートを使用する場合(参考例)
|
|
144
|
-
npx cmx-sdk create-data-type --json '{"slug":"staff","name":"スタッフ","presetSlug":"staff"}'
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### グローバルプリセット(参考例)
|
|
148
|
-
|
|
149
|
-
参考として以下のプリセートが用意されていますが、**カスタムフィールドで自由に定義することを推奨**します。
|
|
150
|
-
|
|
151
|
-
| slug | フィールド例 | 用途例 |
|
|
152
|
-
|------|----------|------|
|
|
153
|
-
| `staff` | name, role, bio, avatar, email, published | スタッフ情報、チームメンバー紹介 |
|
|
154
|
-
| `locations` | name, address, description, latitude, longitude, image, published | 店舗・施設情報、アクセスマップ |
|
|
155
|
-
|
|
156
|
-
**公開/非公開の制御:**
|
|
157
|
-
- グローバルデータタイプは公開サイトに直接表示されるため、`published` フィールド(boolean)で公開/非公開を制御するのが一般的
|
|
158
|
-
- コレクションに紐付くデータタイプ(categories, tags, authors)はコンテンツの公開ステータスで制御されるため、`published` フィールドは不要
|
|
159
|
-
|