@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/skills",
3
- "version": "1.5.5",
3
+ "version": "1.5.6",
4
4
  "description": "SE Studio agent skills for marketing site development with Contentful CMS",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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
- # Upload from local file, URL, or base64
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
- # Upload and create a Media wrapper in one step
378
- cms-edit asset upload ./figure.png --with-media --media-name "Figure 1" --media-position Middle
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 | Article or BlogPosting |
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 these standard Mustache variables:
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
- - `{{title}}` — page/article title
41
- - `{{seoDescription}}` — SEO meta description
42
- - `{{slug}}` — page slug
43
- - `{{publishDate}}` — article publish date
44
- - `{{updatedAt}}` — last modification date
45
- - `{{authorName}}` — primary article author name (first in `authors`)
46
- - `{{#article.authors}}` — multi-author JSON-LD (`name`, `url` per author)
47
- - `{{heroImageUrl}}` — primary image URL
48
- - `{{customerName}}` — from brand context
49
- - `{{siteUrl}}` — from brand context
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 `schemaOrg`, `jsonLd`, `structuredData`, or similar
57
- 2. For **template-level** schemas (Organization, WebSite — shared): `cms-edit list --type template` → open → set
58
- 3. For **page-level** schemas: open each page → set its schema field
59
- 4. `cms-edit diff` then `cms-edit save`
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
- - Use specific types — `MedicalBusiness` over `LocalBusiness` if applicable
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**.