@se-studio/skills 1.9.5 → 1.9.7
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
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @se-studio/skills
|
|
2
2
|
|
|
3
|
+
## 1.9.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Advertise OAuth scopes and Client ID Metadata Documents, and add typed MCP tools so ChatGPT and other remote clients can read and save drafts without a shell.
|
|
8
|
+
|
|
9
|
+
## 1.9.6
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Document that cms-edit `publish plan --id` is exact ids only. Use `--with-parents` (or open the parent/listing and `publish plan`) when those pages must republish so live listings are not stale.
|
|
14
|
+
|
|
3
15
|
## 1.9.5
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -21,7 +21,7 @@ Use this skill when you need to read or edit content in Contentful using **hoste
|
|
|
21
21
|
|
|
22
22
|
**Edit a tree:** `open` → `export from-json` → edit JSON → `apply from-json` (`--staged` when over 8k). Tiny patches: `set` / `rtf` / `add` then `diff` → `save`. Long HtmlComponent fields: `kind=text` then `set --staged`.
|
|
23
23
|
|
|
24
|
-
**
|
|
24
|
+
**Do not publish while saving.** Hosted MCP cannot see your disk — send JSON in the tool call **only if under 8192 bytes**. Publish is a later plan, and only after the user says yes. `publish plan --id` publishes **only those ids** (no parent/listing republish). If a parent or listing page must go live so production is not stale, pass `--with-parents`, or open that page / `--from-session` and `publish plan` without `--id`.
|
|
25
25
|
|
|
26
26
|
## Safety Rules
|
|
27
27
|
|
|
@@ -32,9 +32,11 @@ Use this skill when you need to read or edit content in Contentful using **hoste
|
|
|
32
32
|
|
|
33
33
|
All `save` operations create **draft** versions. A human must review and publish in Contentful.
|
|
34
34
|
|
|
35
|
-
**Assets:** Upload **is** supported (`asset upload`). Default workflow: **search and reuse** existing assets first (`index sync` → `asset search`). When uploading:
|
|
36
|
-
- **Raster/video:** `cms_edit_request_staged_upload` → curl → `cms_edit_media` prepare
|
|
37
|
-
- **
|
|
35
|
+
**Assets:** Upload **is** supported (`asset upload`). Default workflow: **search and reuse** existing assets first (`index sync` → `asset search`). Search by concept (`asset search --concept` / `--concept-all`) finds a subject and a tone, including files no page uses yet. Concepts are not blog tags. When uploading:
|
|
36
|
+
- **Raster/video:** `cms_edit_request_staged_upload` → curl → `cms_edit_media` prepare → wait → catalog → import with real alt. Video, and an image master over 4MB, is a presigned direct PUT (100MB, `intake: direct`) then prepare with that URL. Smaller images still use `stagedUploadIds`. Never `asset upload --staged/--url/--base64` for jpeg/png/webp/gif/mp4. The stored asset is the processed file.
|
|
37
|
+
- **Replace** an existing id with `asset replace --url` of the processed `…/packs/…/ready/…` file (`--dry-run` first). The id and the file name stay. Draft. No publish flag.
|
|
38
|
+
- **SVG/PDF/Lottie:** `cms_edit_request_staged_upload` → curl → `asset upload --staged` (never `--base64`). 4MB function cap.
|
|
39
|
+
- **Title:** `asset set-title`. **Alt:** `asset set-description`, written from the picture. Do not emotion-score headshots, logos, icons, or illustrations.
|
|
38
40
|
- **HtmlComponent / large JSON:** `cms_edit_request_staged_upload` with `kind=text` or `kind=json` → curl → `set --staged`, `rtf --staged`, `create from-json --staged`, or `apply from-json --staged`. Hosted MCP rejects inline `--json`/`--content` over 8192 bytes. If the wrapper schema has no `kind`, use `cms_edit` `["staged-upload", "request", "--kind", "json", "--file-name", "...", "--mime", "application/json"]` (or `--kind text`), then curl, then `--staged`.
|
|
39
41
|
- Use a **sensible fileName** and **descriptive title** (and alt text where the site uses it)
|
|
40
42
|
- Avoid oversized images — width over **2000px** is usually wasteful for web (exact limits vary by project; check `asset audit` / media review guidance)
|
|
@@ -376,9 +378,13 @@ cms-edit asset search --filename istockphoto-123.jpg
|
|
|
376
378
|
cms-edit asset search --filename-match 'istockphoto-.*'
|
|
377
379
|
|
|
378
380
|
# Raster/video: cms_edit_media prepare → wait → catalog → import (video: import only).
|
|
381
|
+
# Video and image masters over 4MB: direct intake (100MB), then prepare --https-urls.
|
|
379
382
|
# Do not `asset upload` jpeg/png/webp/gif/mp4. Do not convert GIF/MP4 with local ffmpeg.
|
|
380
383
|
# Animated GIF: leave as GIF; pipeline emits gif-converted MP4 for Media mute-loop, not featuredImage.
|
|
381
|
-
# SVG/PDF/Lottie: cms_edit_request_staged_upload → curl → asset upload --staged
|
|
384
|
+
# SVG/PDF/Lottie: cms_edit_request_staged_upload → curl → asset upload --staged (4MB)
|
|
385
|
+
# Replace in place: asset replace <id> --url <processed ready url> --dry-run
|
|
386
|
+
# Title: asset set-title. Alt: asset set-description. Concepts: asset concept assign (not taxonomy-from-json)
|
|
387
|
+
# Concept search: asset search --concept <id> --concept-all <id>
|
|
382
388
|
|
|
383
389
|
# Create a Media wrapper for an existing asset (name defaults to asset title)
|
|
384
390
|
cms-edit create media --asset-id <asset-id>
|
|
@@ -394,7 +400,7 @@ cms-edit asset info 5xKj2abcDef
|
|
|
394
400
|
cms-edit asset set @c0 visual 5xKj2abcDef
|
|
395
401
|
```
|
|
396
402
|
|
|
397
|
-
JSON output for upload (`CMS_EDIT_JSON=1`): `{ ok, id, fileName, url, mediaId?, mediaIds? }`.
|
|
403
|
+
JSON output for upload (`CMS_EDIT_JSON=1`): `{ ok, id, fileName, url, mediaId?, mediaIds? }`. Bytes through the process are **10MB**. Hosted function POST is **4MB**. Video and large image masters are **100MB** direct-to-storage, then the pipeline.
|
|
398
404
|
|
|
399
405
|
**Idempotent upload:** `--if-exists-by-filename` is check-then-create. Do not upload the same `fileName` in parallel — serialize per fileName or re-run to converge.
|
|
400
406
|
|
|
@@ -576,7 +582,7 @@ cms-edit diff
|
|
|
576
582
|
|
|
577
583
|
# 7. Save as draft
|
|
578
584
|
cms-edit save
|
|
579
|
-
# → "Saved 1 entry as draft.
|
|
585
|
+
# → "Saved 1 entry as draft. Publish only if the user asks, with publish plan and an explicit yes."
|
|
580
586
|
```
|
|
581
587
|
|
|
582
588
|
## Common Patterns
|
|
@@ -828,7 +834,7 @@ Use `"components"` not `"content"`. Nested discriminator is `"type"` not `"compo
|
|
|
828
834
|
- String `fields` values become Rich Text when they auto-detect as Markdown (same heuristic), HTML (tag-like), or Rich Text JSON (`nodeType: document`). Otherwise strings stay as-is — use `{ "value": "…", "format": "text"|"markdown"|"html"|"json" }` or `cms-edit rtf` with `--text|--markdown|--html|--rtf-json`.
|
|
829
835
|
- `target` sets which content array to use: `topContent`, `content` (default), or `bottomContent`.
|
|
830
836
|
- Slugs must not have a trailing slash — `from-json` strips it with a warning, but avoid it in source JSON.
|
|
831
|
-
- All entries are created as **drafts**.
|
|
837
|
+
- All entries are created as **drafts**. Publish later with `publish plan`, then `publish apply` only after the user says yes. With `--id`, add `--with-parents` when parent/listing pages must republish.
|
|
832
838
|
- `--dry-run` prints the full plan without writing anything.
|
|
833
839
|
|
|
834
840
|
## Find Existing Entries (for existingId)
|
|
@@ -857,7 +863,14 @@ cms-edit list --type article --sort date -n 20
|
|
|
857
863
|
cms-edit index dump --reference-only # Full catalog snapshot in terminal
|
|
858
864
|
```
|
|
859
865
|
|
|
860
|
-
**Note on
|
|
866
|
+
**Note on publish:** Saves create drafts. Then `publish plan`, then `publish apply --plan <id>` only after the user says yes.
|
|
867
|
+
|
|
868
|
+
- **Open page** or `--from-session`: publishes that page's draft and what it needs (linked drafts, then the page). The page publish is what refreshes the live URL.
|
|
869
|
+
- **`--id`**: publishes **only the named ids**. Repeat `--id` for more than one. It does **not** walk linked drafts or parent/listing pages, so those live pages can stay stale.
|
|
870
|
+
- **`--id` + `--with-parents`**: opts into the parent walk (linked drafts and upstream pages). Use this whenever a parent or listing page must republish. Equivalent: open the parent/listing and `publish plan` without `--id`.
|
|
871
|
+
- **`--content-type schema`** (and other webhook types): publishes those entries; pages that use them are not republished.
|
|
872
|
+
|
|
873
|
+
If someone else also changed an entry, ask all versus mine and `publish choose`. The Contentful role must allow it. Unpublish, archive, and revalidate use the same plan-then-yes rule. Do not apply a plan on your own.
|
|
861
874
|
|
|
862
875
|
## Concurrent Sessions
|
|
863
876
|
|
|
@@ -60,11 +60,11 @@ Capability playbooks require:
|
|
|
60
60
|
1. **Propose** scope to the user — wait for approval
|
|
61
61
|
2. **Dry-run** when available (`--dry-run`, `bulk-rtf-replace --dry-run`, etc.)
|
|
62
62
|
3. **`diff`** before every `save`
|
|
63
|
-
4. **Summarize** what changed; remind that publish is
|
|
63
|
+
4. **Summarize** what changed; remind that publish is a later `publish plan` after an explicit yes. `publish plan --id` is exact ids only — if a parent or listing page must go live, use `--with-parents` (or open that page and `publish plan`). See `task-publish-handoff`.
|
|
64
64
|
|
|
65
65
|
## Media default
|
|
66
66
|
|
|
67
|
-
**Search and reuse assets first** (`index sync` → `asset search`). Upload only when no match; use `--if-exists-by-filename` when uploading.
|
|
67
|
+
**Search and reuse assets first** (`index sync` → `asset search`). Search by concept (`--concept`, `--concept-all`) finds a subject and a tone. Concepts are not blog tags. Upload only when no match; use `--if-exists-by-filename` when uploading. Replace an in-use file with `asset replace` so the id and the file name stay. Alt is `asset set-description`, written from the picture. Do not emotion-score headshots, logos, icons, or illustrations.
|
|
68
68
|
|
|
69
69
|
**Space-wide media audit** (filename, alt, size, dimensions, usage) → read **`task-media-review`**, then skill **`contentful-cms-media-review`** for the spreadsheet.
|
|
70
70
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: contentful-cms-setup
|
|
3
|
-
description: "Guide a user through connecting hosted cms-edit MCP for Claude
|
|
3
|
+
description: "Guide a user through connecting hosted cms-edit MCP for Claude, ChatGPT, Grok, Cursor, or Gemini (OAuth)."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Skill: cms-edit Setup
|
|
7
7
|
|
|
8
|
-
Use this skill when the user wants to connect Claude
|
|
8
|
+
Use this skill when the user wants to connect Claude, ChatGPT, Grok, Cursor, VS Code, or Gemini CLI to their Contentful site via **hosted cms-edit MCP**.
|
|
9
9
|
|
|
10
10
|
Local stdio MCP and the setup wizard are **not supported**. Editors connect through the site's `/cms-edit` onboarding flow.
|
|
11
11
|
|
|
@@ -68,6 +68,27 @@ Full guide: `packages/contentful-cms/docs/mcp/hosted-guide.md` (Grok Build secti
|
|
|
68
68
|
|
|
69
69
|
---
|
|
70
70
|
|
|
71
|
+
## Hosted setup (ChatGPT and other remote MCP clients)
|
|
72
|
+
|
|
73
|
+
The MCP URL is the same URL as Claude (`https://<host>/api/mcp`). The client must speak remote Streamable HTTP and OAuth. There is no local stdio server and no OpenAPI Action.
|
|
74
|
+
|
|
75
|
+
### ChatGPT
|
|
76
|
+
|
|
77
|
+
1. Settings → **Apps & Connectors** → create a custom MCP server
|
|
78
|
+
2. Paste the MCP URL and choose **OAuth**
|
|
79
|
+
3. Sign in with **Contentful**
|
|
80
|
+
4. Ask it to call `search` or `cms_edit_version`
|
|
81
|
+
|
|
82
|
+
Draft writes (`set_field`, `save_draft`) need a Business, Enterprise, or Edu workspace. Pro can be read-only. ChatGPT freezes the tool list at connect time: after a cms-edit upgrade, remove the connector and add it again.
|
|
83
|
+
|
|
84
|
+
Clients that cannot run a shell use `append_text` for bodies over 8192 bytes, then `cms_edit` with `--staged`. `save_draft` does not publish.
|
|
85
|
+
|
|
86
|
+
### Cursor, VS Code, Gemini CLI
|
|
87
|
+
|
|
88
|
+
Add the MCP URL as a remote HTTP server and complete OAuth. Cursor: `~/.cursor/mcp.json` `url`. VS Code: `.vscode/mcp.json` `servers` with `type: http`. Gemini CLI: `mcpServers.<name>.url`.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
71
92
|
## Developers (CLI + skills, not local MCP)
|
|
72
93
|
|
|
73
94
|
For engineering work in a site repo (Cursor, Grok, terminal):
|