@salesforce/afv-skills 1.38.0 → 1.39.0

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.
Files changed (44) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-d360-analyze/README.md +2 -2
  3. package/skills/agentforce-d360-analyze/SKILL.md +6 -6
  4. package/skills/agentforce-d360-analyze/references/artifacts.md +1 -1
  5. package/skills/agentforce-d360-analyze/references/dc_dmo_fields.md +4 -4
  6. package/skills/agentforce-d360-analyze/references/dc_pipeline_contract.md +2 -2
  7. package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +10 -10
  8. package/skills/commerce-b2b-store-create/SKILL.md +3 -4
  9. package/skills/commerce-b2b-store-create/references/store-vs-storefront.md +2 -2
  10. package/skills/data360-activate/SKILL.md +0 -1
  11. package/skills/data360-connect/SKILL.md +0 -1
  12. package/skills/data360-harmonize/SKILL.md +0 -1
  13. package/skills/data360-orchestrate/SKILL.md +0 -1
  14. package/skills/data360-prepare/SKILL.md +0 -1
  15. package/skills/data360-query/SKILL.md +0 -1
  16. package/skills/data360-segment/SKILL.md +0 -1
  17. package/skills/design-systems-slds-validate/references/quality-checks.md +5 -5
  18. package/skills/design-systems-slds2-migrate/SKILL.md +4 -4
  19. package/skills/design-systems-slds2-migrate/references/color-hooks-decision-guide.md +1 -1
  20. package/skills/design-systems-slds2-migrate/references/examples.md +3 -3
  21. package/skills/design-systems-slds2-migrate/references/rule-lwc-token-to-slds-hook.md +1 -1
  22. package/skills/design-systems-slds2-migrate/references/rule-no-deprecated-tokens-slds1.md +2 -2
  23. package/skills/design-systems-slds2-migrate/references/rule-no-hardcoded-values.md +2 -2
  24. package/skills/design-systems-slds2-migrate/references/rule-no-slds-class-overrides.md +1 -1
  25. package/skills/dx-code-analyzer-configure/SKILL.md +5 -5
  26. package/skills/dx-code-analyzer-configure/references/ci-cd-templates.md +2 -2
  27. package/skills/dx-code-analyzer-custom-rule-create/SKILL.md +26 -26
  28. package/skills/dx-code-analyzer-run/SKILL.md +9 -9
  29. package/skills/dx-code-analyzer-run/references/post-scan-workflows.md +5 -5
  30. package/skills/dx-code-analyzer-run/references/vendor-file-handling.md +2 -2
  31. package/skills/dx-org-switch/SKILL.md +0 -1
  32. package/skills/experience-cms-brand-apply/SKILL.md +0 -1
  33. package/skills/experience-content-media-search/SKILL.md +17 -18
  34. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-custom-site.md +1 -1
  35. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-digital-experience-bundle.md +1 -1
  36. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-digital-experience-config.md +1 -1
  37. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-digital-experience.md +1 -1
  38. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-network.md +1 -1
  39. package/skills/experience-ui-bundle-site-generate/references/update-site-urls.md +1 -1
  40. package/skills/external-diagram-mermaid-generate/SKILL.md +0 -1
  41. package/skills/integration-eventing-subscription-configure/references/delete-guide.md +1 -1
  42. package/skills/mobile-platform-offline-validate/SKILL.md +4 -4
  43. package/skills/platform-lightning-app-coordinate/SKILL.md +9 -9
  44. package/skills/platform-metadata-retrieve/SKILL.md +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/afv-skills",
3
- "version": "1.38.0",
3
+ "version": "1.39.0",
4
4
  "description": "Salesforce skills for Agentforce Vibes",
5
5
  "license": "CC-BY-NC-4.0",
