forcedotcom/sf-skills19 files

Experience Cms Content Generate

Creates, edits, and publishes Salesforce CMS content of any kind — any domain, any topic. Single and bulk: create many in parallel, edit one or many, publish all or a subset. Use this skill ANY TIME a user asks to create, generate, write, draft, author, or add content, OR to update, edit, or revise a content record, OR to publish it, OR to delete/remove a content record. Triggers like \"create a <thing> about X\", \"create 5 <things>\", \"update content <id>\", \"publish content <id>\", \"publish the record <id>\", \"make <id> live\", \"delete content <id>\" — where <thing> is any user-named content type. Activates FIRST whenever content authoring, editing, publishing, or deletion is mentioned, regardless of subject. Handles the full workflow: finding the content type, resolving the workspace, creating content, editing or publishing it — including a record identified by its variantId. Does not apply to defining a content type / schema (use experience-cms-content-type-generate), cloning, versioning, workspaces, or media.

Specification
Skill ID
forcedotcom/sf-skills/experience-cms-content-generate
Publisher
forcedotcom
Repository
sf-skills
Installs
0
Files
19
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

forcedotcom/sf-skills/experience-cms-content-generateInstalls these files
  • SKILL.md
  • assets/display-formats.md
  • assets/payloads/create-content-bulk.json
  • assets/payloads/create-content-single.json
  • assets/payloads/publish-content.json
  • assets/payloads/update-content.json
  • assets/questions.md
  • examples/create-content-call.md
  • references/bulk-batching.md
  • references/content-type-classification.md
  • references/content-write-tool.md
  • references/delegation-protocol.md
  • references/edit-publish-workflow.md
  • references/error-recovery.md
  • references/identifier-resolution.md
  • references/intent-routing.md
  • references/principles.md
  • references/ux-rules.md
  • references/workspace-resolution.md

What this skill tells the agent

Creating CMS Content

Universal skill for creating Salesforce CMS content records — orchestrates type discovery, workspace resolution, and create_cms_content dispatch against an existing ContentTypeBundle.

Content generation is server-side, always. create_cms_content / update_cms_content_variant take the goal / edit instruction as prompt; the server generates + validates the body against the schema and returns the persisted record. Agent never walks the schema, assembles contentBody, pre-validates, or regenerates rejected fields (Principle 3).

Scope

Creates managed content records in Salesforce CMS — instances authored against an existing ContentTypeBundle.

Use when the user wants to: create a content record of any kind (single or bulk) from a free-text prompt against an existing CMS type; edit/refine session items; update/edit OR publish a record identified directly by managedContentVariantId / managedContentId — even if NOT created this session (Step 0 → UPDATE / PUBLISH entry); publish all or a subset; delete/remove a record — this skill OWNS the delete request and routes to a hard stop (Step 0-D); never surface the internal reason.

DO NOT use when the user wants to: define a new content type / schema (use experience-cms-content-type-generate); unpublish, clone, or version a record; manage workspaces / folders / channels; attach images / media; apply branding.

"Create image/media content" is NOT a pre-flight scope-out (only literal binary file attach/upload is the excluded "attach media" above). Creating an image/video content record (e.g. from a URL) enters the normal flow — resolve type + workspace, dispatch create_cms_content, never refuse up front or propose a REST / UI workaround. sfdc_cms__media is server-decided: let the tool return the error, then hard-stop per Principle 15 (references/error-recovery.md).

Before You Start

Follow steps in order — do not skip or reorder.

Every successful run MUST end by dispatching create_cms_content (≥1×), each carrying the goal via prompt.

Interaction-minimal — the only pre-dispatch question is Step 3 (workspace). Never ask for goal refinement, mode, or body details. Step 1 is silent. FQN in prompt → Step 2 fast-path; else Step 2a delegates with no intervening ask_user_tool. Bulk exception: Step 4 presents topic prompts for approval.

VERBATIM QUESTION CONTRACT — EVERY `ask_user_tool`, no exceptions. Full rule → references/ux-rules.md. Every question goes through ask_user_tool (never plain text); before ANY call, open assets/questions.md and copy BOTH the question string AND the answers array character-for-character, filling only <placeholders> — never reword/shorten the question, never add/drop/reorder answers, never put list content into an answer. No template covers it? STOP and re-read assets/questions.md — never compose one ad hoc.

Workflow Overview

