@se-studio/contentful-cms 3.9.4 → 3.10.1
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/CHANGELOG.md +12 -0
- package/README.md +3 -3
- package/dist/commands/asset.d.ts.map +1 -1
- package/dist/commands/asset.js +20 -5
- package/dist/commands/asset.js.map +1 -1
- package/dist/commands/discard.d.ts +3 -0
- package/dist/commands/discard.d.ts.map +1 -1
- package/dist/commands/discard.js +16 -2
- package/dist/commands/discard.js.map +1 -1
- package/dist/commands/entry-lookup-target.d.ts +18 -0
- package/dist/commands/entry-lookup-target.d.ts.map +1 -1
- package/dist/commands/entry-lookup-target.js +14 -1
- package/dist/commands/entry-lookup-target.js.map +1 -1
- package/dist/commands/host-scaffold.js +1 -1
- package/dist/commands/media.d.ts.map +1 -1
- package/dist/commands/media.js +10 -5
- package/dist/commands/media.js.map +1 -1
- package/dist/commands/nav.d.ts.map +1 -1
- package/dist/commands/nav.js +46 -30
- package/dist/commands/nav.js.map +1 -1
- package/dist/commands/preview.d.ts.map +1 -1
- package/dist/commands/preview.js +23 -8
- package/dist/commands/preview.js.map +1 -1
- package/dist/contentful/assets.d.ts +4 -0
- package/dist/contentful/assets.d.ts.map +1 -1
- package/dist/contentful/assets.js +9 -0
- package/dist/contentful/assets.js.map +1 -1
- package/dist/contentful/cma-user-agent.d.ts +1 -1
- package/dist/contentful/cma-user-agent.d.ts.map +1 -1
- package/dist/contentful/hosted-asset-upload.d.ts +1 -1
- package/dist/contentful/hosted-asset-upload.d.ts.map +1 -1
- package/dist/contentful/hosted-asset-upload.js +1 -1
- package/dist/contentful/hosted-asset-upload.js.map +1 -1
- package/dist/contentful/pipeline-encode-gate.d.ts +27 -0
- package/dist/contentful/pipeline-encode-gate.d.ts.map +1 -0
- package/dist/contentful/pipeline-encode-gate.js +102 -0
- package/dist/contentful/pipeline-encode-gate.js.map +1 -0
- package/dist/editor-pack/generate.js +1 -1
- package/dist/editor-pack/generate.js.map +1 -1
- package/dist/generated/help-topics.d.ts.map +1 -1
- package/dist/generated/help-topics.js +1 -1
- package/dist/generated/help-topics.js.map +1 -1
- package/dist/generated/hosted-guide.d.ts +1 -1
- package/dist/generated/hosted-guide.d.ts.map +1 -1
- package/dist/generated/hosted-guide.js +1 -1
- package/dist/generated/hosted-guide.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/generated/version.js.map +1 -1
- package/dist/hosted/next/routes/staged-upload.d.ts +1 -0
- package/dist/hosted/next/routes/staged-upload.d.ts.map +1 -1
- package/dist/hosted/next/routes/staged-upload.js +38 -1
- package/dist/hosted/next/routes/staged-upload.js.map +1 -1
- package/dist/mcp/prompts/onboarding.d.ts.map +1 -1
- package/dist/mcp/prompts/onboarding.js +5 -5
- package/dist/mcp/prompts/onboarding.js.map +1 -1
- package/dist/mcp/tools/cms-edit.d.ts +1 -1
- package/dist/mcp/tools/cms-edit.d.ts.map +1 -1
- package/dist/mcp/tools/cms-edit.js +10 -5
- package/dist/mcp/tools/cms-edit.js.map +1 -1
- package/dist/mcp/tools/media.d.ts.map +1 -1
- package/dist/mcp/tools/media.js +18 -11
- package/dist/mcp/tools/media.js.map +1 -1
- package/dist/mcp/tools/staged-upload.d.ts.map +1 -1
- package/dist/mcp/tools/staged-upload.js +6 -4
- package/dist/mcp/tools/staged-upload.js.map +1 -1
- package/dist/media-pipeline/actions.d.ts +6 -8
- package/dist/media-pipeline/actions.d.ts.map +1 -1
- package/dist/media-pipeline/actions.js +10 -8
- package/dist/media-pipeline/actions.js.map +1 -1
- package/dist/media-pipeline/client.d.ts +11 -3
- package/dist/media-pipeline/client.d.ts.map +1 -1
- package/dist/media-pipeline/client.js +1 -4
- package/dist/media-pipeline/client.js.map +1 -1
- package/dist/media-pipeline/import-alt.d.ts +8 -0
- package/dist/media-pipeline/import-alt.d.ts.map +1 -0
- package/dist/media-pipeline/import-alt.js +23 -0
- package/dist/media-pipeline/import-alt.js.map +1 -0
- package/dist/media-pipeline/import.d.ts.map +1 -1
- package/dist/media-pipeline/import.js +45 -0
- package/dist/media-pipeline/import.js.map +1 -1
- package/dist/media-pipeline/limits.d.ts +2 -2
- package/dist/media-pipeline/limits.d.ts.map +1 -1
- package/dist/media-pipeline/limits.js +2 -2
- package/dist/media-pipeline/limits.js.map +1 -1
- package/dist/media-pipeline/prepare-source.d.ts +32 -0
- package/dist/media-pipeline/prepare-source.d.ts.map +1 -0
- package/dist/media-pipeline/prepare-source.js +132 -0
- package/dist/media-pipeline/prepare-source.js.map +1 -0
- package/dist/preview/resolve-preview-entry.d.ts +18 -0
- package/dist/preview/resolve-preview-entry.d.ts.map +1 -0
- package/dist/preview/resolve-preview-entry.js +30 -0
- package/dist/preview/resolve-preview-entry.js.map +1 -0
- package/dist/session/navigation-fields.d.ts +21 -0
- package/dist/session/navigation-fields.d.ts.map +1 -0
- package/dist/session/navigation-fields.js +79 -0
- package/dist/session/navigation-fields.js.map +1 -0
- package/dist/session/refs.d.ts +3 -3
- package/dist/session/refs.d.ts.map +1 -1
- package/dist/session/refs.js +6 -15
- package/dist/session/refs.js.map +1 -1
- package/dist/staged-upload/hmac.d.ts +4 -0
- package/dist/staged-upload/hmac.d.ts.map +1 -1
- package/dist/staged-upload/hmac.js +35 -0
- package/dist/staged-upload/hmac.js.map +1 -1
- package/dist/staged-upload/request.d.ts.map +1 -1
- package/dist/staged-upload/request.js +14 -11
- package/dist/staged-upload/request.js.map +1 -1
- package/dist/staged-upload/store.d.ts +2 -0
- package/dist/staged-upload/store.d.ts.map +1 -1
- package/dist/staged-upload/store.js +18 -0
- package/dist/staged-upload/store.js.map +1 -1
- package/docs/editor-tasks/media-pipeline-prepare.md +29 -18
- package/docs/editor-tasks/media-reuse-and-upload.md +23 -20
- package/docs/editor-tasks/navigation.md +11 -6
- package/docs/help/lookup.md +6 -3
- package/docs/mcp/hosted-guide.md +12 -10
- package/package.json +1 -1
- package/skills/core/SKILL.md +14 -11
|
@@ -33,10 +33,13 @@ Normalize a **folder of designer masters** into short-lived **public HTTPS URLs*
|
|
|
33
33
|
|
|
34
34
|
| Situation | Action |
|
|
35
35
|
|-----------|--------|
|
|
36
|
-
| Drive
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
36
|
+
| Drive folder of masters | This task with `driveFolderUrl` |
|
|
37
|
+
| Staged files (curl after `cms_edit_request_staged_upload`) | This task with `stagedUploadIds` — one prepare for the batch |
|
|
38
|
+
| Public HTTPS on allowed hosts | This task with `httpsUrls` |
|
|
39
|
+
| Single SVG/PDF/Lottie | `task-media-reuse-and-upload` asset upload --staged |
|
|
40
|
+
| Prior prepare already reached `succeeded` + catalog | **Reuse that jobId** — do not re-prepare |
|
|
41
|
+
|
|
42
|
+
Do **not** use `asset upload --staged/--base64` for jpeg/png/webp/gif/mp4. **Video** must use **import** (not `asset upload --url`, even on a Blob ready host). Raster `--url` is allowed only for pipeline ready image hosts.
|
|
40
43
|
|
|
41
44
|
## Steps (agent — single auth)
|
|
42
45
|
|
|
@@ -44,6 +47,8 @@ Normalize a **folder of designer masters** into short-lived **public HTTPS URLs*
|
|
|
44
47
|
|
|
45
48
|
Call MCP tool **`cms_edit_media`**:
|
|
46
49
|
|
|
50
|
+
Drive:
|
|
51
|
+
|
|
47
52
|
```json
|
|
48
53
|
{
|
|
49
54
|
"action": "prepare",
|
|
@@ -51,23 +56,27 @@ Call MCP tool **`cms_edit_media`**:
|
|
|
51
56
|
"profile": "case-study-v1",
|
|
52
57
|
"sourceNames": [
|
|
53
58
|
"BusinessCards copy.jpg",
|
|
54
|
-
"ArcticDB x3 Screens Tablet-1920.mp4"
|
|
55
|
-
"ADB_Macbook_HomeLoop.mp4"
|
|
59
|
+
"ArcticDB x3 Screens Tablet-1920.mp4"
|
|
56
60
|
]
|
|
57
61
|
}
|
|
58
62
|
```
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
Staged (after curl PUT/POST to each `uploadUrl`):
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"action": "prepare",
|
|
69
|
+
"stagedUploadIds": ["<uploadId1>", "<uploadId2>"]
|
|
70
|
+
}
|
|
71
|
+
```
|
|
65
72
|
|
|
66
73
|
CLI:
|
|
67
74
|
|
|
68
75
|
```bash
|
|
69
76
|
cms-edit media prepare --drive-folder "https://drive.google.com/drive/folders/…" \
|
|
70
77
|
--source-names "BusinessCards copy.jpg,ADB_Macbook_HomeLoop.mp4"
|
|
78
|
+
|
|
79
|
+
cms-edit media prepare --staged-ids "id1,id2"
|
|
71
80
|
```
|
|
72
81
|
|
|
73
82
|
Expect `{ ok: true, jobId, status: "queued", pollHint }`.
|
|
@@ -103,7 +112,7 @@ or
|
|
|
103
112
|
|
|
104
113
|
- Do **not** invent assets for gaps.
|
|
105
114
|
- Do **not** wait 5–10+ minutes on `provisioning`.
|
|
106
|
-
- Do **not** thrash prepares (rate limit
|
|
115
|
+
- Do **not** thrash prepares (rate limit **100**/hour, concurrent max typically **4** per user).
|
|
107
116
|
- On `429` / too many concurrent: call `status` once on any stuck old `jobId` (to free slots if past grace), then prepare again **once**.
|
|
108
117
|
- Prefer **reusing** a job that already reached `succeeded` + catalog over preparing again for the same Drive folder.
|
|
109
118
|
|
|
@@ -117,9 +126,10 @@ Each asset includes:
|
|
|
117
126
|
|
|
118
127
|
| Field | Use |
|
|
119
128
|
|-------|-----|
|
|
120
|
-
| `readyUrl` |
|
|
129
|
+
| `readyUrl` | Import via `cms_edit_media` import only (CMA gate: pipeline ready hosts) |
|
|
121
130
|
| `previewUrl` / `posterUrl` | Agent vision for **title / fileName / alt** (when present) |
|
|
122
|
-
| `altDraft` / `titleDraft` | Filename seeds only — improve before
|
|
131
|
+
| `altDraft` / `titleDraft` | Filename seeds only — improve before import |
|
|
132
|
+
| `role` `gif-converted` | Animated GIF became MP4 — Media mute-loop, not `featuredImage` |
|
|
123
133
|
|
|
124
134
|
### 4. Import into Contentful (reuse-first)
|
|
125
135
|
|
|
@@ -146,9 +156,10 @@ After drafting titles/alts from **previewUrl** / **posterUrl**:
|
|
|
146
156
|
}
|
|
147
157
|
```
|
|
148
158
|
|
|
149
|
-
1. Always **`dryRun: true` first** — check `existing: true/false` per asset (reuse is by **fileName**).
|
|
150
|
-
2.
|
|
151
|
-
3.
|
|
159
|
+
1. Always **`dryRun: true` first** — check `existing: true/false` per asset (reuse is by **fileName**). Missing alt on new files is reported as `altFailures` / per-row `alt_required`; dryRun still returns `ok: true`.
|
|
160
|
+
2. New uploads **fail** without review-quality `overrides[].alt` when you import for real (not empty, not the filename).
|
|
161
|
+
3. When you need **new** assets instead of reusing prior runs, set `overrides[].fileName` to unique names.
|
|
162
|
+
4. Then import without `dryRun`.
|
|
152
163
|
|
|
153
164
|
CLI:
|
|
154
165
|
`cms-edit media import --job <id> [--dry-run] [--with-media] [--only-with-overrides] [--source-names a.jpg,b.jpg] [--exclude-source-names x.jpg] [--overrides-json '[…]']`
|
|
@@ -164,7 +175,7 @@ Import:
|
|
|
164
175
|
`cms_edit ["set", "@cN", "visual", "<mediaId>", "--link"]`
|
|
165
176
|
— **never** `add … --target visual` (`add` only supports content **arrays**).
|
|
166
177
|
|
|
167
|
-
Manual `asset upload --url`
|
|
178
|
+
Manual `asset upload --url` is allowed only for **pipeline-ready images** (Vercel Blob / `MEDIA_PIPELINE_READY_HOSTS`, https in production). **Video** must use **import**. Always prefer import for new masters.
|
|
168
179
|
|
|
169
180
|
### Hardening notes (for agents)
|
|
170
181
|
|
|
@@ -32,30 +32,39 @@
|
|
|
32
32
|
|
|
33
33
|
## Upload only when no match
|
|
34
34
|
|
|
35
|
-
###
|
|
35
|
+
### Raster images and video (required)
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
Encode via **`task-media-pipeline-prepare`**. Intake can be:
|
|
38
38
|
|
|
39
|
-
1.
|
|
40
|
-
2.
|
|
39
|
+
1. A **Drive folder**, or
|
|
40
|
+
2. **Staged upload** (4 MB): `cms_edit_request_staged_upload` → curl → `cms_edit_media` prepare with `stagedUploadIds` (see returned `consumeArgs`), or
|
|
41
|
+
3. **httpsUrls** on pipeline-allowed hosts
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
Then wait → catalog → **import** with `overrides[].alt`. Do **not** `asset upload --staged/--base64` for jpeg/png/webp/gif/mp4. Do **not** `asset upload --url` for **video** (import only). Raster `--url` only for pipeline ready image hosts.
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
Animated GIFs become **MP4** (`gif-converted`) — attach as mute-loop Media / video visual, not `featuredImage`.
|
|
46
|
+
|
|
47
|
+
### SVG, PDF, Lottie
|
|
48
|
+
|
|
49
|
+
These may skip the pipeline. On hosted MCP use staged upload then `asset upload --staged`.
|
|
50
|
+
|
|
51
|
+
### Hosted MCP (SVG/PDF/Lottie only)
|
|
52
|
+
|
|
53
|
+
**Always use staged upload** for ad-hoc binaries. Do not pass base64 in `cms_edit` args — hosted MCP rejects `asset upload --base64`.
|
|
45
54
|
|
|
46
55
|
1. `cms_edit_request_staged_upload` with `fileName`, `mimeType`, optional `byteLength`, optional `title`
|
|
47
56
|
2. Run the returned `curlCommand` in a shell (POST file to `uploadUrl`)
|
|
48
|
-
3. `
|
|
57
|
+
3. Follow `consumeArgs`: **media prepare** for photos/video; **asset upload --staged** for SVG/PDF/Lottie
|
|
49
58
|
|
|
50
59
|
Rules:
|
|
51
60
|
|
|
52
|
-
- Staged upload keeps binary **out of MCP args**
|
|
53
|
-
- Hosted limit: **4 MB** per file; **1000 upload URLs per user per hour**; TTL **60 minutes
|
|
54
|
-
-
|
|
55
|
-
- Upload alone does **not** attach the asset — follow with **link + save** (below)
|
|
61
|
+
- Staged upload keeps binary **out of MCP args**
|
|
62
|
+
- Hosted limit: **4 MB** per file; **1000 upload URLs per user per hour**; TTL **60 minutes**
|
|
63
|
+
- Raster/video staged files stay in Redis until pipeline fetches them (GET); they are not written to CMA
|
|
64
|
+
- Upload/import alone does **not** attach the asset — follow with **link + save** (below)
|
|
56
65
|
- Use `--if-exists-by-filename` (with `--file-name`) to avoid duplicate assets when re-running
|
|
57
66
|
|
|
58
|
-
After
|
|
67
|
+
After import, create a Media wrapper **only when none exists** for that asset:
|
|
59
68
|
|
|
60
69
|
```
|
|
61
70
|
cms_edit ["list", "--type", "media", "--asset-id", "<newPortraitAssetId>"]
|
|
@@ -68,17 +77,11 @@ To rename an existing Media wrapper: `cms_edit ["batch", "set", "<media-entry-id
|
|
|
68
77
|
|
|
69
78
|
Avoid `asset upload --with-media` when multiple entries will share the same image (e.g. news composites) — it creates duplicate Media entries. Upload the asset only, then one shared `create media`, then link the media ID on each entry.
|
|
70
79
|
|
|
71
|
-
**Prefer
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
cms_edit ["asset", "upload", "--url", "https://<public-https-url>/file.png", "--mime", "image/png", "--file-name", "headshot-name-1200.png", "--title", "…", "--if-exists-by-filename"]
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
The URL must be fetchable by the hosted MCP server. Do not use local-only URLs.
|
|
80
|
+
**Prefer pipeline import** for encoded masters. **Video** must use import. `asset upload --url` is only for **pipeline ready images** (or SVG/PDF/Lottie). A random PNG or Contentful CDN master is rejected.
|
|
78
81
|
|
|
79
82
|
### Local CLI (only when user approves)
|
|
80
83
|
|
|
81
|
-
Hosted MCP uses `cms_edit_request_staged_upload` then `asset upload --staged
|
|
84
|
+
Hosted MCP uses `cms_edit_request_staged_upload` then **media prepare** for raster/video (or `asset upload --staged` for SVG/PDF/Lottie). Do not use the local `cms-edit` CLI for uploads.
|
|
82
85
|
|
|
83
86
|
## Link uploaded asset to an entry
|
|
84
87
|
|
|
@@ -18,16 +18,21 @@
|
|
|
18
18
|
## Steps
|
|
19
19
|
|
|
20
20
|
1. `cms_edit ["list", "--type", "navigation"]` — find nav entry
|
|
21
|
-
2. `cms_edit ["nav", "open", "--id", "<navigationId>"]` or
|
|
22
|
-
3. `snapshot` — inspect nav items
|
|
23
|
-
4.
|
|
24
|
-
|
|
21
|
+
2. `cms_edit ["nav", "open", "--nav-id", "<navigationId>"]` or `["nav", "open", "--nav-name", "Main menu"]` — **not** `--id`
|
|
22
|
+
3. `snapshot` — inspect nav items (array field may be `entries`, `items`, or `navigationItems`)
|
|
23
|
+
4. **Ask** whether the change is **global** (template `menu`) or **page-specific** (`page.menu` override). Nested children (often the last header CTA) are usually **shared**.
|
|
24
|
+
- Global: `set` on the existing NavigationItem
|
|
25
|
+
- Page-specific: new NavigationItem + cloned/new menu, then `set` `page.menu` — do not mutate the shared item
|
|
26
|
+
5. Add/clone/link items per navigation commands. `nav clone` is **shallow** for nested `navigationItems`.
|
|
27
|
+
6. `diff` → `save`
|
|
28
|
+
|
|
29
|
+
`peek` is one-shot. `open` / `nav open` persist. `preview urls /slug` follows that slug even if session `_mcp` is another page.
|
|
25
30
|
|
|
26
31
|
See `contentful-cms-navigation` skill for full command reference in dev environments.
|
|
27
32
|
|
|
28
33
|
## Confirmation gates
|
|
29
34
|
|
|
30
|
-
1. Confirm which menu (header/footer) and
|
|
35
|
+
1. Confirm which menu (header/footer) and whether the edit is global vs this page
|
|
31
36
|
2. `diff` before `save`
|
|
32
37
|
|
|
33
38
|
## Out of scope
|
|
@@ -36,4 +41,4 @@ See `contentful-cms-navigation` skill for full command reference in dev environm
|
|
|
36
41
|
|
|
37
42
|
## Related resources
|
|
38
43
|
|
|
39
|
-
- `cms-edit://customer/routing`
|
|
44
|
+
- `cms-edit://customer/routing`
|
package/docs/help/lookup.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
# Flat lookup flags (`open`, `
|
|
1
|
+
# Flat lookup flags (`open`, `peek`, `resolve`)
|
|
2
2
|
|
|
3
|
-
cms-edit resolves entries using **explicit flags** — not positional slugs. Provide **exactly one** primary lookup flag per command. Scope flags (for example `--tag-type-name` with `--tag-name`) do not count as a second primary.
|
|
3
|
+
cms-edit resolves entries using **explicit flags** — not positional slugs. Provide **exactly one** primary lookup flag per command. Scope flags (for example `--tag-type-name` with `--tag-name`, or `--nav-id` with `--nav-item-title`) do not count as a second primary.
|
|
4
|
+
|
|
5
|
+
`cms-edit nav open` is separate: pass **`--nav-id` or `--nav-name`**, never `--id`. `--nav-id` alone is not a `resolve` primary.
|
|
4
6
|
|
|
5
7
|
Run `cms-edit index sync` once per space (or let commands auto-sync) so catalog types resolve from the local index.
|
|
6
8
|
|
|
@@ -98,9 +100,10 @@ Navigation entries use the **`name`** field (not slug).
|
|
|
98
100
|
| `--nav-item-id` | `navigationItem` entry ID |
|
|
99
101
|
| `--nav-item-title` | `navigationItem.fields.title` |
|
|
100
102
|
|
|
101
|
-
When multiple nav items share a title, add **`--nav-id`** to scope:
|
|
103
|
+
When multiple nav items share a title, add **`--nav-id`** to scope `resolve` (do not use `--nav-id` alone on `resolve`):
|
|
102
104
|
|
|
103
105
|
```bash
|
|
106
|
+
cms-edit nav open --nav-id <navigation-entry-id>
|
|
104
107
|
cms-edit nav open --nav-name "Main header"
|
|
105
108
|
cms-edit resolve --nav-item-title "Contact" --nav-id <navigation-entry-id>
|
|
106
109
|
```
|
package/docs/mcp/hosted-guide.md
CHANGED
|
@@ -20,7 +20,7 @@ All `save` operations create **drafts only**. A human must review and publish in
|
|
|
20
20
|
| Tool | Purpose |
|
|
21
21
|
|------|---------|
|
|
22
22
|
| `cms_edit` | Run any cms-edit command via an `args` array |
|
|
23
|
-
| `cms_edit_request_staged_upload` |
|
|
23
|
+
| `cms_edit_request_staged_upload` | Presigned URL for binaries. Raster/video: then `cms_edit_media` prepare. SVG/PDF/Lottie: then `asset upload --staged` |
|
|
24
24
|
| `cms_edit_version` | Check the installed cms-edit version (no session required) |
|
|
25
25
|
| `cms_edit_help` | Guide topics (`overview`, `workflow`, `commands`, `troubleshooting`, `hosted`) **or** playbooks (`create-from-json`, `fields-component`, …) |
|
|
26
26
|
|
|
@@ -88,7 +88,7 @@ Each step is a separate `cms_edit` call. Sessions persist in Redis between calls
|
|
|
88
88
|
["open", "--include-chrome", "--page-slug", "/pricing"]
|
|
89
89
|
```
|
|
90
90
|
|
|
91
|
-
Default `open` / `peek` fetch the page or article tree and the template entry, but **not** template menu/footer/navigation. Edit nav with `nav open
|
|
91
|
+
Default `open` / `peek` fetch the page or article tree and the template entry, but **not** template menu/footer/navigation. Edit nav with `["nav", "open", "--nav-id", "<id>"]` or `--nav-name` (not `--id`). Use `--include-chrome` only when you need those trees. Template `menu` is site-wide; `page.menu` overrides one page. Nested nav items are often shared — ask global vs page-specific before `set`.
|
|
92
92
|
|
|
93
93
|
**Homepage (all SE Studio sites):** Contentful stores the marketing homepage slug as `index`. The live site URL is `/`. In cms-edit, `--page-slug /` and `--page-slug /index` are equivalent (both resolve to `index`). Read `cms-edit://customer/routing` for site-specific exceptions (e.g. Pedestal uses `home`).
|
|
94
94
|
|
|
@@ -130,7 +130,7 @@ Always run `diff` before `save`. To abandon changes: `["discard"]`.
|
|
|
130
130
|
| Task | Where |
|
|
131
131
|
|------|-------|
|
|
132
132
|
| Edit copy, add sections, create pages/articles | **Agent + cms-edit** (drafts) |
|
|
133
|
-
| Upload new images and files | **Agent + cms-edit**
|
|
133
|
+
| Upload new images and files | **Agent + cms-edit** — search/reuse first; raster/video via `cms_edit_media` import |
|
|
134
134
|
| Publish approved drafts | **Contentful UI** |
|
|
135
135
|
| Edit copy directly in Contentful | **Avoid** — use cms-edit instead |
|
|
136
136
|
|
|
@@ -138,12 +138,13 @@ cms-edit saves **drafts only**. A colleague must **publish in Contentful** for c
|
|
|
138
138
|
|
|
139
139
|
## Asset upload (hosted MCP)
|
|
140
140
|
|
|
141
|
-
Hosted connectors have **no server filesystem** and **reject `asset upload --base64`**.
|
|
141
|
+
Hosted connectors have **no server filesystem** and **reject `asset upload --base64`**. Raster/video: staged intake then **media pipeline**. SVG/PDF/Lottie: staged then `asset upload --staged`.
|
|
142
142
|
|
|
143
143
|
| Source | When | Example |
|
|
144
144
|
|--------|------|---------|
|
|
145
|
-
| **Staged
|
|
146
|
-
| **`--url`**
|
|
145
|
+
| **Staged + pipeline** | jpeg/png/webp/gif/mp4 | `cms_edit_media` prepare `stagedUploadIds` → import (required for video) |
|
|
146
|
+
| **`--url`** | Pipeline-ready **images** only, or SVG/PDF | `["asset", "upload", "--url", "https://….blob.vercel-storage.com/ready.jpg"]` |
|
|
147
|
+
| **Staged consume** | SVG/PDF/Lottie | `asset upload --staged` |
|
|
147
148
|
|
|
148
149
|
**After upload:** note the returned asset `id`, attach to the entry (`asset set @root media <id>` for person portraits), then `diff` → `save`. Upload alone does not update entries.
|
|
149
150
|
|
|
@@ -168,10 +169,10 @@ Keeps binary **out of MCP tool args**. The agent uploads via `curl`, then passes
|
|
|
168
169
|
|
|
169
170
|
1. `cms_edit_request_staged_upload` with `fileName`, `mimeType`, optional `byteLength`, optional `title`
|
|
170
171
|
2. Run the returned `curlCommand` in a shell (POST multipart to `uploadUrl`)
|
|
171
|
-
3. `
|
|
172
|
-
4.
|
|
172
|
+
3. Follow `consumeArgs`: **media prepare** (`cms_edit_media` / `media prepare --staged-ids`) for jpeg/png/webp/gif/mp4; **asset upload --staged** for SVG/PDF/Lottie
|
|
173
|
+
4. For pipeline jobs: wait → catalog → **import** (required for video). Then link and save
|
|
173
174
|
|
|
174
|
-
Hosted limit: **4 MB** per staged file (Vercel body limit). Rate limit: **1000 upload URLs per user per hour**. TTL: **60 minutes
|
|
175
|
+
Hosted limit: **4 MB** per staged file (Vercel body limit). Rate limit: **1000 upload URLs per user per hour**. TTL: **60 minutes**. Raster/video staged files are intake (GET by the pipeline); they are not consumed into CMA.
|
|
175
176
|
|
|
176
177
|
## Featured images (articles)
|
|
177
178
|
|
|
@@ -310,7 +311,8 @@ OAuth is two steps: Grok obtains an MCP token, then you sign in with Contentful
|
|
|
310
311
|
| Debug session persistence | `["diagnose"]` — reports store, userId, active session key |
|
|
311
312
|
|
|
312
313
|
- **`peek` is one-shot** — prints tree and **root field values** (`rootFields` in JSON). No session is created; do not chain `read @ref` afterward.
|
|
313
|
-
-
|
|
314
|
+
- **`open` / `nav open` persist** the session. `preview urls /slug` follows that slug even if leftover `_mcp` is another page (JSON may include `sessionRootIgnored`).
|
|
315
|
+
- **Use flat lookup flags** for `open` and `peek` — same as CLI (`--page-slug`, `--id`, etc.). See `help lookup`. `nav open` uses `--nav-id` or `--nav-name` only.
|
|
314
316
|
- **`read @root`** only works after `open` (uses the active session). The hint in peek output is for terminal users who already ran `open`.
|
|
315
317
|
- **Do not invent flags** — there is no `--read`, `--then`, or chained peek+read syntax. One command per `cms_edit` call.
|
|
316
318
|
|
package/package.json
CHANGED
package/skills/core/SKILL.md
CHANGED
|
@@ -31,7 +31,8 @@ Use this skill when you need to read or edit content in Contentful using **hoste
|
|
|
31
31
|
All `save` operations create **draft** versions. A human must review and publish in Contentful.
|
|
32
32
|
|
|
33
33
|
**Assets:** Upload **is** supported (`asset upload`). Default workflow: **search and reuse** existing assets first (`index sync` → `asset search`). When uploading:
|
|
34
|
-
- **
|
|
34
|
+
- **Raster/video:** `cms_edit_request_staged_upload` → curl → `cms_edit_media` prepare (`stagedUploadIds`) → wait → catalog → import with real alt. Never `asset upload --staged/--url/--base64` for jpeg/png/webp/gif/mp4.
|
|
35
|
+
- **SVG/PDF/Lottie:** `cms_edit_request_staged_upload` → curl → `asset upload --staged` (never `--base64`)
|
|
35
36
|
- Use a **sensible fileName** and **descriptive title** (and alt text where the site uses it)
|
|
36
37
|
- Avoid oversized images — width over **2000px** is usually wasteful for web (exact limits vary by project; check `asset audit` / media review guidance)
|
|
37
38
|
- Prefer `--if-exists-by-filename` to avoid duplicates
|
|
@@ -69,7 +70,7 @@ cms-edit open --include-chrome --page-slug /pricing
|
|
|
69
70
|
|
|
70
71
|
`open` / `peek` fetch the page (or article) tree and the template entry, but **not** template `menu` / `footer` / navigation. Edit nav with `nav open`. Pass `--include-chrome` only when you need those trees.
|
|
71
72
|
|
|
72
|
-
**Flat lookup flags:** provide **exactly one** primary flag per `open` / `
|
|
73
|
+
**Flat lookup flags:** provide **exactly one** primary flag per `open` / `peek` / `resolve`. `nav open` uses **`--nav-id` or `--nav-name` only** (not `--id`). See `cms-edit help lookup`. Run `cms-edit index sync` so catalog types resolve from the local index.
|
|
73
74
|
|
|
74
75
|
### Step 2: Read the snapshot
|
|
75
76
|
|
|
@@ -371,13 +372,8 @@ cms-edit asset search "hero background"
|
|
|
371
372
|
cms-edit asset search --filename istockphoto-123.jpg
|
|
372
373
|
cms-edit asset search --filename-match 'istockphoto-.*'
|
|
373
374
|
|
|
374
|
-
#
|
|
375
|
-
|
|
376
|
-
cms-edit asset upload --base64 "$B64" --mime image/png --file-name poster.png
|
|
377
|
-
|
|
378
|
-
# Hosted MCP — always staged upload for binary files
|
|
379
|
-
# cms_edit_request_staged_upload → curl uploadUrl → consumeArgs
|
|
380
|
-
# cms_edit ["asset", "upload", "--staged", "<uploadId>", "--mime", "image/png", "--file-name", "photo.png"]
|
|
375
|
+
# Raster/video: cms_edit_media prepare → wait → catalog → import (video: import only).
|
|
376
|
+
# SVG/PDF/Lottie: cms_edit_request_staged_upload → curl → asset upload --staged
|
|
381
377
|
|
|
382
378
|
# Upload and create a Media wrapper in one step (--media-name defaults to asset title)
|
|
383
379
|
cms-edit asset upload ./figure.png --with-media --media-position Middle
|
|
@@ -403,8 +399,9 @@ JSON output for upload (`CMS_EDIT_JSON=1`): `{ ok, id, fileName, url, mediaId?,
|
|
|
403
399
|
## Navigation
|
|
404
400
|
|
|
405
401
|
```bash
|
|
406
|
-
# Open a navigation entry (
|
|
402
|
+
# Open a navigation entry (not --id). Navigation uses `name`, not slug.
|
|
407
403
|
cms-edit nav open --nav-name "Main navigation"
|
|
404
|
+
cms-edit nav open --nav-id <navigation-entry-id>
|
|
408
405
|
|
|
409
406
|
# Add a new item
|
|
410
407
|
cms-edit nav add --label "Pricing" --slug /pricing
|
|
@@ -413,11 +410,17 @@ cms-edit nav add --label "Docs" --href https://docs.example.com --after @c1
|
|
|
413
410
|
# Link an existing NavigationItem (share items across navigations)
|
|
414
411
|
cms-edit nav add --existing-id <navigationItem-entry-id>
|
|
415
412
|
|
|
416
|
-
# Clone a navigation (
|
|
413
|
+
# Clone a navigation (first-level items only; nested children stay shared)
|
|
417
414
|
cms-edit nav clone <source-nav-id>
|
|
418
415
|
cms-edit nav clone <source-nav-id> --label "LP Nav" --slug lp-nav
|
|
419
416
|
```
|
|
420
417
|
|
|
418
|
+
Template **`menu`** is site-wide. **`page.menu`** overrides one page. Header CTAs are often nested under a wrapper and **shared**. Before `set` on a nav item, ask whether the change is global or page-specific. Page-specific: new NavigationItem + cloned/new menu on `page.menu` — do not mutate the shared entry.
|
|
419
|
+
|
|
420
|
+
`peek` is one-shot. `open` / `nav open` persist. `preview urls /slug` follows that slug even if session `_mcp` is another page.
|
|
421
|
+
|
|
422
|
+
The items array field may be `entries`, `items`, or `navigationItems` — inspect `read @root` before `set @root … --links`.
|
|
423
|
+
|
|
421
424
|
## Create New Entries
|
|
422
425
|
|
|
423
426
|
```bash
|