@se-studio/skills 1.5.5 → 1.5.6
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,11 @@
|
|
|
1
1
|
# @se-studio/skills
|
|
2
2
|
|
|
3
|
+
## 1.5.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Media wrapper entries now default their `name` (Contentful list label) to the linked asset's title when created via `create media` or `visualAssetFilename` shorthands. Document the convention in editor playbooks and skills; avoid migration-style `Wrapper for {assetId}` labels.
|
|
8
|
+
|
|
3
9
|
## 1.5.5
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -30,6 +30,8 @@ Use this skill when you need to read or edit content in Contentful CMS using the
|
|
|
30
30
|
All `save` operations create **draft** versions. A human must review and publish in Contentful.
|
|
31
31
|
|
|
32
32
|
**Assets:** Upload **is** supported (`asset upload`). Default workflow: **search and reuse** existing assets first (`index sync` → `asset search`). When uploading:
|
|
33
|
+
- **Hosted MCP:** always `cms_edit_request_staged_upload` → curl → `asset upload --staged` (never `--base64`)
|
|
34
|
+
- **Local CLI:** `--base64` or `--url` when user approves local CLI
|
|
33
35
|
- Use a **sensible fileName** and **descriptive title** (and alt text where the site uses it)
|
|
34
36
|
- Avoid oversized images — width over **2000px** is usually wasteful for web (exact limits vary by project; check `asset audit` / media review guidance)
|
|
35
37
|
- Prefer `--if-exists-by-filename` to avoid duplicates
|
|
@@ -369,13 +371,23 @@ cms-edit asset search "hero background"
|
|
|
369
371
|
cms-edit asset search --filename istockphoto-123.jpg
|
|
370
372
|
cms-edit asset search --filename-match 'istockphoto-.*'
|
|
371
373
|
|
|
372
|
-
#
|
|
373
|
-
cms-edit asset upload ./poster.jpg --title "Poster"
|
|
374
|
+
# Local CLI — URL or base64 (hosted MCP rejects --base64)
|
|
374
375
|
cms-edit asset upload --url https://example.com/image.jpg --if-exists-by-filename
|
|
375
376
|
cms-edit asset upload --base64 "$B64" --mime image/png --file-name poster.png
|
|
376
377
|
|
|
377
|
-
#
|
|
378
|
-
|
|
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"]
|
|
381
|
+
|
|
382
|
+
# Upload and create a Media wrapper in one step (--media-name defaults to asset title)
|
|
383
|
+
cms-edit asset upload ./figure.png --with-media --media-position Middle
|
|
384
|
+
|
|
385
|
+
# Create a Media wrapper for an existing asset (name defaults to asset title)
|
|
386
|
+
cms-edit create media --asset-id <asset-id>
|
|
387
|
+
|
|
388
|
+
# Fix a badly labelled Media wrapper (migration "Wrapper for …" labels)
|
|
389
|
+
cms-edit batch set <media-entry-id>:name=<asset-title>
|
|
390
|
+
cms-edit batch save
|
|
379
391
|
|
|
380
392
|
# Get asset details
|
|
381
393
|
cms-edit asset info 5xKj2abcDef
|
|
@@ -75,6 +75,8 @@ Summarize: totals, top `issueCounts`, quick wins (alt, GIFs, stock filenames).
|
|
|
75
75
|
|
|
76
76
|
**Fixes (user-approved only):** `cms-edit asset set-description <id> "…"` — drafts only, no publish.
|
|
77
77
|
|
|
78
|
+
**Media entry labels:** The Contentful list label for a **Media** wrapper is its `name` field — **set it to the linked asset's `title`**, not `visual-{assetId}`, `Wrapper for {assetId}`, or the filename. When creating wrappers: `cms-edit create media --asset-id <id>` (name defaults to asset title) or `asset upload --with-media` (use `--media-name` only when you need a distinct label for multiple wrappers on the same asset). To fix existing entries: `cms-edit batch set <media-entry-id>:name=<asset-title>` then `batch save`.
|
|
79
|
+
|
|
78
80
|
For per-page alt work: **`contentful-cms-alt-text-audit`**.
|
|
79
81
|
|
|
80
82
|
## Image guide (optional extension)
|
|
@@ -25,8 +25,8 @@ If no brand context is available, ask the user for these details.
|
|
|
25
25
|
| About | AboutPage + Organization |
|
|
26
26
|
| Service/Product | Service or Product |
|
|
27
27
|
| Pricing | Product with Offer |
|
|
28
|
-
| Blog listing | CollectionPage |
|
|
29
|
-
| Article |
|
|
28
|
+
| Blog listing | CollectionPage + Blog + ItemList |
|
|
29
|
+
| Article | BlogPosting |
|
|
30
30
|
| FAQ | FAQPage with Question/Answer |
|
|
31
31
|
| Contact | ContactPage |
|
|
32
32
|
| Team/People | ProfilePage or Person |
|
|
@@ -35,33 +35,59 @@ If no brand context is available, ask the user for these details.
|
|
|
35
35
|
|
|
36
36
|
## Phase 2: Generate Mustache Templates
|
|
37
37
|
|
|
38
|
-
Create JSON-LD templates using
|
|
38
|
+
Create JSON-LD templates using runtime variables from `buildStructuredDataContext()` in `@se-studio/core-ui` (see `packages/core-ui/src/utils/structuredDataUtils.ts`).
|
|
39
39
|
|
|
40
|
-
- `
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- `{{
|
|
45
|
-
- `{{
|
|
46
|
-
- `{{
|
|
47
|
-
- `{{
|
|
48
|
-
- `{{
|
|
49
|
-
- `{{
|
|
40
|
+
Reference markup generators in `@se-studio/cms-seo` (`breadcrumbListMarkup`, `blogPostingMarkup`, `itemListMarkup`, etc.).
|
|
41
|
+
|
|
42
|
+
### URLs and page
|
|
43
|
+
|
|
44
|
+
- `{{baseUrl}}` — site origin with trailing slash (e.g. `https://www.example.com/`)
|
|
45
|
+
- `{{{baseUrl}}}` — same, triple-brace for JSON-safe URLs in `@id` fields
|
|
46
|
+
- `{{currentUrl}}` / `{{{currentUrl}}}` — full canonical URL of the current page
|
|
47
|
+
- `{{page.title}}` — page or content title
|
|
48
|
+
- `{{page.description}}` — SEO meta description
|
|
49
|
+
- `{{page.slug}}` — content slug
|
|
50
|
+
- `{{{page.imageUrl}}}` — OG image URL when featured image is set
|
|
51
|
+
- `{{#page.breadcrumbs}}` — breadcrumb segments: `position`, `name`, optional `url`, `last`
|
|
52
|
+
|
|
53
|
+
### Articles
|
|
54
|
+
|
|
55
|
+
- `{{article.title}}`, `{{article.description}}`
|
|
56
|
+
- `{{article.datePublished}}`, `{{article.dateModified}}` — ISO 8601 (not `article.date`)
|
|
57
|
+
- `{{article.authorName}}`, `{{{article.authorUrl}}}` — primary author
|
|
58
|
+
- `{{#article.authors}}` — multi-author: `name`, optional `url` per author
|
|
59
|
+
- `{{{article.imageUrl}}}` — featured image URL
|
|
60
|
+
|
|
61
|
+
### Person pages
|
|
62
|
+
|
|
63
|
+
- `{{person.name}}`, `{{person.jobTitle}}`, `{{{person.imageUrl}}}`
|
|
64
|
+
|
|
65
|
+
### Listing pages (ItemList)
|
|
66
|
+
|
|
67
|
+
When the app wires `buildListingItems()` / `buildListingStructuredDataContext()` from `@se-studio/core-ui/server`:
|
|
68
|
+
|
|
69
|
+
- `{{#listing.items}}` — `position`, `name`, `{{{url}}}`, `last` (for Mustache comma separation)
|
|
70
|
+
|
|
71
|
+
Static brand data (organization address, social URLs, logo) belongs **in the CMS template**, not in code.
|
|
50
72
|
|
|
51
73
|
## Phase 3: Upload via cms-edit
|
|
52
74
|
|
|
53
75
|
1. Check available fields:
|
|
54
76
|
- `cms-edit schema page` — page content type fields
|
|
55
77
|
- `cms-edit schema template` — template content type fields
|
|
56
|
-
- Look for `
|
|
57
|
-
2. For **template-level** schemas (Organization, WebSite — shared): `cms-edit list --type template` → open → set
|
|
58
|
-
3. For **
|
|
59
|
-
4.
|
|
78
|
+
- Look for `structuredData` or `indexPageStructuredData`
|
|
79
|
+
2. For **template-level** schemas (Organization, WebSite, BreadcrumbList — shared): `cms-edit list --type template` → open → set
|
|
80
|
+
3. For **article type** schemas (BlogPosting on `structuredData`, Blog/CollectionPage/ItemList on `indexPageStructuredData`): link on articleType entry
|
|
81
|
+
4. For **page-level** subtype overrides (FAQPage, Product, Service): link on the page entry only
|
|
82
|
+
5. `cms-edit diff` then `cms-edit save`
|
|
60
83
|
|
|
61
84
|
## Best Practices
|
|
62
85
|
|
|
63
86
|
- Don't duplicate — template-level Organization schema covers all pages
|
|
64
|
-
-
|
|
87
|
+
- Link schema on **templates and types**, not on every article
|
|
88
|
+
- Use specific types where they apply — `BlogPosting` for blog posts, `ProfilePage` for authors
|
|
89
|
+
- BreadcrumbList `item` property: output only when `{{#url}}` is present on a segment
|
|
90
|
+
- One FAQPage per URL — do not duplicate component-level and CMS-level FAQPage on the same page
|
|
65
91
|
- Validate all required properties are present
|
|
66
92
|
- Schema must reflect actual page content
|
|
67
93
|
|
|
@@ -72,4 +98,4 @@ Create JSON-LD templates using these standard Mustache variables:
|
|
|
72
98
|
|
|
73
99
|
## Related skills
|
|
74
100
|
|
|
75
|
-
See the **core** skill for the full cms-edit workflow. See the **seo-descriptions** skill for meta description generation. For bulk audit/apply across all entries, schema linking, publish phases, and production verification, see **cms-seo-audit**.
|
|
101
|
+
See the **core** skill for the full cms-edit workflow. See the **seo-descriptions** skill for meta description generation. For bulk audit/apply across all entries, schema linking, publish phases, and production verification, see **cms-seo-audit**.
|