- [ ] Step 1: Understand intent (silent — domain, count, FQN if present)
- [ ] Step 2: Resolve content type — fast-path (Buckets 1/2/3) or delegate → contentTypeFqn
- [ ] Step 3: Resolve workspace — UIBundle options or manual ID
- [ ] Step 4: Build payload — single or bulk (topic approval if bulk)
- [ ] Step 5: Dispatch create_cms_content (parallel for bulk)
- [ ] Step 6: Display content body + summary
- [ ] Step 7: Post-action loop — Edit / Publish / End
- [ ] Step 8: Edit — update_cms_content_variant
- [ ] Step 9: Publish — publish_content
- [ ] Step 10: Post-publish — Create more / Render (if UIBundle) / End

Step 0: Route the Intent (run FIRST, always)

Before Step 1, classify into exactly one intent and route. update/publish/delete are first-class entry points — NOT only tails of the create flow. Opening with one of those verbs → do NOT freelance (pick tools by intuition, run SOQL, guess a variant ID). Read the opening verb and route:

User intent (opening verb)Route to
create, generate, write, draft, author, post, add, compose; "create N <things>"CREATE — continue to Step 1
update, edit, change, modify, revise an existing recordUPDATE entry — Step 0-U
publish an existing recordPUBLISH entry — Step 0-P
delete, remove, destroy a recordDELETE — Step 0-D (hard stop)
ambiguous (can't tell create vs update vs publish)ask_user_tool disambiguation (Create new / Update existing / Publish existing / Cancel), route on the answer

No-drift STOP rule (every route). If the route's required content-write tool (create_cms_content/update_cms_content_variant/publish_content) is unavailable on this bridge, STOP, print the actionable user-facing message, end the turn. Never substitute SOQL, sf data, CLI, a sibling tool, or the contentBody channel — tool-unavailable and unsupported-operation are terminal, never a fallback trigger. Exact message + per-route slots + may/may-not-say → `references/intent-routing.md` § No-drift STOP rule.

Step 0-U (UPDATE) and Step 0-P (PUBLISH) — direct-entry paths

Full procedural detail → `references/intent-routing.md`. Direct-entry counterparts to in-session Step 8 (edit) / Step 9 (publish) — a record identified directly, possibly from a prior session or another user (editing/publishing is NOT session-only). Load-bearing invariants:

  • Hard identifier gate — BEFORE any tool call. Target managedContentVariantId comes ONLY from (a) the session registry or (b) a user-typed identifier (MC…/20Y…/9Ps). Name-only, no ID, not in registry → STOP and ask via ask_user_tool ("Which record should I work with?" question, copied EXACTLY, answers ["Cancel"]). You may NOT locate the record yourself — no search_content, discovery/listing tool, SOQL, or guessed ID.
  • Resolve by prefix + validate before acting → references/identifier-resolution.md (9Ps→get_content_variant; MC…/20Y…→get_content). Read fails → STOP; never edit/publish blindly.
  • 0-U → Step 8c (after MANDATORY full-body display + edit-instructions prompt), closes via Step 7 dialog. 0-P → Step 9b, closes with publish confirmation and ends the turn (no Step 10 — no session context). Neither runs Steps 1–5.

Step 0-D: DELETE (hard stop)

Delete is not available (no delete capability — internal detail, do NOT surface). Print exactly and only this message, nothing else:

Deleting content isn't supported here. To delete this content, open it in Salesforce CMS and use the Delete option there.

Say NOTHING before or after — no preamble, reasoning, rule-restatement, tool/server names, or meta-narration; the user sees only the plain message. End the turn. Do NOT offer unpublish_content, SOQL, or CLI as a substitute — the CMS UI is the only path to surface.

Step 1: Understand Intent

Silent step — NEVER ask anything here. Extract agent-internally, then go straight to Step 2. No "Let me clarify…" turn, no ask_user_tool, no content-type menu — even a vague prompt (generate new content for Q4 launch) has everything Step 2 needs. About to dispatch a question in Step 1 (clarify, content-type menu, "type in mind?", "how many?")? That IS the bug — move to Step 2. Parse the message for:

  • Content domain (article, blog, news, FAQ, …) — inferred as-is; no domain named is fine.
  • Quantity — explicit count → that number; "multiple"/"several"/"a few"/"some" → agent chooses 4–5; no indicator → single.
  • Content-type reference — capture any token that looks like a content type name (exact FQN, single-underscore near-miss, bare developer name, natural-language name) verbatim. Do NOT classify here — Step 2 assigns the bucket.

Do not strip or rewrite the message — the original is the creative direction for Step 4 topic prompts and what Step 2a passes to the sibling verbatim as intent.

More from forcedotcom

Use this skill in a project

Open any RiverX project, search the Skills panel for forcedotcom/sf-skills/experience-cms-content-generate, and install it in one click.

Use this skill