6
6
  "files": [
@@ -50,7 +50,7 @@ See `SKILL.md` for the full TRIGGER conditions, flag table, and the "DC-only bli
50
50
 
51
51
  Three stages, each independently runnable:
52
52
 
53
- ```
53
+ ```text
54
54
  fetch_dc.py → 24 dc.<name>.json + dc._session_manifest.json (DC Query REST waterfall)
55
55
  assemble_dc.py → dc._session_tree.json (in-memory hierarchical join)
56
56
  render_dc.py → dc._session_summary.md (markdown rendering)
@@ -87,7 +87,7 @@ For design-time architecture questions (topic/action tree, flow inventory, Apex
87
87
 
88
88
  ## Layout
89
89
 
90
- ```
90
+ ```text
91
91
  agentforce-d360-analyze/
92
92
  ├── SKILL.md ← runtime-parsed entry point (TRIGGER / DO NOT TRIGGER, flags, prompts)
93
93
  ├── README.md ← this file
@@ -2,15 +2,15 @@
2
2
  name: agentforce-d360-analyze
3
3
  description: "Data Cloud 360° view of a single Agentforce session. TRIGGER when user asks to trace, inspect, summarize, or describe a specific Agentforce session by session id (Agent Session UUID `019d…` or MessagingSession id `0Mw…`). Also triggers on session discovery — find/list/search sessions by time, agent, channel, outcome, or conversation text — when the user has no session id yet. DO NOT TRIGGER for design-time architecture questions (use agentforce-architecture-analyze instead) or for runtime perf/latency/SLO questions that require platform telemetry beyond Data Cloud."
4
4
  metadata:
5
+ version: "1.0"
6
+ minApiVersion: "66.0"
7
+ relatedSkills:
8
+ - "agentforce-architecture-analyze"
5
9
  cliTools:
6
10
  - tool: ["python3"]
7
11
  semver: ">=3.10.0"
8
12
  - tool: ["sf"]
9
13
  semver: ">=2.0.0"
10
- relatedSkills:
11
- - "agentforce-architecture-analyze"
12
- version: "1.0"
13
- minApiVersion: "66.0"
14
14
  ---
15
15
 
16
16
  # agentforce-d360-analyze — Data Cloud 360° session view
@@ -72,7 +72,7 @@ python3 "$prefix/discover_sessions.py" --org <alias> [filters...]
72
72
 
73
73
  ## Pipeline — three stages
74
74
 
75
- ```
75
+ ```text
76
76
  fetch_dc.py → 24 dc.<name>.json + dc._session_manifest.json (DC Query REST waterfall, 5 waves)
77
77
  assemble_dc.py → dc._session_tree.json (pure in-memory hierarchical join)
78
78
  render_dc.py → dc._session_summary.md (human summary, multi-section)
@@ -92,7 +92,7 @@ Flags: `--verbose` for per-DMO row counts; `--no-assemble` / `--no-render` to st
92
92
 
93
93
  Everything lands under `~/.vibe/data/agentforce-d360-analyze/<org_id15>/<agent>__<ver>/<session_id>/` (default; override with `--data-dir <path>`):
94
94
 
95
- ```
95
+ ```text
96
96
  dc.sessions.json dc.steps.json dc.gateway_requests.json
97
97
  dc.interactions.json dc.messages.json dc.gateway_responses.json
98
98
  dc.participants.json dc.generations.json dc.gateway_request_llm.json
@@ -5,7 +5,7 @@ Every successful trace lands artifacts under
5
5
  Re-running the same `(org, sid)` overwrites in place. Listed below in
6
6
  the order they're produced.
7
7
 
8
- ```
8
+ ```text
9
9
  ~/.vibe/data/agentforce-d360-analyze/<org_id15>/<agent>__<ver>/<sid>/
10
10
  ├── dc._session_manifest.json ← per-query counts + session_shape + empties
11
11
  ├── dc._session_tree.json ← hierarchical join (primary artifact)
@@ -59,7 +59,7 @@ Per-run row counts, empty reasons, and join paths are recorded in
59
59
  Legend: ★ = session-FK direct (one hop) ▸ = polymorphic `parent__c`
60
60
  ⚠ = requires feature provisioning
61
61
 
62
- ```
62
+ ```text
63
63
  Session (ssot__AIAgentSession__dlm, PK ssot__Id__c)
64
64
  │
65
65
  ├── ★ Participant (ssot__AiAgentSessionId__c)
@@ -135,7 +135,7 @@ All 24 entries below are in the `scripts/fetch_dc.py` waterfall — the
135
135
  join expressions are exactly what the script runs, and each one has a
136
136
  `.sql` template under `assets/dc/`.
137
137
 
138
- ```
138
+ ```text
139
139
  1. sessions WHERE ssot__Id__c = {sid}
140
140
  2. interactions WHERE ssot__AiAgentSessionId__c = {sid}
141
141
  3. messages WHERE ssot__AiAgentSessionId__c = {sid}
@@ -370,7 +370,7 @@ schemas are documented in the per-DMO sections below.
370
370
  `turnId__c` column (verified via live `describe`; 11 fields total,
371
371
  none reference session/trace/turn). The canonical join path is:
372
372
 
373
- ```
373
+ ```text
374
374
  Session → Interaction → Step (.ssot__GenerationId__c) → Generation (.generationId__c)
375
375
  ```
376
376
 
@@ -432,7 +432,7 @@ Richer than `GenAIGeneration` — carries prompt text, tokens, model, and
432
432
  session/user/bot identifiers. **Forward entry point for the entire audit
433
433
  chain**, reached from Session via `sessionId__c`:
434
434
 
435
- ```
435
+ ```text
436
436
  Session.ssot__Id__c → GatewayRequest.sessionId__c LIKE '%<sid>%'
437
437
  ```
438
438
 
@@ -3,7 +3,7 @@
3
3
  The DC pipeline for a single Agentforce session runs as three stages in
4
4
  sequence:
5
5
 
6
- ```
6
+ ```text
7
7
  fetch_dc.py → 24 dc.<name>.json artifacts + dc._session_manifest.json
8
8
  assemble_dc.py → dc._session_tree.json (pure in-memory join)
9
9
  render_dc.py → dc._session_summary.md (pure tree reader)
@@ -71,7 +71,7 @@ Per-field schema for every DMO lives in
71
71
  The "normal" path that nests a `GatewayRequest` under its owning
72
72
  `LLM_STEP` in the tree. Every edge is a platform-sanctioned forward FK:
73
73
 
74
- ```
74
+ ```text
75
75
  Step.ssot__GenerationId__c → Generation.generationId__c
76
76
  Generation.generationResponseId__c → GatewayResponse.generationResponseId__c
77
77
  GatewayResponse.generationRequestId__c → GatewayRequest.gatewayRequestId__c
@@ -3,15 +3,15 @@ name: commerce-b2b-open-code-components-integrate
3
3
  description: "Integrate Salesforce B2B Commerce open source components from GitHub into B2B Commerce stores. Use when users mention \"integrate open code components\", \"open source B2B commerce\", \"add open code components\", \"forcedotcom/b2b-commerce-open-source-components\", or want to add open source commerce components to their store. Copies all components and labels so they become available in Experience Builder."
4
4
  allowed-tools: Bash(git clone:*) Bash(cp:*) Read
5
5
  metadata:
6
+ version: "1.0"
7
+ minApiVersion: "56.0"
8
+ relatedSkills:
9
+ - "commerce-b2b-store-create"
6
10
  cliTools:
7
11
  - tool: ["git"]
8
12
  semver: ">=2.0.0"
9
13
  - tool: ["sf"]
10
14
  semver: ">=2.0.0"
11
- relatedSkills:
12
- - "commerce-b2b-store-create"
13
- version: "1.0"
14
- minApiVersion: "56.0"
15
15
  ---
16
16
 
17
17
  ## When to Use This Skill
@@ -98,8 +98,8 @@ Copy all components and labels from cloned repo to site directory:
98
98
  5. Report: "Copied X components and Y label sets"
99
99
 
100
100
  **Output:**
101
- ```
102
- ✅ Integration Complete!
101
+ ```text
102
+ Integration Complete!
103
103
 
104
104
  Copied: X components and Y label sets to <store-name>
105
105
 
@@ -125,7 +125,7 @@ Next Steps:
125
125
  **User:** "1"
126
126
 
127
127
  **Agent:** "I'm checking if your project already has B2B store metadata locally..."
128
- - ✓ Found store metadata for My_B2B_Store1
128
+ - [done] Found store metadata for My_B2B_Store1
129
129
 
130
130
  **Agent:** "I'm checking if open code components already exist in your store's site metadata..."
131
131
 
@@ -138,10 +138,10 @@ Next Steps:
138
138
 
139
139
  **Agent:** "I'm now copying all open code LWC components from the cloned repository into your store's site metadata directory..."
140
140
  **Agent:** "I'm copying the associated label files that these components need..."
141
- - ✓ Copied 45 components and 38 label sets
141
+ - [done] Copied 45 components and 38 label sets
142
142
 
143
- ```
144
- ✅ Integration Complete!
143
+ ```text
144
+ Integration Complete!
145
145
 
146
146
  Copied: 45 components and 38 label sets to My_B2B_Store1
147
147
 
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: commerce-b2b-store-create
3
3
  description: "Interactive workflow to create Commerce B2B Stores and retrieve storefront metadata. Use when users want to: create B2B Commerce stores, build Commerce storefronts, set up B2B stores from Vibes, retrieve Commerce metadata, deploy Commerce experiences, work with DigitalExperienceBundle for Commerce."
4
- compatibility: "Requires Commerce licenses, Experience Cloud, Salesforce CLI"
5
4
  metadata:
6
5
  version: "1.0"
7
6
  minApiVersion: "56.0"
@@ -101,7 +100,7 @@ sf org list metadata --metadata-type DigitalExperienceConfig --json
101
100
  - Explain naming (underscores, number suffixes)
102
101
 
103
102
  **Example output:**
104
- ```
103
+ ```text
105
104
  Available Digital Experience sites:
106
105
  1. My_B2B_Store1
107
106
  2. Partner_Portal
@@ -134,7 +133,7 @@ sf project retrieve start -m DigitalExperienceBundle:site/<selected-store-name>
134
133
  - List retrieved directory structure
135
134
 
136
135
  **Expected output:**
137
- ```
136
+ ```text
138
137
  Retrieved: force-app/main/default/digitalExperiences/site/My_B2B_Store1/
139
138
  ├── My_B2B_Store1.digitalExperience-meta.xml
140
139
  ├── sfdc_cms__view/ (home, current_cart, detail_*, list_*, etc.)
@@ -149,7 +148,7 @@ Retrieved: force-app/main/default/digitalExperiences/site/My_B2B_Store1/
149
148
 
150
149
  **Agent provides:**
151
150
 
152
- ✅ **Metadata retrieved successfully!**
151
+ **Metadata retrieved successfully!**
153
152
 
154
153
  **Next steps:**
155
154
  - Customize with custom LWCs or branding changes
@@ -121,7 +121,7 @@ Understanding the distinction between Commerce Store and Storefront is critical
121
121
 
122
122
  ### Step 1: Create Commerce Store (Must Be First)
123
123
 
124
- ```
124
+ ```text
125
125
  User Interface (Commerce App)
126
126
  ↓
127
127
  WebStore Record Created
@@ -144,7 +144,7 @@ Commerce Components Configured
144
144
 
145
145
  ### Step 2: Retrieve Storefront Metadata
146
146
 
147
- ```
147
+ ```sh
148
148
  sf org list metadata --metadata-type DigitalExperienceConfig
149
149
  ↓
150
150
  Select Store from List
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: data360-activate
3
3
  description: "Salesforce Data Cloud Act phase. Use this skill when the user manages activations, activation targets, data actions, or downstream delivery of Data Cloud audiences and data. TRIGGER when: user manages activations, activation targets, data actions, or downstream delivery of Data Cloud audiences and data. DO NOT TRIGGER when: the task is segment creation (use data360-segment), data retrieval/search work (use data360-query), or STDM/session tracing (use agentforce-observe)."
4
- compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["node"]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: data360-connect
3
3
  description: "Salesforce Data Cloud Connect phase. Use this skill when the user manages Data Cloud connections, connectors, or sets up a new source system. TRIGGER when: user manages Data Cloud connections, connectors, connector metadata, tests a connection, browses source objects or databases, or sets up a new source system. DO NOT TRIGGER when: the task is about data streams or DLOs (use data360-prepare), DMOs or identity resolution (use data360-harmonize), retrieval/search (use data360-query), or STDM telemetry (use agentforce-observe)."
4
- compatibility: "Requires the sf data360 CLI plugin and a Data Cloud-enabled org"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["node"]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: data360-harmonize
3
3
  description: "Salesforce Data Cloud Harmonize phase. Use this skill when the user works with DMOs, mappings, relationships, identity resolution, unified profiles, data graphs, or universal IDs. TRIGGER when: user works with DMOs, mappings, relationships, identity resolution, unified profiles, data graphs, or universal IDs. DO NOT TRIGGER when: the task is only about streams/DLOs (use data360-prepare), segments/insights (use data360-segment), retrieval/search (use data360-query), or STDM/session tracing (use agentforce-observe)."
4
- compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["node"]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: data360-orchestrate
3
3
  description: "Salesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows. Use this skill when the user needs a multi-step Data Cloud pipeline, cross-phase troubleshooting, or data space and data kit management. TRIGGER when: user needs a multi-step Data Cloud pipeline, asks to set up or troubleshoot Data Cloud across phases, manages data spaces or data kits, or wants a cross-phase sf data360 workflow. DO NOT TRIGGER when: work is isolated to a single phase (use the matching phase-specific skill), the task is STDM/session tracing/parquet telemetry (use agentforce-observe), standard CRM SOQL (use platform-soql-query), or Apex implementation (use platform-apex-generate)."
4
- compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["curl"]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: data360-prepare
3
3
  description: "Salesforce Data Cloud Prepare phase. Use this skill when the user creates or manages Data Cloud data streams, DLOs, transforms, or Document AI configurations. TRIGGER when: user creates or manages Data Cloud data streams, DLOs, transforms, or Document AI configurations, or asks about ingestion into Data Cloud. DO NOT TRIGGER when: the task is connection setup only (use data360-connect), DMOs and identity resolution (use data360-harmonize), or query/search work (use data360-query)."
4
- compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["node"]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: data360-query
3
3
  description: "Salesforce Data Cloud Retrieve phase. Use this skill when the user runs Data Cloud SQL, async queries, vector search, search-index workflows, or metadata introspection for Data Cloud objects. TRIGGER when: user runs Data Cloud SQL, describe, async queries, vector search, search-index workflows, or metadata introspection for Data Cloud objects. DO NOT TRIGGER when: the task is standard CRM SOQL (use platform-soql-query), segment creation or calculated insight design (use data360-segment), or STDM/session tracing/parquet analysis (use agentforce-observe)."
4
- compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["node"]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: data360-segment
3
3
  description: "Salesforce Data Cloud Segment phase. Use this skill when the user creates or publishes segments, manages calculated insights, or troubleshoots audience SQL in Data Cloud. TRIGGER when: user creates or publishes segments, manages calculated insights, inspects segment counts or membership, or troubleshoots audience SQL in Data Cloud. DO NOT TRIGGER when: the task is DMO/mapping/identity-resolution work (use data360-harmonize), activation work (use data360-activate), query/search-index work (use data360-query), or Standard Data Model (STDM)/session tracing (use agentforce-observe)."
4
- compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["node"]
@@ -260,7 +260,7 @@ const NATIVE_SELECT = /<select\s/gi;
260
260
 
261
261
  The script outputs individual category scores. It does **not** produce a combined overall grade — the agent computes that using the formula in SKILL.md Step 4:
262
262
 
263
- ```
263
+ ```text
264
264
  Overall = (Linter × 0.30) + (Theming × 0.20) + (Accessibility × 0.20)
265
265
  + (CodeQuality × 0.15) + (ComponentUsage × 0.15)
266
266
  ```
@@ -273,7 +273,7 @@ The script automates **17 of 53** checks listed above (marked **Script** in the
273
273
 
274
274
  ### Theming
275
275
 
276
- ```
276
+ ```text
277
277
  Score = 100 - (critical issues in category × 10)
278
278
  - (warnings in category × 3)
279
279
  - (info in category × 1)
@@ -282,7 +282,7 @@ Min: 0
282
282
 
283
283
  ### Accessibility
284
284
 
285
- ```
285
+ ```text
286
286
  Score = 100 - (critical issues in category × 10)
287
287
  - (warnings in category × 3)
288
288
  - (info in category × 1)
@@ -291,7 +291,7 @@ Min: 0
291
291
 
292
292
  ### Code Quality
293
293
 
294
- ```
294
+ ```text
295
295
  Score = 100 - (critical issues in category × 10)
296
296
  - (warnings in category × 3)
297
297
  - (info in category × 1)
@@ -300,7 +300,7 @@ Min: 0
300
300
 
301
301
  ### Component Usage
302
302
 
303
- ```
303
+ ```text
304
304
  Score = 100 - (critical issues in category × 10)
305
305
  - (warnings in category × 3)
306
306
  - (info in category × 1)
@@ -2,10 +2,10 @@
2
2
  name: design-systems-slds2-migrate
3
3
  description: "Migrate Lightning Web Components from SLDS 1 to SLDS 2 by running the SLDS linter and fixing violations. Use this skill whenever users mention SLDS 2, SLDS uplift, linter violations, LWC token migration, class overrides, hardcoded CSS values that need SLDS hook replacement, or styling hook selection. Covers all styling hook categories — color, spacing, sizing, typography, borders, radius, and shadows. Also use when users mention no-hardcoded-values, no-slds-class-overrides, lwc-to-slds-hooks, no-deprecated-tokens-slds1, or ask about SLDS component migration — even if they don't explicitly say \"uplift\" or \"migration\"."
4
4
  metadata:
5
+ version: "1.0"
5
6
  cliTools:
6
7
  - tool: ["npx"]
7
8
  semver: ">=7.0.0"
8
- version: "1.0"
9
9
  ---
10
10
 
11
11
  # Goal
@@ -36,7 +36,7 @@ Color hooks require the most judgment (context-dependent selection). Non-color h
36
36
 
37
37
  # Workflow
38
38
 
39
- ```
39
+ ```text
40
40
  1. **REQUIRED — ALWAYS run first:** npx @salesforce-ux/slds-linter@latest lint --fix . — NEVER skip this step. This handles simple violations automatically.
41
41
  2. Review linter output -> Identify remaining manual fixes needed
42
42
  3. Fix by violation type -> Use per-rule reference guides
@@ -57,7 +57,7 @@ The linter analyzes all CSS and markup files (`.html` for LWC, `.cmp` for Aura),
57
57
 
58
58
  The linter reports violations in this format:
59
59
 
60
- ```
60
+ ```text
61
61
  componentName.css
62
62
  15:3 warning Overriding slds-button isn't supported. To differentiate SLDS and
63
63
  custom classes, create a CSS class in your namespace.
@@ -126,7 +126,7 @@ See [rule-no-slds-class-overrides.md](references/rule-no-slds-class-overrides.md
126
126
 
127
127
  **Linter feedback loop — repeat until zero errors:**
128
128
 
129
- ```
129
+ ```text
130
130
  1. npx @salesforce-ux/slds-linter@latest lint .
131
131
  2. Review errors -> fix by type (Step 3)
132
132
  3. Re-run linter
@@ -24,7 +24,7 @@ This guide helps you choose the correct SLDS 2 color hook. Use it when replacing
24
24
 
25
25
  **Always try semantic hooks first.** ~85-90% of color decisions should use semantic hooks. System and palette hooks are last resorts, not alternatives.
26
26
 
27
- ```
27
+ ```text
28
28
  1. SEMANTIC HOOKS (try first, ~85-90% of decisions)
29
29
  surface-*, accent-*, error/warning/success/info/disabled-*
30
30
  • Accessibility built-in • Theme-aware • Dark mode ready
@@ -19,7 +19,7 @@ Before/after examples organized by violation type.
19
19
  ## Class Override Example
20
20
 
21
21
  **Violation:**
22
- ```
22
+ ```text
23
23
  dataTable.css
24
24
  5:1 warning Overriding slds-table isn't supported. To differentiate SLDS and
25
25
  custom classes, create a CSS class in your namespace.
@@ -68,7 +68,7 @@ dataTable.css
68
68
  ## LWC Token Example
69
69
 
70
70
  **Violation:**
71
- ```
71
+ ```text
72
72
  panelHeader.css
73
73
  3:3 error The '--lwc-colorBackgroundAlt' design token is deprecated. Replace it with
74
74
  the SLDS 2 styling hook and set the fallback to '--lwc-colorBackgroundAlt'.
@@ -106,7 +106,7 @@ panelHeader.css
106
106
  ### Tile with Border and Spacing
107
107
 
108
108
  **Violation:**
109
- ```
109
+ ```text
110
110
  tile.css
111
111
  2:20 warning Consider replacing the #ffffff static value with an SLDS 2 styling hook
112
112
  that has a similar value:
@@ -10,7 +10,7 @@
10
10
 
11
11
  The linter detects deprecated `--lwc-*` tokens and reports them as **errors**. When there is only one suggestion, `--fix` auto-applies it. When there are multiple suggestions, manual selection is required. Here's real linter output for a multiple-suggestion case:
12
12
 
13
- ```
13
+ ```text
14
14
  2:14 error The '--lwc-colorBackground' design token is deprecated. Replace it with
15
15
  the SLDS 2 styling hook and set the fallback to '--lwc-colorBackground'.
16
16
  1. --slds-g-color-surface-2
@@ -13,13 +13,13 @@ The linter detects `t()` and `token()` function calls in CSS, `.cmp`, and `.html
13
13
  Two message types:
14
14
 
15
15
  **When a replacement exists:**
16
- ```
16
+ ```text
17
17
  Consider removing t(colorTextDefault) or replacing it with --slds-g-color-on-surface-3.
18
18
  Set the fallback to t(colorTextDefault).
19
19
  ```
20
20
 
21
21
  **When no replacement exists:**
22
- ```
22
+ ```text
23
23
  Update outdated design tokens to SLDS 2 styling hooks with similar values.
24
24
  ```
25
25
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  The linter detects hardcoded values and reports them as warnings. Here's real output for an icon component:
12
12
 
13
- ```
13
+ ```text
14
14
  3:10 warning Consider replacing the 32px static value with an SLDS 2 styling hook
15
15
  that has a similar value: --slds-g-sizing-9. slds/no-hardcoded-values-slds2
16
16
 
@@ -72,7 +72,7 @@ The fallback must be the **exact original value** from the source CSS (e.g., `#0
72
72
 
73
73
  When examining a hardcoded value or deprecated token, follow this decision tree:
74
74
 
75
- ```
75
+ ```text
76
76
  1. SLDS utility class available?
77
77
  └─ Yes → Remove CSS, add utility class to HTML
78
78
  └─ No ↓
@@ -10,7 +10,7 @@
10
10
 
11
11
  The linter detects CSS classes that directly override SLDS classes and reports them as **warnings**. It does **not** auto-fix — all changes require manual work in both CSS and HTML.
12
12
 
13
- ```
13
+ ```text
14
14
  1:1 warning Overriding slds-button isn't supported. To differentiate SLDS and
15
15
  custom classes, create a CSS class in your namespace.
16
16
  Examples: myapp-input, myapp-button. slds/no-slds-class-overrides
@@ -4,9 +4,11 @@ description: "Set up, configure, and troubleshoot Salesforce Code Analyzer for a
4
4
  metadata:
5
5
  version: "1.0"
6
6
  relatedSkills:
7
- - "dx-code-analyzer-run"
8
7
  - "dx-code-analyzer-custom-rule-create"
8
+ - "dx-code-analyzer-run"
9
9
  cliTools:
10
+ - tool: ["sf"]
11
+ semver: ">=2.0.0"
10
12
  - tool: ["curl"]
11
13
  semver: ">=7.0.0"
12
14
  - tool: ["java"]
@@ -17,8 +19,6 @@ metadata:
17
19
  semver: ">=9.0.0"
18
20
  - tool: ["python3"]
19
21
  semver: ">=3.10.0"
20
- - tool: ["sf"]
21
- semver: ">=2.0.0"
22
22
  ---
23
23
 
24
24
  # Configuring Code Analyzer Skill
@@ -51,7 +51,7 @@ This skill manages the `code-analyzer.yml` configuration file — the single sou
51
51
 
52
52
  ## Tool Usage Rules
53
53
 
54
- **Allowed:** Bash (sf, java, node, python3, git, npm), Read, Write, Edit
54
+ **Allowed:** Bash (sf, java, node, python3, npm), Read, Write, Edit
55
55
  **Forbidden:** MCP tools, Agent tool, Web tools, other skills, `which`, `find`, `locate`, searching for binaries
56
56
 
57
57
  ---
@@ -359,7 +359,7 @@ rules:
359
359
 
360
360
  ### 6.1 Rule Name Resolution (Fuzzy Matching)
361
361
 
362
- **⚠️ CRITICAL:** A misspelled or partial rule name in `code-analyzer.yml` is SILENTLY IGNORED — no error, the override just won't apply.
362
+ **CRITICAL:** A misspelled or partial rule name in `code-analyzer.yml` is SILENTLY IGNORED — no error, the override just won't apply.
363
363
 
364
364
  **When users reference rules by approximate names** (e.g., "the doc rule", "CRUD violation", "hardcoded values"), resolve to exact names BEFORE writing YAML:
365
365
 
@@ -316,7 +316,7 @@ For monorepos where Salesforce code lives in a subdirectory, use `--target` to s
316
316
  ```
317
317
 
318
318
  For multiple packages:
319
- ```
319
+ ```text
320
320
  --target packages/app-a/force-app --target packages/app-b/force-app
321
321
  ```
322
322
 
@@ -601,7 +601,7 @@ Build the `run-arguments` string by combining these independent flags as needed:
601
601
 
602
602
  ### Decision Tree for Template Selection
603
603
 
604
- ```
604
+ ```text
605
605
  User wants CI/CD for Code Analyzer
606
606
  ├── Platform?
607
607
  │ ├── GitHub Actions → Use forcedotcom/run-code-analyzer@v2
@@ -4,8 +4,8 @@ description: "Create custom Code Analyzer rules for Regex (pattern matching), PM
4
4
  metadata:
5
5
  version: "1.0"
6
6
  relatedSkills:
7
- - "dx-code-analyzer-run"
8
7
  - "dx-code-analyzer-configure"
8
+ - "dx-code-analyzer-run"
9
9
  cliTools:
10
10
  - tool: ["git"]
11
11
  semver: ">=2.0.0"
@@ -102,7 +102,7 @@ These are non-negotiable rules. Violating any of them is a skill failure regardl
102
102
 
103
103
  \* **For ESLint:** ALWAYS check Tier 1 (built-in rules) and Tier 2 (configurable rules) BEFORE creating a custom plugin. See `references/eslint-rules-discovery.md`.
104
104
 
105
- ⚠️ **"Both could work → Regex first" NEVER applies to JavaScript/LWC/TypeScript files.** JS/LWC/TS patterns MUST use ESLint — Regex cannot distinguish code from comments/strings in JS and produces false positives. Do NOT rationalize Regex for JS files based on "simplicity" or "no npm dependencies."
105
+ **"Both could work → Regex first" NEVER applies to JavaScript/LWC/TypeScript files.** JS/LWC/TS patterns MUST use ESLint — Regex cannot distinguish code from comments/strings in JS and produces false positives. Do NOT rationalize Regex for JS files based on "simplicity" or "no npm dependencies."
106
106
 
107
107
  Tell the user which engine you chose and why. Respect their preference if they disagree.
108
108
 
@@ -116,7 +116,7 @@ When a rule should NOT apply to test classes, the approach differs by engine:
116
116
  | **Regex** | Use `ignores.files` in `code-analyzer.yml` with globs like `**/*Test.cls` | `regex_ignore` is per-LINE, not per-FILE — it CANNOT exclude entire test classes. Only use `regex_ignore` for per-line patterns like `// NOPMD` |
117
117
  | **ESLint** | Use `ignores` array in `eslint.config.js` | Standard ESLint file-level ignores |
118
118
 
119
- ⚠️ **`regex_ignore` is NOT file-level exclusion.** It only skips matches on lines that ALSO match the ignore pattern. Example: `regex_ignore: "/@isTest/i"` only suppresses violations on lines containing `@isTest` — a SOQL query on line 50 of a test class still flags because line 50 doesn't contain `@isTest`. To exclude test files from regex rules entirely, use:
119
+ **`regex_ignore` is NOT file-level exclusion.** It only skips matches on lines that ALSO match the ignore pattern. Example: `regex_ignore: "/@isTest/i"` only suppresses violations on lines containing `@isTest` — a SOQL query on line 50 of a test class still flags because line 50 doesn't contain `@isTest`. To exclude test files from regex rules entirely, use:
120
120
  ```yaml
121
121
  ignores:
122
122
  files:
@@ -124,7 +124,7 @@ ignores:
124
124
  - "**/*_Test.cls"
125
125
  ```
126
126
 
127
- ⚠️ **`ignores.files` is GLOBAL** — it affects ALL engines and ALL rules. If you need test-class exclusion for some rules but not others (e.g., exclude tests from SOQL rules but still scan tests for @AuraEnabled), use **PMD with XPath** for the rules that need selective exclusion. PMD's XPath can structurally check `@Test = true()` per-method or per-class — Regex cannot.
127
+ **`ignores.files` is GLOBAL** — it affects ALL engines and ALL rules. If you need test-class exclusion for some rules but not others (e.g., exclude tests from SOQL rules but still scan tests for @AuraEnabled), use **PMD with XPath** for the rules that need selective exclusion. PMD's XPath can structurally check `@Test = true()` per-method or per-class — Regex cannot.
128
128
 
129
129
  **Decision guide for Apex rules that should skip test classes:**
130
130
  - If the pattern is structural (method calls, annotations, nesting) → use PMD. XPath handles test-class exclusion natively.
@@ -180,7 +180,7 @@ When the user highlights a code block in their editor and asks to "catch this",
180
180
  --name "<RuleName>" --regex "<pattern>" --description "<desc>" \
181
181
  --severity <1-5> --file-extensions ".cls,.trigger"
182
182
  ```
183
- ⚠️ **ALWAYS use the script.** Do NOT manually write regex patterns into `code-analyzer.yml` — regex characters (quotes, backslashes, braces) inside YAML cause parsing failures. The script handles serialization correctly.
183
+ **ALWAYS use the script.** Do NOT manually write regex patterns into `code-analyzer.yml` — regex characters (quotes, backslashes, braces) inside YAML cause parsing failures. The script handles serialization correctly.
184
184
  4. **Validate** — `sf code-analyzer rules --rule-selector regex:<RuleName>`
185
185
  5. **Test positive** — `sf code-analyzer run --rule-selector regex:<RuleName> --target <violation-sample>` — must find violations
186
186
  6. **Test negative** — `sf code-analyzer run --rule-selector regex:<RuleName> --target <clean-sample>` — must find 0 violations. If it flags clean code, your regex is too broad — go back and tighten the pattern.
@@ -190,10 +190,10 @@ When the user highlights a code block in their editor and asks to "catch this",
190
190
  ### For PMD/XPath Rules (Apex)
191
191
 
192
192
  1. **Write a minimal sample** (5-10 lines) demonstrating the violation. Write sample files inside the project workspace (e.g., a temporary `samples/` directory at the project root) so Code Analyzer can target them. **After both positive and negative tests pass, delete ALL sample files you created** — both the original samples and any copies made during testing. Do not leave temporary test fixtures in the user's project. For loop-based rules, the positive sample MUST include all 3 Apex loop types (`for-each`, traditional `for`, and `while`) — omitting any loop type means the XPath won't be validated against it and may silently miss violations.
193
- 2. **⚠️ MANDATORY: Dump the AST** — `sf code-analyzer ast-dump --file <sample.cls> --output-file <ast.xml>` — this step is NOT optional. Do NOT skip it even if you "already know" the node names. Run it, read the output, confirm the exact node names and attributes.
193
+ 2. **MANDATORY: Dump the AST** — `sf code-analyzer ast-dump --file <sample.cls> --output-file <ast.xml>` — this step is NOT optional. Do NOT skip it even if you "already know" the node names. Run it, read the output, confirm the exact node names and attributes.
194
194
  3. **Read the AST output** — identify the target node and its attributes from the ACTUAL ast-dump output (not from memory). Use `references/apex-ast-reference.md` and `references/xpath-patterns.md` as supplementary context only.
195
195
  4. **Write XPath** — target the smallest stable node with discriminating attributes. Every node name in your XPath MUST appear verbatim in the ast-dump output you just read. Use `/Child` (direct child) vs `//Descendant` deliberately — check the ast-dump to understand which nodes are siblings vs nested.
196
- 5. **⚠️ BEFORE creating the rule: Write a SEPARATE negative sample file** (5-10 lines) showing code that is CORRECT and must NOT be flagged. This MUST be a distinct file from the positive sample — do NOT combine positive and negative cases into one file. For loop-based rules, include `for (x : [SELECT...])` idiom. Run `sf code-analyzer ast-dump` on this negative sample file too. Read the output and trace your XPath against it — confirm it does NOT match any node in the negative AST. If it would match, go back to step 4 and tighten the XPath BEFORE proceeding. Do NOT skip this step or defer it until after rule creation. The negative file will be used again in step 9 for an explicit zero-violation confirmation.
196
+ 5. **BEFORE creating the rule: Write a SEPARATE negative sample file** (5-10 lines) showing code that is CORRECT and must NOT be flagged. This MUST be a distinct file from the positive sample — do NOT combine positive and negative cases into one file. For loop-based rules, include `for (x : [SELECT...])` idiom. Run `sf code-analyzer ast-dump` on this negative sample file too. Read the output and trace your XPath against it — confirm it does NOT match any node in the negative AST. If it would match, go back to step 4 and tighten the XPath BEFORE proceeding. Do NOT skip this step or defer it until after rule creation. The negative file will be used again in step 9 for an explicit zero-violation confirmation.
197
197
  6. **Create the rule** — run the script:
198
198
  ```bash
199
199
  node "<skill_dir>/scripts/create-pmd-rule.js" \
@@ -224,7 +224,7 @@ When the user highlights a code block in their editor and asks to "catch this",
224
224
  file_extensions:
225
225
  xml: [".xml"]
226
226
  ```
227
- ⚠️ Do NOT add compound extensions like `.permissionset-meta.xml` — Code Analyzer's validator rejects them (`/^[.][a-zA-Z0-9]+$/` pattern). Just `.xml` covers all Salesforce metadata files automatically.
227
+ Do NOT add compound extensions like `.permissionset-meta.xml` — Code Analyzer's validator rejects them (`/^[.][a-zA-Z0-9]+$/` pattern). Just `.xml` covers all Salesforce metadata files automatically.
228
228
  6. **Write a SEPARATE negative sample file** — same as Apex rules: create a metadata file that is correct and must NOT be flagged. Verify the XPath does not match it BEFORE creating the rule. Both positive and negative samples should be `.xml` extension files in the workspace so PMD can scan them directly.
229
229
  7. **Create the rule** — run the script:
230
230
  ```bash
@@ -265,7 +265,7 @@ ESLint has 200+ built-in rules plus thousands more from plugins. DO NOT attempt
265
265
 
266
266
  ---
267
267
 
268
- 0. **⚠️ MANDATORY: Run the ESLint discovery workflow FIRST.** 90% of ESLint requests are solved by built-in rules (Tier 1) or configurable rules like `no-restricted-syntax` (Tier 2). Creating a custom plugin (Tier 3) is a LAST RESORT. Before proceeding:
268
+ 0. **MANDATORY: Run the ESLint discovery workflow FIRST.** 90% of ESLint requests are solved by built-in rules (Tier 1) or configurable rules like `no-restricted-syntax` (Tier 2). Creating a custom plugin (Tier 3) is a LAST RESORT. Before proceeding:
269
269
 
270
270
  a) **Run:** `sf code-analyzer rules --rule-selector eslint`
271
271
  b) **Search** the output for keywords from the user's request (e.g., "console", "equal", "unused")
@@ -276,9 +276,9 @@ ESLint has 200+ built-in rules plus thousands more from plugins. DO NOT attempt
276
276
 
277
277
  **Validation:** After configuration, run `sf code-analyzer rules --rule-selector eslint:<ruleName>` to confirm it appears. If it doesn't, the config is wrong.
278
278
 
279
- ⚠️ **Skipping this discovery workflow and creating a custom plugin when a built-in rule exists is a skill failure**, regardless of whether the custom plugin works.
279
+ **Skipping this discovery workflow and creating a custom plugin when a built-in rule exists is a skill failure**, regardless of whether the custom plugin works.
280
280
 
281
- ⚠️ **Built-in ESLint rules vs. configurable ESLint rules:** Code Analyzer bundles a SUBSET of ESLint rules in its base config. Rules like `no-restricted-globals`, `no-restricted-syntax`, and `no-restricted-properties` are core ESLint rules but are NOT active until you enable them in an `eslint.config.js`. They WILL appear in `sf code-analyzer rules` output ONLY after you configure them. **Always validate** (step 4) to confirm the rule actually loaded — do NOT assume a rule exists just because it's a core ESLint rule.
281
+ **Built-in ESLint rules vs. configurable ESLint rules:** Code Analyzer bundles a SUBSET of ESLint rules in its base config. Rules like `no-restricted-globals`, `no-restricted-syntax`, and `no-restricted-properties` are core ESLint rules but are NOT active until you enable them in an `eslint.config.js`. They WILL appear in `sf code-analyzer rules` output ONLY after you configure them. **Always validate** (step 4) to confirm the rule actually loaded — do NOT assume a rule exists just because it's a core ESLint rule.
282
282
 
283
283
  1. **Install the ESLint plugin** (skip if using a built-in/core ESLint rule) — `npm install --save-dev eslint-plugin-<name>`
284
284
  2. **Create/update `eslint.config.js`** — add plugin and rule configuration (or just enable the built-in rule with `"error"` severity). **The file MUST exist** before configuring `engines.eslint.eslint_config_file` in `code-analyzer.yml` — Code Analyzer validates the path and fails if the file is missing.
@@ -300,26 +300,26 @@ For `no-restricted-globals`, `no-restricted-syntax`, and `no-restricted-properti
300
300
  - User: "Ban console.log in LWC"
301
301
  - Discovery: `sf code-analyzer rules --rule-selector eslint | grep console` → finds `no-console`
302
302
  - Action: Enable `no-console` in eslint.config.js
303
- - Result: ✅ Done in 2 minutes (no custom plugin needed)
303
+ - Result: Done in 2 minutes (no custom plugin needed)
304
304
 
305
305
  **Example 2: Configurable rule (Tier 2)**
306
306
  - User: "Ban setTimeout in LWC"
307
307
  - Discovery: No built-in `no-setTimeout` rule
308
308
  - Action: Use `no-restricted-globals` with custom message
309
- - Result: ✅ Done in 5 minutes (no custom plugin needed)
309
+ - Result: Done in 5 minutes (no custom plugin needed)
310
310
 
311
311
  **Example 3: LWC plugin rule (Tier 1)**
312
312
  - User: "Ban innerHTML for XSS prevention"
313
313
  - Discovery: `@lwc/lwc/no-inner-html` already exists
314
314
  - Action: Enable `@lwc/lwc/no-inner-html` in config
315
- - Result: ✅ Done in 2 minutes (no custom plugin needed)
315
+ - Result: Done in 2 minutes (no custom plugin needed)
316
316
 
317
317
  **Example 4: Custom plugin justified (Tier 3)**
318
318
  - User: "Flag imperative Apex calls without error handling"
319
319
  - Discovery: No built-in rule for this pattern
320
320
  - Analysis: Pattern requires checking `import` + `.then()` without `.catch()` — multi-node traversal
321
321
  - Action: Create custom plugin with visitor pattern
322
- - Result: ✅ Custom plugin is justified (20+ minutes effort)
322
+ - Result: Custom plugin is justified (20+ minutes effort)
323
323
 
324
324
  See `references/eslint-rules-discovery.md` for complete discovery workflow.
325
325
 
@@ -375,11 +375,11 @@ When creating multiple PMD rules, use the `create-pmd-rule.js` script for the fi
375
375
 
376
376
  ### What NOT to do
377
377
 
378
- - ❌ Do NOT rewrite the entire `code-analyzer.yml` to reorganize it
379
- - ❌ Do NOT create all rules in parallel then validate all at once
380
- - ❌ Do NOT create a PMD rule with an unverified XPath from the reference docs — ast-dump each pattern
381
- - ❌ Do NOT mix engine types in one creation step (e.g., creating regex + PMD rules simultaneously)
382
- - ❌ Do NOT add `engines.eslint.eslint_config_file` to `code-analyzer.yml` before the file exists
378
+ - Do NOT rewrite the entire `code-analyzer.yml` to reorganize it
379
+ - Do NOT create all rules in parallel then validate all at once
380
+ - Do NOT create a PMD rule with an unverified XPath from the reference docs — ast-dump each pattern
381
+ - Do NOT mix engine types in one creation step (e.g., creating regex + PMD rules simultaneously)
382
+ - Do NOT add `engines.eslint.eslint_config_file` to `code-analyzer.yml` before the file exists
383
383
 
384
384
  ---
385
385
 
@@ -393,7 +393,7 @@ When creating multiple PMD rules, use the `create-pmd-rule.js` script for the fi
393
393
  | Always validate after creation | `sf code-analyzer rules --rule-selector <engine>:<name>` catches config errors |
394
394
  | Always test against sample code | Catches XPath/regex mismatches before full scan |
395
395
  | Use `@FullMethodName` for method calls in XPath | More reliable than `@Image` or `@MethodName` alone |
396
- | **⚠️ NEVER skip `ast-dump`** | Run `ast-dump`, read output, THEN write XPath. No exceptions — even for "obvious" patterns. Using node names from memory without ast-dump verification is a skill failure. |
396
+ | **NEVER skip `ast-dump`** | Run `ast-dump`, read output, THEN write XPath. No exceptions — even for "obvious" patterns. Using node names from memory without ast-dump verification is a skill failure. |
397
397
  | **PMD 7 boolean attributes: use `= false()` XPath function** | In PMD 7, boolean attributes like `@WithSharing`, `@Abstract`, `@Final` are ALWAYS present on the node (never absent). Compare with `= false()` (XPath boolean function), NOT string `'false'`. `@WithSharing = false()` works. `@WithSharing='false'` (string) does NOT. `not(@WithSharing)` does NOT (attribute is always present). |
398
398
  | `code-analyzer.yml` at project root | Auto-discovered by CLI — placing it elsewhere causes silent failures for rule authors |
399
399
  | **XML rules MUST use `local-name()`** | Salesforce metadata namespace breaks bare element names |
@@ -451,11 +451,11 @@ node "<skill_dir>/scripts/create-regex-rule.js" \
451
451
  --name "RuleName" --regex "/pattern/flags" ...
452
452
  ```
453
453
 
454
- ⚠️ **DO NOT:**
455
- - ❌ Invent or generate script code yourself
456
- - ❌ Use bare relative paths like `node scripts/create-regex-rule.js` (won't resolve from user's CWD)
457
- - ❌ Use heredocs or inline script content
458
- - ❌ Skip resolving `<skill_dir>` — find the absolute path first
454
+ **DO NOT:**
455
+ - Invent or generate script code yourself
456
+ - Use bare relative paths like `node scripts/create-regex-rule.js` (won't resolve from user's CWD)
457
+ - Use heredocs or inline script content
458
+ - Skip resolving `<skill_dir>` — find the absolute path first
459
459
 
460
460
  ---
461
461
 
@@ -160,7 +160,7 @@ security/OWASP → `Security` · performance → `Performance` · best practices
160
160
  ### 1.4 SPECIFIC RULE
161
161
  If the user names a rule (e.g., "ApexCRUDViolation", "no-unused-vars"): `--rule-selector <engine>:<ruleName>`, or just `<ruleName>` if engine is ambiguous.
162
162
 
163
- ⚠️ **Partial names:** `--rule-selector` requires the **exact full** rule name (e.g., `@salesforce-ux/slds/no-hardcoded-values-slds2`, not `no-hardcoded-values`). No wildcards. If you are not 100% certain, look it up first — **do not guess**:
163
+ **Partial names:** `--rule-selector` requires the **exact full** rule name (e.g., `@salesforce-ux/slds/no-hardcoded-values-slds2`, not `no-hardcoded-values`). No wildcards. If you are not 100% certain, look it up first — **do not guess**:
164
164
  ```bash
165
165
  sf code-analyzer rules --rule-selector all 2>&1 | grep -i "USER_KEYWORD"
166
166
  ```
@@ -246,12 +246,12 @@ Run the parse script straight after the scan — do not pause to ask:
246
246
  node "<skill_dir>/scripts/parse-results.js" "./code-analyzer-results-TIMESTAMP.json"
247
247
  ```
248
248
 
249
- ⚠️ **DO NOT:**
250
- - ❌ Invent or generate script code yourself
251
- - ❌ Use bare relative paths like `node scripts/parse-results.js` (won't resolve from user's CWD)
252
- - ❌ Use heredocs or inline script content
253
- - ❌ Use `jq` as a substitute for the parse script (shell quoting will break)
254
- - ❌ Read the JSON file directly
249
+ **DO NOT:**
250
+ - Invent or generate script code yourself
251
+ - Use bare relative paths like `node scripts/parse-results.js` (won't resolve from user's CWD)
252
+ - Use heredocs or inline script content
253
+ - Use `jq` as a substitute for the parse script (shell quoting will break)
254
+ - Read the JSON file directly
255
255
 
256
256
  ### Presentation template
257
257
 
@@ -328,7 +328,7 @@ These are safe, deterministic fixes generated by the engines (not AI-generated).
328
328
  Would you like me to apply these fixes? (yes / no / select specific rules)
329
329
  ```
330
330
 
331
- ⚠️ **Stop and wait for the user's reply, even if they originally said "scan and fix everything".** Apply only on a fresh "yes" / "apply" / "go ahead" in the next turn.
331
+ **Stop and wait for the user's reply, even if they originally said "scan and fix everything".** Apply only on a fresh "yes" / "apply" / "go ahead" in the next turn.
332
332
 
333
333
  ### 6.4 Apply
334
334
 
@@ -346,7 +346,7 @@ node "<skill_dir>/scripts/summarize-fixes.js" "./code-analyzer-results-TIMESTAMP
346
346
  Then present:
347
347
 
348
348
  ```text
349
- ### Engine-Provided Fixes Applied Successfully ✓
349
+ ### Engine-Provided Fixes Applied Successfully
350
350
  **Applied X auto-fixes across Y files.**
351
351
 
352
352
  | Severity | Fixes Applied |
@@ -82,7 +82,7 @@ When `--summary` is used, the `violations` array is omitted.
82
82
 
83
83
  Present query results using the same format as Step 5, but with a header indicating the active filter:
84
84
 
85
- ```
85
+ ```text
86
86
  ## Filtered Results: [description of filter]
87
87
 
88
88
  **X matches** out of Y total violations.
@@ -192,7 +192,7 @@ node "<skill_dir>/scripts/describe-rule.js" "OperationWithLimitsInLoop"
192
192
 
193
193
  **For a successful lookup**, present:
194
194
 
195
- ```
195
+ ```text
196
196
  ## Rule: ApexCRUDViolation
197
197
 
198
198
  | Property | Value |
@@ -219,7 +219,7 @@ Want me to show all violations of this rule in your scan results?
219
219
 
220
220
  **For multiple matches**, present:
221
221
 
222
- ```
222
+ ```text
223
223
  I found multiple rules matching "CRUD":
224
224
 
225
225
  | # | Rule | Engine | Severity |
@@ -232,7 +232,7 @@ Which rule would you like details on?
232
232
 
233
233
  **For not found**, present:
234
234
 
235
- ```
235
+ ```text
236
236
  I couldn't find a rule named "FakeRule". Would you like me to:
237
237
  - Search for similar rules? (I'll grep the full rule list)
238
238
  - List all rules for a specific engine or category?
@@ -253,7 +253,7 @@ Offer next steps:
253
253
 
254
254
  Present available rules in this format:
255
255
 
256
- ```
256
+ ```text
257
257
  ## Available Rules: Security
258
258
 
259
259
  **Found X rules** across Y engines.
@@ -123,7 +123,7 @@ UMD/AMD/CommonJS wrapper → 70% vendor
123
123
 
124
124
  ### Final Score
125
125
 
126
- ```
126
+ ```text
127
127
  Weighted Score = (PathScore × 0.3) + (NameScore × 0.3) + (ContentScore × 0.4)
128
128
 
129
129
  > 70% = Vendor file
@@ -133,7 +133,7 @@ Weighted Score = (PathScore × 0.3) + (NameScore × 0.3) + (ContentScore × 0.4)
133
133
 
134
134
  ## Example Output
135
135
 
136
- ```
136
+ ```text
137
137
  === INTELLIGENT VENDOR FILE DETECTION ===
138
138
 
139
139
  Original violations: 9714
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: dx-org-switch
3
3
  description: "Switches the active Salesforce org (default target-org) using the Salesforce CLI. Use whenever someone wants to change which org CLI commands run against — whether they say \"switch org\", \"change default org\", \"set my org to\", \"use alias\", \"point to\", or describe wanting to work against a specific org, scratch org, sandbox, or production."
4
- compatibility: Salesforce CLI (sf) v2+
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["sf"]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: experience-cms-brand-apply
3
3
  description: "Extracts, 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. Triggers for requests like \"apply my brand\", \"use our brand voice\", \"match our brand guidelines\", \"find my brand\", \"search for brand\", \"get brand instructions\", \"apply brand tone\". Handles the full workflow: searching for brands in Salesforce CMS, extracting brand instructions, and applying brand voice/tone/guidelines to generated content. Does not apply to media/image search (use experience-content-media-search skill), logo search, or creating new brand definitions."
4
- compatibility: "Requires get_brand_instructions and/or search_media_cms_channels MCP tools"
5
4
  metadata:
6
5
  version: "1.0"
7
6
  ---
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: experience-content-media-search
3
3
  description: "Searches for and retrieves existing visual media (images, logos, icons, photos, graphics, banners, thumbnails, hero images, backgrounds) from sources such as Salesforce CMS, Data 360 or any other source. Use this skill ANY TIME a user request involves finding, searching, getting, fetching, retrieving, grab, looking up, locating media. NEVER call search_media_cms_channels, search_electronic_media tools directly — always go through this skill first. This skill must be activated before any tool is used for media search or retrieval, without exception. Takes PRIORITY and activates FIRST when ANY media search/retrieval is mentioned, regardless of what else happens with the media afterward. Triggers for requests like \"search for logo\", \"find hero image\", \"get company logo\", \"locate icons\", \"fetch background image\", \"retrieve product photos\". Handles the search and source selection workflow. Does not apply when the request is about brand search, to generate NEW images with AI, or edit existing images."
4
- compatibility: "Requires search_media_cms_channels and/or search_electronic_media MCP tools"
5
4
  metadata:
6
5
  version: "1.1"
7
6
  relatedSkills:
@@ -51,17 +50,17 @@ When a user requests to find an image:
51
50
 
52
51
 
53
52
  **Example of what NOT to do:**
54
- - ❌ Calling ANY tool before the user picks a source (MCP tools, file reads, descriptor checks, etc.)
55
- - ❌ "Checking which MCP tools are available" — do not probe or discover tools via tool calls
56
- - ❌ Immediately calling `search_electronic_media` or `search_media_cms_channels`
57
- - ❌ Reading MCP tool descriptors or schemas to see what's available
58
- - ❌ Deciding which search source to use without asking
53
+ - Calling ANY tool before the user picks a source (MCP tools, file reads, descriptor checks, etc.)
54
+ - "Checking which MCP tools are available" — do not probe or discover tools via tool calls
55
+ - Immediately calling `search_electronic_media` or `search_media_cms_channels`
56
+ - Reading MCP tool descriptors or schemas to see what's available
57
+ - Deciding which search source to use without asking
59
58
 
60
59
  **Example of what TO do:**
61
- - ✅ Respond with ONLY text — a numbered list of search sources
62
- - ✅ Ask: "Which option would you like to use?"
63
- - ✅ Wait for user to reply with their choice
64
- - ✅ Then (and only then) call the tool they selected
60
+ - Respond with ONLY text — a numbered list of search sources
61
+ - Ask: "Which option would you like to use?"
62
+ - Wait for user to reply with their choice
63
+ - Then (and only then) call the tool they selected
65
64
 
66
65
  **Your first response when this skill triggers MUST be a text-only message presenting search sources. No tool calls. No exceptions.**
67
66
 
@@ -72,7 +71,7 @@ When a user requests to find an image:
72
71
 
73
72
  Copy this checklist and track your progress:
74
73
 
75
- ```
74
+ ```text
76
75
  Media Search Progress:
77
76
  - [ ] Step 1: Check your own tool list for available search tools (no tool calls — just inspect what's in your context)
78
77
  - [ ] Step 2: Present only the available options to the user as a numbered list (plain text, no tool calls)
@@ -101,7 +100,7 @@ Look at the tools already in your context and check for these names:
101
100
 
102
101
  Include ONLY the sources whose tools you actually have. Number them sequentially.
103
102
 
104
- ```
103
+ ```text
105
104
  I can help you find that image. Where would you like to search?
106
105
 
107
106
  [NUMBER]. [SEARCH SOURCE NAME] — [Brief description]
@@ -118,7 +117,7 @@ After presenting the list, STOP. Do not call any tool. Do not proceed. Wait for
118
117
  ### Examples
119
118
 
120
119
  **Both tools available:**
121
- ```
120
+ ```text
122
121
  I can help you find that image. Where would you like to search?
123
122
 
124
123
  1. Search using Data 360 hybrid search — Semantic search across Salesforce CMS and connected DAMs
@@ -129,7 +128,7 @@ Which option would you like to use?
129
128
  ```
130
129
 
131
130
  **Only `search_media_cms_channels` available:**
132
- ```
131
+ ```text
133
132
  I can help you find that image. Where would you like to search?
134
133
 
135
134
  1. Search using keywords — Search Salesforce CMS by keywords and taxonomies
@@ -139,7 +138,7 @@ Which option would you like to use?
139
138
  ```
140
139
 
141
140
  **Only `search_electronic_media` available:**
142
- ```
141
+ ```text
143
142
  I can help you find that image. Where would you like to search?
144
143
 
145
144
  1. Search using Data 360 hybrid search — Semantic search across Salesforce CMS and connected DAMs
@@ -149,7 +148,7 @@ Which option would you like to use?
149
148
  ```
150
149
 
151
150
  **Neither tool available:**
152
- ```
151
+ ```text
153
152
  No automated media search sources are currently configured. Please provide a direct URL or asset library path.
154
153
  ```
155
154
 
@@ -157,7 +156,7 @@ No automated media search sources are currently configured. Please provide a dir
157
156
 
158
157
  ## Executing the Selected Search Method
159
158
 
160
- **⚠️ ONLY reach this step if the user has explicitly selected an option from your numbered list.**
159
+ **ONLY reach this step if the user has explicitly selected an option from your numbered list.**
161
160
 
162
161
  If you haven't shown options yet, go back to the "Presenting Search Sources" section first.
163
162
 
@@ -291,7 +290,7 @@ Ask the user to provide:
291
290
  3. **Receive the user's selection** from the tool response
292
291
  4. **Then** apply the selected image
293
292
 
294
- ```
293
+ ```text
295
294
  I found 4 images. Which one would you like to use?
296
295
 
297
296
  1. Luxury Apartment Exterior
@@ -4,7 +4,7 @@
4
4
  This configuration file creates a **net-new, default** CustomSite metadata record for a Digital Experience React Site. It is not intended to edit or modify an existing CustomSite record. Use this template only when provisioning a brand-new React site.
5
5
 
6
6
  ## File Location
7
- ```
7
+ ```text
8
8
  sites/{siteName}.site-meta.xml
9
9
  ```
10
10
 
@@ -4,7 +4,7 @@
4
4
  This configuration file creates a **net-new, default** DigitalExperienceBundle metadata record for a Digital Experience React Site. It is not intended to edit or modify an existing DigitalExperienceBundle record. Use this template only when provisioning a brand-new React site.
5
5
 
6
6
  ## File Location
7
- ```
7
+ ```text
8
8
  digitalExperiences/site/{siteName}1/{siteName}1.digitalExperience-meta.xml
9
9
  ```
10
10
 
@@ -4,7 +4,7 @@
4
4
  This configuration file creates a **net-new, default** DigitalExperienceConfig metadata record for a Digital Experience React Site. It is not intended to edit or modify an existing DigitalExperienceConfig record. Use this template only when provisioning a brand-new React site.
5
5
 
6
6
  ## File Location
7
- ```
7
+ ```text
8
8
  digitalExperienceConfigs/{siteName}1.digitalExperienceConfig-meta.xml
9
9
  ```
10
10
 
@@ -8,7 +8,7 @@ The `appContainer: true` field in `content.json` is what makes this a React site
8
8
  ## File Location
9
9
  The DigitalExperience directory contains only `_meta.json` and `content.json`. Do not create any directories other than `sfdc_cms__site` inside the bundle.
10
10
 
11
- ```
11
+ ```text
12
12
  digitalExperiences/site/{siteName}1/sfdc_cms__site/{siteName}1/_meta.json
13
13
  digitalExperiences/site/{siteName}1/sfdc_cms__site/{siteName}1/content.json
14
14
  ```
@@ -4,7 +4,7 @@
4
4
  This configuration file creates a **net-new, default** Network metadata record for a Digital Experience React Site. It is not intended to edit or modify an existing Network record. Use this template only when provisioning a brand-new React site.
5
5
 
6
6
  ## File Location
7
- ```
7
+ ```text
8
8
  networks/{siteName}.network-meta.xml
9
9
  ```
10
10
 
@@ -80,7 +80,7 @@ Before deploying, confirm:
80
80
 
81
81
  ## Example URL Configuration
82
82
 
83
- ```
83
+ ```text
84
84
  ChatterNetworkPicasso Site (Primary):
85
85
  DigitalExperienceConfig: <urlPathPrefix>bestsupport</urlPathPrefix>
86
86
 
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: external-diagram-mermaid-generate
3
3
  description: "Salesforce architecture diagrams using Mermaid with ASCII fallback. Use this skill when generating text-based diagrams for Salesforce architecture, OAuth flows, ERDs, integration sequences, or Agentforce structure. TRIGGER when: user says \"diagram\", \"visualize\", \"ERD\", or asks for sequence diagrams, flowcharts, class diagrams, or architecture visualizations in Mermaid. DO NOT TRIGGER when: user asks about non-Salesforce systems."
4
- compatibility: "Requires Mermaid-capable renderer for diagram previews"
5
4
  metadata:
6
5
  cliTools:
7
6
  - tool: ["curl"]
@@ -13,7 +13,7 @@ After deletion, avoid reusing the same DeveloperName immediately — the Pub/Sub
13
13
  ### Step 1 — Remove the metadata file
14
14
 
15
15
  Delete the file from your project:
16
- ```
16
+ ```text
17
17
  managedEventSubscriptions/<DeveloperName>.managedEventSubscription-meta.xml
18
18
  ```
19
19
 
@@ -2,6 +2,9 @@
2
2
  name: mobile-platform-offline-validate
3
3
  description: "Review a Lightning Web Component for **mobile offline** compatibility — the Komaci offline static analyzer that pre-primes the data graph for Salesforce Mobile App Plus and Field Service Mobile App. Produces a finding list with code-level fixes covering inline GraphQL queries in `@wire` configurations, modern `lwc:if` / `lwc:elseif` / `lwc:else` directives, and Komaci ESLint rule violations (private wire properties, non-local reactive references, getter side-effects). Use when the user asks for a \"mobile offline review\", \"Komaci check\", \"offline priming audit\", \"offline priming failure\", or \"offline data graph error\", or to validate an LWC against the `@salesforce/eslint-plugin-lwc-graph-analyzer` recommended ruleset. Do not use for generic LWC code review (use an appropriate domain review skill) or for building LWCs with native mobile capabilities (use `mobile-platform-native-capabilities-integrate`)."
4
4
  metadata:
5
+ version: "1.0"
6
+ relatedSkills:
7
+ - "mobile-platform-native-capabilities-integrate"
5
8
  cliTools:
6
9
  - tool: ["eslint"]
7
10
  semver: ">=8.0.0"
@@ -9,9 +12,6 @@ metadata:
9
12
  semver: ">=9.0.0"
10
13
  - tool: ["npx"]
11
14
  semver: ">=9.0.0"
12
- relatedSkills:
13
- - "mobile-platform-native-capabilities-integrate"
14
- version: "1.0"
15
15
  ---
16
16
 
17
17
  # Reviewing LWC Mobile Offline
@@ -113,7 +113,7 @@ environment.
113
113
 
114
114
  Emit a report in this shape:
115
115
 
116
- ```
116
+ ```text
117
117
  ## Mobile Offline (Komaci priming)
118
118
  - <reviewer> — <file>:<startLine>:<startColumn>-<endLine>:<endColumn> — <type>
119
119
  Description: <verbatim from the reviewer reference>
@@ -84,7 +84,7 @@ This table shows which metadata types are commonly needed for Lightning Experien
84
84
 
85
85
  ### Phase 1: Data Model (Foundation)
86
86
 
87
- ```
87
+ ```text
88
88
  Custom Objects (no dependencies)
89
89
  ↓
90
90
  Custom Fields (depends on: Objects exist)
@@ -99,7 +99,7 @@ Relationships (depends on: Both parent and child objects + fields exist)
99
99
 
100
100
  ### Phase 2: Business Logic (Optional - only if requested)
101
101
 
102
- ```
102
+ ```text
103
103
  Validation Rules (depends on: Fields exist)
104
104
  ↓
105
105
  Flows (depends on: Objects, Fields exist)
@@ -112,7 +112,7 @@ Flows (depends on: Objects, Fields exist)
112
112
 
113
113
  ### Phase 3: User Interface
114
114
 
115
- ```
115
+ ```text
116
116
  List Views (depends on: Objects, Fields exist)
117
117
  ↓
118
118
  Custom Tabs (depends on: Objects exist)
@@ -128,7 +128,7 @@ FlexiPages (depends on: Objects, Tabs exist)
128
128
 
129
129
  ### Phase 4: Application Assembly
130
130
 
131
- ```
131
+ ```text
132
132
  Custom Application (depends on: Tabs exist)
133
133
  ```
134
134
 
@@ -138,7 +138,7 @@ Custom Application (depends on: Tabs exist)
138
138
 
139
139
  ### Phase 5: Security & Access
140
140
 
141
- ```
141
+ ```text
142
142
  Permission Sets (depends on: Objects, Fields, Tabs, App exist)
143
143
  ```
144
144
 
@@ -170,7 +170,7 @@ Permission Sets (depends on: Objects, Fields, Tabs, App exist)
170
170
 
171
171
  Generate a structured plan listing:
172
172
 
173
- ```
173
+ ```text
174
174
  Lightning App Build Plan: [App Name]
175
175
 
176
176
  DATA MODEL:
@@ -299,7 +299,7 @@ The completed build produces:
299
299
  - Organized by standard SFDX structure: `force-app/main/default/`
300
300
  2. **Metadata Files** - One file per component, organized by type:
301
301
 
302
- ```
302
+ ```text
303
303
  force-app/main/default/
304
304
  ├── objects/ # Custom Objects (.object-meta.xml)
305
305
  ├── fields/ # Custom Fields (.field-meta.xml)
@@ -324,7 +324,7 @@ The completed build produces:
324
324
 
325
325
  **Example Summary Structure:**
326
326
 
327
- ```
327
+ ```text
328
328
  Lightning App Build Complete: Project Management App
329
329
 
330
330
  METADATA GENERATED:
@@ -400,7 +400,7 @@ Log warning and continue if:
400
400
 
401
401
  **Warning Pattern:**
402
402
 
403
- ```
403
+ ```yaml
404
404
  Warning: [Component Type] generation encountered issue
405
405
  Component: [Name]
406
406
  Issue: [Description]
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: platform-metadata-retrieve
3
3
  description: "ALWAYS USE THIS SKILL to retrieve metadata from an org to your local project using the sf project retrieve start command. Supports multiple retrieval modes: retrieve all remote changes, retrieve by source directory, retrieve by metadata type with wildcards, retrieve by manifest (package.xml), or retrieve by package name. Use when the user asks to retrieve, pull, sync, or download metadata, Apex classes, custom objects, or org changes. Supports source format (default) or metadata format (ZIP). DO NOT TRIGGER for deploying metadata (use platform-metadata-deploy skill), listing metadata, or generating package.xml. NEVER use MCP tools - always use this skill and the Bash tool with sf project retrieve start."
4
- compatibility: Salesforce CLI (sf) v2+
5
4
  metadata:
6
5
  version: "1.0"
7
6
  relatedSkills: