@salesforce/afv-skills 1.56.0 → 1.58.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.
- package/package.json +1 -1
- package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +1 -1
- package/skills/commerce-b2b-open-code-components-replace/SKILL.md +16 -16
- package/skills/dx-devops-project-manage/SKILL.md +1 -1
- package/skills/experience-cms-content-generate/SKILL.md +1 -1
- package/skills/experience-cms-content-render/SKILL.md +3 -3
- package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +35 -7
- package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +13 -4
- package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +30 -8
- package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +14 -4
- package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +11 -1
- package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +1 -1
- package/skills/experience-cms-content-render/assets/shared/mediaLabels.ts +62 -0
- package/skills/experience-cms-content-render/references/init-scaffold.md +13 -6
- package/skills/experience-content-media-stock-image-search/SKILL.md +0 -1
- package/skills/experience-lwc-design-generate/SKILL.md +1 -1
- package/skills/experience-lwc-legacy-migrate/SKILL.md +212 -0
- package/skills/experience-lwc-legacy-migrate/assets/lo20-host-page-template.html +192 -0
- package/skills/experience-lwc-legacy-migrate/references/aura-to-lwc-completeness-checklist.md +188 -0
- package/skills/experience-lwc-legacy-migrate/references/lightning-out-2-system-reference.md +495 -0
- package/skills/experience-lwc-legacy-migrate/references/lightning-out-beta-to-2-migration.md +824 -0
- package/skills/experience-lwc-legacy-migrate/scripts/convert-lo-names.py +94 -0
- package/skills/experience-lwc-legacy-migrate/scripts/validate-lo20-page.py +133 -0
- package/skills/experience-ui-bundle-project-generate/SKILL.md +14 -40
- package/skills/experience-ui-bundle-project-generate/scripts/flatten-project.mjs +33 -11
- package/skills/experience-ui-bundle-project-generate/scripts/generate-project.mjs +77 -0
- package/skills/experience-ui-bundle-project-generate/scripts/install-deps.mjs +95 -0
- package/skills/integration-connectivity-connected-app-configure/SKILL.md +5 -5
- package/skills/integration-connectivity-generate/SKILL.md +10 -10
- package/skills/integration-connectivity-generate/scripts/configure-named-credential.sh +2 -2
- package/skills/platform-apex-test-generate/SKILL.md +1 -1
- package/skills/platform-apex-test-run/SKILL.md +1 -1
- package/skills/platform-custom-field-generate/SKILL.md +1 -1
- package/skills/platform-custom-lightning-type-generate/SKILL.md +1 -1
- package/skills/platform-custom-metadata-type-generate/SKILL.md +1 -1
- package/skills/platform-custom-object-generate/SKILL.md +1 -1
- package/skills/platform-custom-report-type-generate/SKILL.md +1 -1
- package/skills/platform-custom-setting-generate/SKILL.md +1 -1
- package/skills/platform-data-and-tooling-api-context-get/SKILL.md +1 -1
- package/skills/platform-data-manage/SKILL.md +10 -10
- package/skills/platform-flexipage-generate/SKILL.md +1 -1
- package/skills/platform-lightning-app-coordinate/SKILL.md +1 -1
- package/skills/platform-metadata-api-context-get/SKILL.md +1 -1
- package/skills/platform-metadata-retrieve/SKILL.md +1 -1
- package/skills/platform-permission-set-generate/SKILL.md +1 -1
- package/skills/platform-report-generate/SKILL.md +1 -1
- package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +4 -4
- package/skills/platform-sharing-owd-configure/SKILL.md +1 -1
- package/skills/platform-sharing-rules-generate/SKILL.md +1 -1
- package/skills/platform-soql-query/SKILL.md +1 -1
- package/skills/platform-value-set-generate/SKILL.md +1 -1
- package/skills/service-agentforce-human-escalation-configure/SKILL.md +4 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +26 -6
- package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +5 -4
- package/skills/service-de-waba-integrate/SKILL.md +2 -1
- package/skills/service-digital-engagement-deployment-configure/SKILL.md +2 -0
- package/skills/service-digital-engagement-deployment-configure/scripts/check-api-version.sh +29 -0
- package/skills/service-email-to-case-configure/SKILL.md +1 -1
- package/skills/service-omni-channel-setup-coordinate/SKILL.md +1 -0
- package/skills/service-omni-command-center-analyze/SKILL.md +1 -0
- package/skills/service-omni-command-center-configure/SKILL.md +92 -0
- package/skills/service-omni-command-center-configure/references/api-notes.md +50 -0
- package/skills/service-omni-command-center-configure/scripts/configure-and-report.sh +257 -0
- package/skills/service-omni-command-center-configure/scripts/settings_document.py +97 -0
- package/skills/service-omni-command-center-configure/scripts/tests/test_command_center_configure_contracts.py +206 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-apex-test-generate
|
|
3
|
-
description: "
|
|
3
|
+
description: "Use to generate and validate Apex test classes with TestDataFactory patterns, bulk testing (251+ records), mocking, assertions, and disciplined test-fix loops. Use when creating Apex test classes (for triggers, services, controllers, batch jobs, queueables, and callouts), improving coverage, debugging or fixing failing Apex tests, or running test/coverage analysis. Triggers on *Test.cls files, sf apex run test, coverage reports. Do NOT trigger for production Apex (use platform-apex-generate) or Jest/LWC tests."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.1"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-apex-test-run
|
|
3
|
-
description: "Apex test execution, coverage analysis, and test-fix loops with 120-point scoring. Use when the user
|
|
3
|
+
description: "Apex test execution, coverage analysis, and test-fix loops with 120-point scoring. Use when the user runs Apex tests, checks code coverage, fixes failing tests, or touches *Test.cls / *_Test.cls files. DO NOT TRIGGER when writing Apex production code (use platform-apex-generate), Agentforce agent testing (use agentforce-test), or Jest/LWC tests (use experience-lwc-generate)."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.2"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-custom-field-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use when users create, generate, or validate Salesforce Custom Field metadata. Trigger on custom fields, field types, Roll-Up Summary, Master-Detail/Lookup relationships, formula fields, picklists, dependent (controlling) picklists, referencing a value set from a field, or scoping picklist values per record type; also field deployment errors, including a record type that won't deploy without a business process. DO NOT TRIGGER for creating/customizing the value set itself — a new GlobalValueSet or a StandardValueSet catalog like Industry — use platform-value-set-generate; this skill covers the field that references a value set, not the value set definition."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -178,4 +178,4 @@ When you need the full list of supported primitive `lightning:type` identifiers,
|
|
|
178
178
|
- [ ] Layout configurations use `lightning/propertyLayout` with ONLY the `property` attribute (no `label`, `title`, or other attributes)
|
|
179
179
|
- [ ] All attribute mappings (`{!$attrs.propertyName}`) reference properties that exist in the type schema
|
|
180
180
|
- [ ] Custom LWC components have correct targets in `-meta.xml`: `lightning__AgentforceInput` for editors, `lightning__AgentforceOutput` for renderers
|
|
181
|
-
- [ ] Root schema does NOT include `"$schema"` field
|
|
181
|
+
- [ ] Root schema does NOT include `"$schema"` field
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-custom-metadata-type-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use to create, generate, or validate Salesforce Custom Metadata Type metadata — the __mdt object, fields, and deployable records. Trigger on custom metadata types, CMDT, __mdt objects, .md-meta.xml files, or cross-org reference/config data; also admin-maintained mapping/lookup/crosswalk tables (config that changes without a deploy belongs in a CMDT, never hardcoded in Apex/Flow), and CMDT deploy errors. DO NOT TRIGGER for Custom Settings (use platform-custom-setting-generate), business-record objects (use platform-custom-object-generate), or secrets/API keys (use a Named Credential)."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
minApiVersion: "60.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-custom-object-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use when users create, generate, or validate Salesforce Custom Object metadata. Trigger on custom objects, .object files, sharing models, name fields, or validation rules — e.g. \"create a custom object\" — and deployment errors around sharing models and Master-Detail relationships. Also keep the object's <description> current when its fields or validation rules change. Do NOT use for non-Custom-Object metadata (Apex, Flows, LWC, Permission Sets, Custom Metadata Types) or standard objects."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.1"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-custom-report-type-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use to create, generate, or validate Salesforce Custom Report Type metadata. Trigger on custom report types, CRTs, cross-object reports, report builder data sources, exposing fields for reporting across related objects, inner vs outer joins in reports, report type categories, or deployment errors for .reportType-meta.xml files. Do NOT trigger for running, editing, or filtering existing reports; creating report folders, dashboards, or list views; or non-authoring reporting questions."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-custom-setting-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use to create, generate, or validate Salesforce Custom Setting metadata. Trigger on custom settings (hierarchy/list), customSettingsType, SetupOwnerId, per-profile/per-user config overrides, feature flags/toggles, kill switches, or admin on/off switches (e.g. bypass triggers during a data load); also \"create a custom setting\" or a setting that silently deployed as a regular object. A kill switch is just a checkbox on a hierarchy setting — generate ONLY the setting, never an Apex trigger/handler. DO NOT TRIGGER for Custom Metadata Types (use platform-custom-metadata-type-generate), business-record objects (use platform-custom-object-generate), or secrets/tokens (use a Named Credential)."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
minApiVersion: "60.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-data-and-tooling-api-context-get
|
|
3
|
-
description: "Authoritative field/schema reference for 2130 STANDARD Salesforce objects —
|
|
3
|
+
description: "Authoritative field/schema reference for 2130 STANDARD Salesforce objects — sObject and Tooling field API names, types, properties (filterable/sortable/groupable/updateable), and relationships for Account, Contact, Opportunity, Lead, Case, ApexClass, and more. Load alongside a SOQL/Apex skill when fields/types/capabilities are unverified — not for query syntax or optimization alone. TRIGGER when verifying/debugging fields in a SOQL/SOSL query or DML against a standard object. Custom __c objects/fields are NOT covered — describe the live org (sf sobject describe). DO NOT TRIGGER for authoring/deploying *-meta.xml or sfdx source (use the Metadata API skill)."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-data-manage
|
|
3
|
-
description: "Salesforce data operations with 130-point scoring. Use
|
|
3
|
+
description: "Salesforce data operations with 130-point scoring. Use to create, update, delete, bulk import/export, generate test data, and clean up org records via sf CLI and anonymous Apex. TRIGGER on creating test data, bulk import/export, sf data CLI commands, data-factory patterns for Apex tests, or seeding/cleaning org records. DO NOT TRIGGER for SOQL query writing only (use platform-soql-query), Apex test execution (use platform-apex-test-run), or metadata deployment (use platform-metadata-deploy)."
|
|
4
4
|
metadata:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
semver: ">=1.6.0"
|
|
8
|
-
- tool: ["python3"]
|
|
9
|
-
semver: ">=3.8.0"
|
|
10
|
-
- tool: ["sf"]
|
|
11
|
-
semver: ">=2.0.0"
|
|
5
|
+
version: "1.1"
|
|
6
|
+
domains: ["Platform"]
|
|
12
7
|
relatedSkills:
|
|
13
8
|
- "automation-flow-generate"
|
|
14
9
|
- "platform-apex-generate"
|
|
@@ -17,8 +12,13 @@ metadata:
|
|
|
17
12
|
- "platform-custom-object-generate"
|
|
18
13
|
- "platform-metadata-deploy"
|
|
19
14
|
- "platform-soql-query"
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
cliTools:
|
|
16
|
+
- tool: ["sf"]
|
|
17
|
+
semver: ">=2.0.0"
|
|
18
|
+
- tool: ["jq"]
|
|
19
|
+
semver: ">=1.6.0"
|
|
20
|
+
- tool: ["python3"]
|
|
21
|
+
semver: ">=3.8.0"
|
|
22
22
|
---
|
|
23
23
|
|
|
24
24
|
# Salesforce Data Operations Expert (platform-data-manage)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-flexipage-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use when users create, generate, modify, or validate Salesforce Lightning pages (FlexiPages). Trigger on RecordPage, AppPage, HomePage, Lightning pages, adding components to a page, page customization (e.g. 'customize the record page'), or .flexipage-meta.xml files (regions, components, deployment errors). DO NOT TRIGGER for Visualforce pages, page layout assignments in the UI, UI Bundle/Experience Cloud site pages, or Aura/Lightning Web Component development without FlexiPage context."
|
|
4
4
|
allowed-tools: Bash Read Write
|
|
5
5
|
metadata:
|
|
6
6
|
version: "1.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-metadata-api-context-get
|
|
3
|
-
description: "REQUIRED companion for Salesforce metadata generation — load this schema/API-context skill in the SAME turn as ANY metadata
|
|
3
|
+
description: "REQUIRED companion for Salesforce metadata generation — load this schema/API-context skill in the SAME turn as ANY metadata generator (if you load a generator, you ALSO load this). Use whenever you create, generate, edit, or author metadata or a *-meta.xml file (custom object, field, flow, and 604 Metadata API types): it gives authoritative schema, required flags, and XML structure so files deploy cleanly. Trigger on *-meta.xml, metadata schema, api context. DO NOT use for SOQL, DML, runtime sObject access, or Tooling API records."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-metadata-retrieve
|
|
3
|
-
description: "ALWAYS USE THIS SKILL to retrieve metadata from an org to your local project
|
|
3
|
+
description: "ALWAYS USE THIS SKILL to retrieve metadata from an org to your local project with sf project retrieve start. Supports retrieval by all changes, source directory, metadata type (wildcards), manifest (package.xml), or package name, in source or metadata (ZIP) format. Use when the user asks to retrieve, pull, sync, or download metadata, Apex classes, or custom objects. DO NOT TRIGGER for deploying metadata (use platform-metadata-deploy), listing metadata, or generating a package.xml (use platform-manifest-generate). NEVER use MCP tools."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
domains: ["Platform", "Developer Experience"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-report-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use when users create, generate, or validate Salesforce Lightning Report metadata (.report-meta.xml) — tabular, summary, matrix, or joined reports with columns, groupings, filters, charts, cross-filters, buckets, formulas, or time-frame filters. Triggers on \"create a report\", \"build a report\", \"add a chart\", or .report-meta.xml deploy errors. Do NOT trigger for Custom Report Type metadata (use platform-custom-report-type-generate), dashboards, list views, running reports in the UI, or SOQL."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-salesforce-connect-adapter-generate
|
|
3
|
-
description: "Custom Apex adapter generation for Salesforce Connect — connects any external REST API to Salesforce as live, queryable External Objects without ETL or
|
|
3
|
+
description: "Custom Apex adapter generation for Salesforce Connect — connects any external REST API to Salesforce as live, queryable External Objects without ETL or copying. TRIGGER when: connecting a non-standard external API, writing a DataSource.Provider/Connection or a `.cls`/`.cls-meta.xml` custom adapter class, adding a `.namedCredential-meta.xml` for the adapter's callout, surfacing external data as records, \"custom adapter\", \"ExternalId field\", \"DataSource namespace\", or whether custom Apex fits. DO NOT TRIGGER when: a standard adapter is already configured (OData, Snowflake), for copy/bulk-sync (use platform-data-manage), or for Apex callouts outside Connect (use platform-apex-generate or integration-connectivity-generate)."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
minApiVersion: "66.0"
|
|
@@ -26,7 +26,7 @@ Route the user through building a complete custom Salesforce Connect Apex adapte
|
|
|
26
26
|
|
|
27
27
|
**In scope:** Generating `DataSource.Connection` and `DataSource.Provider` Apex classes, Named Credential metadata, deployment via sf CLI, and step-by-step Setup registration guidance for any REST API.
|
|
28
28
|
|
|
29
|
-
**Out of scope:** Configuring standard adapters (OData, Snowflake, GraphQL — those have their own flows). Generating the External Data Source metadata file (not deployable via sf CLI — must be registered manually in Setup). Writing Apex that calls external APIs outside the Salesforce Connect framework (use
|
|
29
|
+
**Out of scope:** Configuring standard adapters (OData, Snowflake, GraphQL — those have their own flows). Generating the External Data Source metadata file (not deployable via sf CLI — must be registered manually in Setup). Writing Apex that calls external APIs outside the Salesforce Connect framework (use the platform-apex-generate or integration-connectivity-generate skills).
|
|
30
30
|
|
|
31
31
|
## Before starting
|
|
32
32
|
|
|
@@ -37,11 +37,11 @@ Confirm two things. If either is missing, ask before proceeding.
|
|
|
37
37
|
| The user wants to… | Right tool |
|
|
38
38
|
|---|---|
|
|
39
39
|
| Query external data live without copying it — read-only or read-write, appears as Salesforce records | **This skill** |
|
|
40
|
-
| Copy or sync data into Salesforce on a schedule |
|
|
40
|
+
| Copy or sync data into Salesforce on a schedule | the platform-data-manage skill |
|
|
41
41
|
| Connect to OData, GraphQL, DynamoDB, Athena, or Cross-Org | Standard adapter setup — no Apex needed, different flow |
|
|
42
42
|
| Connect to Snowflake via Salesforce's native Snowflake adapter (direct Snowflake protocol) | Built-in Snowflake adapter — no Apex needed |
|
|
43
43
|
| Access Snowflake (or any database) data via a REST or HTTP API | **This skill** — Snowflake REST endpoint → custom Apex adapter |
|
|
44
|
-
| Call an external API from Apex or Flow logic |
|
|
44
|
+
| Call an external API from Apex or Flow logic | the platform-apex-generate skill or [integration-connectivity-generate](../integration-connectivity-generate/SKILL.md) |
|
|
45
45
|
| Expose Salesforce data to an external system | [integration-connectivity-generate](../integration-connectivity-generate/SKILL.md) |
|
|
46
46
|
| Receive real-time pushed data or subscribe to external events | Not Salesforce Connect — Connect is pull-only. Use Platform Events or Change Data Capture instead |
|
|
47
47
|
| Sync or copy data for analytics or bulk processing | Data Cloud or ETL — Connect is zero-copy virtualization only |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-sharing-owd-configure
|
|
3
|
-
description: "Use when the user wants to retrieve or update Organization-Wide Default (OWD) sharing settings for Salesforce objects. TRIGGER
|
|
3
|
+
description: "Use when the user wants to retrieve or update Organization-Wide Default (OWD) sharing settings for Salesforce objects. TRIGGER on org-wide defaults, checking/viewing sharing defaults, changing default access levels (Private, Public Read Only, Public Read/Write, Controlled by Parent), internal/external access for standard or custom objects, making records private, or sharingModel in .object-meta.xml files. DO NOT TRIGGER for sharing rules, criteria-based sharing, role hierarchy, or manual sharing — delegate to platform-sharing-rules-generate."
|
|
4
4
|
metadata:
|
|
5
5
|
relatedSkills:
|
|
6
6
|
- "platform-metadata-deploy"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-sharing-rules-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use when users get, create, edit, delete, or retrieve Salesforce Sharing Rules metadata for record-level access. TRIGGER on sharing rules, record/criteria-based/role-based/guest-user sharing, sharingCriteriaRules/sharingOwnerRules/sharingGuestRules, .sharingRules-meta.xml files, or sharing records with roles or groups, including viewing or modifying existing rules. DO NOT TRIGGER for permission sets/profiles or object-level (not record-level) security (use platform-permission-set-generate)."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.3"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-soql-query
|
|
3
|
-
description: "
|
|
3
|
+
description: "Use when the user needs SOQL/SOSL authoring or optimization: natural-language-to-query generation, relationship queries, aggregates, query-plan/selectivity analysis, and performance or safety improvements. TRIGGER when the user writes, optimizes, or debugs SOQL/SOSL, touches .soql files, or asks about relationship queries, aggregates, or query performance. DO NOT TRIGGER for bulk data operations (use platform-data-manage), Apex DML logic (use platform-apex-generate), or report/dashboard queries."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.1"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-value-set-generate
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use to create, generate, or validate a Salesforce GlobalValueSet (reusable picklist shared across fields) or customize a StandardValueSet (built-in picklists like Industry, Lead Source, Opportunity Stage). Trigger on global/standard value set, reusable picklist, .globalValueSet-meta.xml or .standardValueSet-meta.xml, or deploy errors adding values to a standard picklist. DO NOT TRIGGER for a one-off inline picklist on a single field with no reuse — use platform-custom-field-generate."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
domains: ["Platform"]
|
|
@@ -196,6 +196,10 @@ A single JSON object to stdout:
|
|
|
196
196
|
|
|
197
197
|
Existing queue, `QueueSobject`, `QueueRoutingConfig`, queue members, and an already-active outbound flow are reused, not recreated (members are only added when the queue has zero active members and `QUEUE_MEMBER_USERNAMES` is supplied; already-present members are left untouched). The doc-driven edits (`canEscalate`, `outboundRouteConfigs`) are set-if-absent. A second run against a fully configured org performs no writes and returns `CONFIGURED`.
|
|
198
198
|
|
|
199
|
+
## Classifier contracts
|
|
200
|
+
|
|
201
|
+
Before investigating or changing any of the deterministic Node classifiers referenced above (`scripts/classify-agent-active.mjs`, `scripts/verify-escalation-config.mjs`, `scripts/extract-outbound-route.mjs`, `scripts/classify-nga-escalation.mjs`), read [references/classifier-contracts.md](references/classifier-contracts.md) for each one's exact input/output contract.
|
|
202
|
+
|
|
199
203
|
## Verification
|
|
200
204
|
|
|
201
205
|
Run the bundled escalation contract tests after changing this skill or its scripts:
|
|
@@ -6,12 +6,30 @@ import subprocess
|
|
|
6
6
|
import tempfile
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
-
# skills/ root is three levels up (.../<skill>/scripts/tests/_bootstrap.py).
|
|
9
|
+
# skills/ root is three levels up (.../<skill>/scripts/tests/_bootstrap.py). In the flat copy
|
|
10
|
+
# this is the repo's skills/ directory; in a plugin mirror it is that plugin's own bundled
|
|
11
|
+
# skills/ directory, which only contains its own roster.
|
|
10
12
|
SKILLS_ROOT = Path(__file__).resolve().parents[3]
|
|
11
13
|
|
|
14
|
+
|
|
15
|
+
def _find_flat_skills_root(start: Path) -> Path:
|
|
16
|
+
"""Walk up from this file to the repo's flat skills/ root, which bundles every skill
|
|
17
|
+
exactly once. Cross-skill references that aren't part of this skill's own plugin roster
|
|
18
|
+
(like the ITSM coordinator's verdict script below) must resolve here, not under
|
|
19
|
+
SKILLS_ROOT, since a plugin mirror's SKILLS_ROOT only contains its own bundled skills."""
|
|
20
|
+
for parent in start.parents:
|
|
21
|
+
candidate = parent / "skills" / "service-itsm-agentic-setup-agentforce-coordinate"
|
|
22
|
+
if candidate.is_dir():
|
|
23
|
+
return parent / "skills"
|
|
24
|
+
raise RuntimeError("could not locate the repo's flat skills/ root")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
FLAT_SKILLS_ROOT = _find_flat_skills_root(Path(__file__).resolve())
|
|
28
|
+
|
|
12
29
|
SKILL_DIR = "service-agentforce-human-escalation-configure"
|
|
13
30
|
SCRIPT = f"{SKILL_DIR}/scripts/verify-and-configure.sh"
|
|
14
|
-
# The ITSM coordinator's advancement gate - exercised for the escalation verdict mapping.
|
|
31
|
+
# The ITSM coordinator's advancement gate - exercised for the escalation verdict mapping. Not
|
|
32
|
+
# bundled per-plugin, so resolved against FLAT_SKILLS_ROOT (see run_node's root parameter).
|
|
15
33
|
VERDICT_SCRIPT = "service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs"
|
|
16
34
|
|
|
17
35
|
# A fake `sf` that reports a PRODUCTION customer org so the safe_to_write guard must refuse.
|
|
@@ -220,11 +238,13 @@ def run(args, path_prefix=None, scrub_sf=False, extra_env=None):
|
|
|
220
238
|
return proc.returncode, (proc.stdout or "") + (proc.stderr or "")
|
|
221
239
|
|
|
222
240
|
|
|
223
|
-
def run_node(script_rel, args):
|
|
224
|
-
"""Run a bundled Node helper; return (returncode, stdout).
|
|
241
|
+
def run_node(script_rel, args, root=None):
|
|
242
|
+
"""Run a bundled Node helper; return (returncode, stdout). Pass `root=FLAT_SKILLS_ROOT`
|
|
243
|
+
for cross-skill scripts not bundled in this skill's own plugin roster."""
|
|
244
|
+
base = root if root is not None else SKILLS_ROOT
|
|
225
245
|
proc = subprocess.run(
|
|
226
|
-
["node", str(
|
|
227
|
-
capture_output=True, text=True, cwd=str(
|
|
246
|
+
["node", str(base / script_rel), *args],
|
|
247
|
+
capture_output=True, text=True, cwd=str(base),
|
|
228
248
|
)
|
|
229
249
|
return proc.returncode, (proc.stdout or "")
|
|
230
250
|
|
|
@@ -17,6 +17,7 @@ from pathlib import Path
|
|
|
17
17
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
18
18
|
from _bootstrap import ( # noqa: E402
|
|
19
19
|
SKILLS_ROOT,
|
|
20
|
+
FLAT_SKILLS_ROOT,
|
|
20
21
|
SKILL_DIR,
|
|
21
22
|
SCRIPT,
|
|
22
23
|
VERDICT_SCRIPT,
|
|
@@ -700,13 +701,13 @@ class NgaClassifierHardeningTests(unittest.TestCase):
|
|
|
700
701
|
|
|
701
702
|
class CoordinatorGateTests(unittest.TestCase):
|
|
702
703
|
def test_escalation_verdict_mapping(self):
|
|
703
|
-
rc, out = run_node(VERDICT_SCRIPT, ["escalation", "CONFIGURED"])
|
|
704
|
+
rc, out = run_node(VERDICT_SCRIPT, ["escalation", "CONFIGURED"], root=FLAT_SKILLS_ROOT)
|
|
704
705
|
self.assertEqual(rc, 0, out)
|
|
705
|
-
rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "ALREADY-CONFIGURED"])
|
|
706
|
+
rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "ALREADY-CONFIGURED"], root=FLAT_SKILLS_ROOT)
|
|
706
707
|
self.assertEqual(rc, 0)
|
|
707
|
-
rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "INCOMPLETE"])
|
|
708
|
+
rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "INCOMPLETE"], root=FLAT_SKILLS_ROOT)
|
|
708
709
|
self.assertEqual(rc, 1)
|
|
709
|
-
rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "BLOCKED"])
|
|
710
|
+
rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "BLOCKED"], root=FLAT_SKILLS_ROOT)
|
|
710
711
|
self.assertEqual(rc, 1)
|
|
711
712
|
|
|
712
713
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: service-de-waba-integrate
|
|
3
|
-
description: "Confirm the customer's WhatsApp Business Account is shared with Salesforce on Meta's side. Pure instruction + one user-confirmation prompt — no API calls, no token handling.
|
|
3
|
+
description: "Confirm the customer's WhatsApp Business Account is shared with Salesforce on Meta's side. TRIGGER when the user asks to link, share, or confirm sharing of a WhatsApp Business Account with Salesforce, or to verify Salesforce appears in the WABA's Partners list. Pure instruction + one user-confirmation prompt — no API calls, no token handling. Sharing happens in Meta Business Suite (UI-only; Meta has no Graph endpoint for this). Renders step-by-step instructions with Salesforce's Business Manager ID substituted in, then asks the user to confirm whether \"Salesforce\" appears in the WABA's Partners list. DO NOT TRIGGER when the user needs full end-to-end WhatsApp setup (use `service-de-headless-channel-configure`) or to insert the channel record itself (use `service-de-channel-create`)."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.0"
|
|
6
6
|
minApiVersion: "67.0"
|
|
7
7
|
domains: ["Service"]
|
|
8
8
|
relatedSkills:
|
|
9
9
|
- "service-de-channel-create"
|
|
10
|
+
- "service-de-headless-channel-configure"
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
# Linking a WABA to Salesforce
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Verifies the target org's API version meets the minimum requirement.
|
|
3
|
+
# Usage: check-api-version.sh <min-version> <org-alias>
|
|
4
|
+
# Exits 0 if version >= min-version, exits 1 with error message otherwise.
|
|
5
|
+
|
|
6
|
+
MIN_VERSION="${1:?Usage: check-api-version.sh <min-version> <org-alias>}"
|
|
7
|
+
ORG_ALIAS="${2:?Usage: check-api-version.sh <min-version> <org-alias>}"
|
|
8
|
+
|
|
9
|
+
API_VERSION=$(sf org display --target-org "$ORG_ALIAS" --json 2>/dev/null | python3 -c "
|
|
10
|
+
import json, sys
|
|
11
|
+
try:
|
|
12
|
+
data = json.load(sys.stdin)
|
|
13
|
+
print(data.get('result', {}).get('apiVersion', ''))
|
|
14
|
+
except Exception:
|
|
15
|
+
print('')
|
|
16
|
+
")
|
|
17
|
+
|
|
18
|
+
if [ -z "$API_VERSION" ]; then
|
|
19
|
+
echo "ERROR: Could not determine API version for org '$ORG_ALIAS'."
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
if python3 -c "import sys; sys.exit(0 if float(sys.argv[1]) >= float(sys.argv[2]) else 1)" "$API_VERSION" "$MIN_VERSION"; then
|
|
24
|
+
echo "OK: Org API version $API_VERSION meets minimum $MIN_VERSION."
|
|
25
|
+
exit 0
|
|
26
|
+
else
|
|
27
|
+
echo "ERROR: Org API version $API_VERSION is below minimum $MIN_VERSION. Generate a sfdx-project.json with \"sourceApiVersion\": \"$MIN_VERSION\" in the metadata output folder."
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: service-email-to-case-configure
|
|
3
|
-
description: "Use to configure Salesforce Email-to-Case
|
|
3
|
+
description: "Use to configure Salesforce Email-to-Case headlessly via the Metadata API. Reads CaseSettings, applies the emailToCase config with updateMetadata, and verifies by re-reading. Also the entry point for attaching an Agentforce agent to Email-to-Case: configures the E2C base, then delegates agent creation and channel wiring. TRIGGER on set up/configure Email-to-Case, enable E2C routing addresses, add a routing address, or E2C with an Agentforce agent. DO NOT TRIGGER for the interactive Easy Setup wizard, On-Demand E2C only, general Case/web-to-case setup, or an agent with no E2C involved."
|
|
4
4
|
metadata:
|
|
5
5
|
version: "1.1"
|
|
6
6
|
domains: ["Service", "Agentforce"]
|
|
@@ -13,6 +13,7 @@ metadata:
|
|
|
13
13
|
- "service-omni-base-settings-configure"
|
|
14
14
|
- "service-omni-channel-inventory-analyze"
|
|
15
15
|
- "service-omni-command-center-analyze"
|
|
16
|
+
- "service-omni-command-center-configure"
|
|
16
17
|
- "service-omni-permission-set-assign"
|
|
17
18
|
- "service-omni-presence-status-deploy"
|
|
18
19
|
- "service-omni-presence-user-config-deploy"
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: service-omni-command-center-configure
|
|
3
|
+
description: "Use to enable Command Center for Service V2 and configure its supported supervisor controls through the OmniChannel Settings Metadata API while preserving unrelated settings. Requires explicit apply consent, refuses production customer orgs, and verifies the seeded V2 page and tab. TRIGGER when: enable Command Center V2, configure conversation monitoring, enable agent sneak peek, enable customer sneak peek, configure whisper messaging, or enable queues and skills actions. Do not use to assign supervisor permissions or configure classic OmniSupervisorConfig metadata."
|
|
4
|
+
allowed-tools: Bash Read Write Edit Grep Glob
|
|
5
|
+
metadata:
|
|
6
|
+
version: "1.0"
|
|
7
|
+
domains: ["Service"]
|
|
8
|
+
minApiVersion: "69.0"
|
|
9
|
+
relatedSkills:
|
|
10
|
+
- "service-omni-base-settings-configure"
|
|
11
|
+
- "service-omni-channel-setup-coordinate"
|
|
12
|
+
- "service-omni-command-center-analyze"
|
|
13
|
+
- "service-omni-supervisor-config-deploy"
|
|
14
|
+
accessCheck:
|
|
15
|
+
- type: license
|
|
16
|
+
value: ServiceCloud
|
|
17
|
+
cliTools:
|
|
18
|
+
- tool: ["jq"]
|
|
19
|
+
semver: ">=1.6"
|
|
20
|
+
- tool: ["python3"]
|
|
21
|
+
semver: ">=3.8"
|
|
22
|
+
- tool: ["sf"]
|
|
23
|
+
semver: ">=2.139.6"
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# service-omni-command-center-configure
|
|
27
|
+
|
|
28
|
+
Enable Command Center for Service V2 through `Settings:OmniChannel` and optionally configure the five supervisor controls exposed by the same Metadata API contract. The writer retrieves the org's complete settings document, changes only requested elements, deploys that preserved document, retrieves it again, and verifies both the values and the platform-created `CommandCenterForServiceV2_L` page and V2 tab.
|
|
29
|
+
|
|
30
|
+
The skill fails closed with `platform_api_unavailable` when the retrieved settings document does not expose `enableCommandCenterForServiceV2`.
|
|
31
|
+
|
|
32
|
+
Run `service-omni-base-settings-configure` first so the Omni foundation is enabled. If the org does not support Command Center V2, use `service-omni-supervisor-config-deploy` for the classic supervisor configuration instead.
|
|
33
|
+
|
|
34
|
+
For an end-to-end setup, `service-omni-channel-setup-coordinate` invokes this skill only when `OMNI_COMMAND_CENTER_V2=1`; the coordinator's default supervisor path remains unchanged.
|
|
35
|
+
|
|
36
|
+
## Inputs
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
bash scripts/configure-and-report.sh plan <org-alias> [options]
|
|
40
|
+
bash scripts/configure-and-report.sh run <org-alias> --apply [options]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Options:
|
|
44
|
+
|
|
45
|
+
| Option | Metadata element | Values |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `--conversation-monitoring` | `enableConversationMonitoring` | `true` or `false` |
|
|
48
|
+
| `--agent-sneak-peek` | `enableAgentSneakPeek` | `true` or `false` |
|
|
49
|
+
| `--customer-sneak-peek` | `enableClientSneakPeek` | `true` or `false` |
|
|
50
|
+
| `--whisper-messaging` | `enableWhisperMessaging` | `true` or `false` |
|
|
51
|
+
| `--queues-and-skills` | `enableSkillsAndQueueActions` | `true` or `false` |
|
|
52
|
+
|
|
53
|
+
`enableCommandCenterForServiceV2=true` is always requested. Unspecified supervisor controls are preserved exactly as retrieved. The skill intentionally does not disable V2 because disabling an org-level supervisor experience is a materially different operation.
|
|
54
|
+
|
|
55
|
+
## Safety
|
|
56
|
+
|
|
57
|
+
- `plan` is read-only and never deploys.
|
|
58
|
+
- `run` requires the literal `--apply` flag before any mutation.
|
|
59
|
+
- Writes are allowed only when `IsSandbox=true`, `TrialExpirationDate` is non-null, or `OrganizationType` is `Developer Edition` or `Base Edition`. There is no production override.
|
|
60
|
+
- `Settings` is a whole-document Metadata API type. Never deploy a partial or hardcoded `OmniChannel.settings-meta.xml`; doing so can reset unrelated Omni settings.
|
|
61
|
+
- The target org must have Enhanced Omni-Channel and the Command Center for Service V2 release gater. The API field is also permission-gated by `Customize Application`.
|
|
62
|
+
|
|
63
|
+
## Behavior
|
|
64
|
+
|
|
65
|
+
1. Authenticate and retrieve `Settings:OmniChannel` at API v66.
|
|
66
|
+
2. Confirm the V2 field is present. If it is absent, return `blocked` with `reason_code=platform_api_unavailable`; do not attempt a deploy.
|
|
67
|
+
3. Build a requested-value set containing V2=`true` plus only the optional controls explicitly supplied by the caller.
|
|
68
|
+
4. In `plan`, return `action_needed` or `reused` without writing.
|
|
69
|
+
5. In `run`, enforce `--apply` and the non-production guard, mutate a private copy of the retrieved document, and deploy it.
|
|
70
|
+
6. Retrieve the settings again and require every requested value to match.
|
|
71
|
+
7. Require both the seeded `FlexiPage` (`CommandCenterForServiceV2_L`) and V2 `TabDefinition` to be observable. Missing or unreadable provisioning evidence returns `blocked`; the skill never guesses.
|
|
72
|
+
|
|
73
|
+
The platform's ON-transition hook is idempotent: it creates missing profile tab configuration and seeds the baseline FlexiPage only when needed. Existing page customizations are not overwritten. If the preference is already true but its seed artifacts are missing, the skill returns `seed_incomplete`; it does not force a destructive OFF→ON cycle.
|
|
74
|
+
|
|
75
|
+
## Output contract
|
|
76
|
+
|
|
77
|
+
The script emits one JSON object with:
|
|
78
|
+
|
|
79
|
+
- `status`: `configured`, `reused`, `action_needed`, or `blocked`
|
|
80
|
+
- `reason_code`: a stable reason such as `changes_required`, `already_configured`, `platform_api_unavailable`, `unsafe_target`, `deploy_failed`, `verification_failed`, or `seed_incomplete`
|
|
81
|
+
- `requested`, `before`, and `after`: setting values, with presence retained in the snapshots
|
|
82
|
+
- `safe_to_write`, `deploy_id`, and `verification`
|
|
83
|
+
- `manual_actions`: permission assignment and any required follow-up
|
|
84
|
+
- `blocking_issue`: populated only when blocked
|
|
85
|
+
|
|
86
|
+
Enabling the org preference does not grant user access. Assign a permission set containing `CommandCenterForServiceUser` to each intended supervisor, then run `service-omni-command-center-analyze <org> <supervisor>` to verify end-to-end readiness.
|
|
87
|
+
|
|
88
|
+
## References
|
|
89
|
+
|
|
90
|
+
| File | When to read |
|
|
91
|
+
|---|---|
|
|
92
|
+
| `references/api-notes.md` | Metadata names, platform gates, seed behavior, and known limitations |
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Command Center for Service V2 API notes
|
|
2
|
+
|
|
3
|
+
## Metadata contract
|
|
4
|
+
|
|
5
|
+
Core work item `W-24039822` and Core PR `#16874` expose these fields on `Settings:OmniChannel`:
|
|
6
|
+
|
|
7
|
+
| Metadata field | Product control |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `enableCommandCenterForServiceV2` | Command Center for Service V2 |
|
|
10
|
+
| `enableConversationMonitoring` | Conversation monitoring |
|
|
11
|
+
| `enableAgentSneakPeek` | Agent sneak peek |
|
|
12
|
+
| `enableClientSneakPeek` | Customer sneak peek |
|
|
13
|
+
| `enableWhisperMessaging` | Whisper messaging |
|
|
14
|
+
| `enableSkillsAndQueueActions` | Queues and skills actions |
|
|
15
|
+
|
|
16
|
+
The V2 preference is Metadata API writable only when the target release contains that contract and the `OmniChannel.commandCenterForServiceV2Available` access check passes. That access check requires the feature gater and Enhanced Omni-Channel. Standard Omni orgs on the EOL extension cannot enable V2.
|
|
17
|
+
|
|
18
|
+
## ON-transition side effects
|
|
19
|
+
|
|
20
|
+
Changing `enableCommandCenterForServiceV2` from false to true invokes the existing `CommandCenterForServiceV2OrgPreference` hook. The hook:
|
|
21
|
+
|
|
22
|
+
1. inserts missing profile tab configurations for the V2 tab;
|
|
23
|
+
2. checks for `FlexiPage.DeveloperName='CommandCenterForServiceV2_L'`;
|
|
24
|
+
3. clones the platform seed only when that page is absent.
|
|
25
|
+
|
|
26
|
+
Disabling the preference does not delete the page. Re-enabling preserves an existing page. This skill enables but does not disable V2.
|
|
27
|
+
|
|
28
|
+
## Verification signals
|
|
29
|
+
|
|
30
|
+
The writer verifies the settings by a fresh Metadata API retrieve and verifies provisioning through:
|
|
31
|
+
|
|
32
|
+
```sql
|
|
33
|
+
SELECT Id FROM FlexiPage WHERE DeveloperName='CommandCenterForServiceV2_L'
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
using Tooling API, and:
|
|
37
|
+
|
|
38
|
+
```sql
|
|
39
|
+
SELECT Name FROM TabDefinition WHERE Name='standard-commandcenterforservicev2'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
using the data API. Query errors remain `unknown` and block a successful write claim.
|
|
43
|
+
|
|
44
|
+
## User access
|
|
45
|
+
|
|
46
|
+
The org preference and its seed artifacts establish org-level readiness only. A supervisor also needs a permission set with `PermissionsCommandCenterForServiceUser=true`. This skill reports that follow-up but does not create users or permission sets.
|
|
47
|
+
|
|
48
|
+
## Whole-document requirement
|
|
49
|
+
|
|
50
|
+
Salesforce Settings metadata is deployed as a complete document. The implementation retrieves the current document and updates it in place. Do not replace this approach with a static template: a static template can silently drop existing Omni settings that are outside this skill's scope.
|