$npx -y skills add forcedotcom/sf-skills --skill experience-cms-brand-applyExtracts, retrieves, and applies CMS brand guidelines (voice, tone, style, colors, typography) to generated content. Use this skill ANY TIME a user request involves branding, brand voice, brand tone, brand guidelines, brand identity, brand styling, or applying a brand to content.
| 1 | # Applying CMS Brand |
| 2 | |
| 3 | Universal skill for searching, extracting, and applying CMS brand guidelines to generated content. |
| 4 | |
| 5 | ## Scope |
| 6 | |
| 7 | **This skill is for APPLYING existing brand guidelines from Salesforce CMS to content you generate.** |
| 8 | |
| 9 | **Use this skill when the user wants to:** |
| 10 | - Apply their brand voice/tone to generated content |
| 11 | - Find and use brand guidelines stored in Salesforce CMS |
| 12 | - Search for an existing brand in their org |
| 13 | - Get brand instructions for content generation |
| 14 | - Ensure generated content matches their brand identity |
| 15 | - Apply brand styling, tone, or voice to a page, component, or app |
| 16 | |
| 17 | **DO NOT use this skill when the user wants to:** |
| 18 | - Search for images or media (use experience-content-media-search skill) |
| 19 | - Create a new brand from scratch |
| 20 | - Edit brand definitions in CMS |
| 21 | - Generate logos or visual brand assets |
| 22 | |
| 23 | ## Before You Start |
| 24 | |
| 25 | **CRITICAL: You must retrieve brand instructions BEFORE applying any brand.** |
| 26 | |
| 27 | When a user requests branded content: |
| 28 | |
| 29 | 1. **Search for available brands** (if brand is not already identified) |
| 30 | 2. **Extract brand instructions** for the selected brand |
| 31 | 3. **Apply brand guidelines** to all content you generate |
| 32 | |
| 33 | **Never generate content first and retrofit branding later.** Brand instructions must inform content generation from the start. |
| 34 | |
| 35 | ## Workflow Overview |
| 36 | |
| 37 | Copy this checklist and track your progress: |
| 38 | |
| 39 | ```text |
| 40 | CMS Branding Progress: |
| 41 | - [ ] Step 1: Determine if brand is already identified or needs search |
| 42 | - [ ] Step 2: Search for brands (if needed) and present options to user |
| 43 | - [ ] Step 3: Extract brand instructions for the selected brand |
| 44 | ``` |
| 45 | |
| 46 | ## Step 1: Determine Brand Context |
| 47 | |
| 48 | Check if the user has already specified which brand to use: |
| 49 | |
| 50 | **Brand is known** (user named it, or only one brand exists): |
| 51 | - Skip to Step 3 (Extract Brand Instructions) |
| 52 | |
| 53 | **Brand is unknown** (user says "apply my brand" without specifying which): |
| 54 | - Proceed to Step 2 (Search for Brands) |
| 55 | |
| 56 | ## Step 2: Search for Brands |
| 57 | |
| 58 | **Tool:** `search_media_cms_channels` |
| 59 | |
| 60 | Brands are stored as CMS content of type `sfdc_cms__brand`. Search for them by |
| 61 | querying the CMS channels with the brand content type. |
| 62 | |
| 63 | > **Note:** Brand content search (`contentTypeFqn=sfdc_cms__brand`) is explicitly |
| 64 | > excluded from the `experience-content-media-search` skill's scope. Calling |
| 65 | > `search_media_cms_channels` directly here is correct and intentional — do not |
| 66 | > route brand search through `experience-content-media-search`. |
| 67 | |
| 68 | **Process:** |
| 69 | |
| 70 | 1. **Determine search query** — Use the user's keyword. Brand search matches on |
| 71 | brand title and description. |
| 72 | 2. **Build the request** with the fixed brand-search input contract: |
| 73 | |
| 74 | ```json |
| 75 | { |
| 76 | "inputs": [{ |
| 77 | "searchKeyword": "keyword", |
| 78 | "searchLanguage": "<detected_language>", |
| 79 | "channelType": "PublicUnauthenticated", |
| 80 | "contentTypeFqn": "sfdc_cms__brand", |
| 81 | "pageOffset": 0, |
| 82 | "searchLimit": 25 |
| 83 | }] |
| 84 | } |
| 85 | ``` |
| 86 | |
| 87 | Field rules: |
| 88 | - `searchKeyword` — the user's keyword input |
| 89 | - `searchLanguage` — auto-detect from the user's input; if unsure, use `en_US` |
| 90 | - `channelType` — always `PublicUnauthenticated` (brand content is delivered |
| 91 | via the public CMS channel; authenticated-channel brand search is not |
| 92 | supported by this tool) |
| 93 | - `contentTypeFqn` — always `sfdc_cms__brand` |
| 94 | - `pageOffset` — `0` |
| 95 | - `searchLimit` — `25` |
| 96 | |
| 97 | 3. **Call `search_media_cms_channels`** with the request |
| 98 | 4. **Parse the response** — A brand result has an ID starting with **`9Ps`**. Extract: |
| 99 | - `managedContentId` — Unique ID (use this for extraction in Step 3) |
| 100 | - `managedContentKey` — Content key identifier |
| 101 | - `title` — Brand display name |
| 102 | - `contentUrl` — URL to the brand content, found under |
| 103 | `managedContentChannelDeliveryDetails[0].contentUrl` |
| 104 | - `pageNumber`, `pageSize`, `totalResults` — pagination summary |
| 105 | |
| 106 | ### Presenting Brand Results |
| 107 | |
| 108 | **If brands found**, first show a summary line, then use `ask_followup_question` |
| 109 | to present options: |
| 110 | |
| 111 | ```text |
| 112 | Showing [N] of [totalResults] total results (page [pageNumber], page size [pageSize]). |
| 113 | |
| 114 | Which brand should I apply? |
| 115 | |
| 116 | 1. [Brand Title 1 |