@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.
Files changed (65) hide show
  1. package/package.json +1 -1
  2. package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +1 -1
  3. package/skills/commerce-b2b-open-code-components-replace/SKILL.md +16 -16
  4. package/skills/dx-devops-project-manage/SKILL.md +1 -1
  5. package/skills/experience-cms-content-generate/SKILL.md +1 -1
  6. package/skills/experience-cms-content-render/SKILL.md +3 -3
  7. package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +35 -7
  8. package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +13 -4
  9. package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +30 -8
  10. package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +14 -4
  11. package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +11 -1
  12. package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +1 -1
  13. package/skills/experience-cms-content-render/assets/shared/mediaLabels.ts +62 -0
  14. package/skills/experience-cms-content-render/references/init-scaffold.md +13 -6
  15. package/skills/experience-content-media-stock-image-search/SKILL.md +0 -1
  16. package/skills/experience-lwc-design-generate/SKILL.md +1 -1
  17. package/skills/experience-lwc-legacy-migrate/SKILL.md +212 -0
  18. package/skills/experience-lwc-legacy-migrate/assets/lo20-host-page-template.html +192 -0
  19. package/skills/experience-lwc-legacy-migrate/references/aura-to-lwc-completeness-checklist.md +188 -0
  20. package/skills/experience-lwc-legacy-migrate/references/lightning-out-2-system-reference.md +495 -0
  21. package/skills/experience-lwc-legacy-migrate/references/lightning-out-beta-to-2-migration.md +824 -0
  22. package/skills/experience-lwc-legacy-migrate/scripts/convert-lo-names.py +94 -0
  23. package/skills/experience-lwc-legacy-migrate/scripts/validate-lo20-page.py +133 -0
  24. package/skills/experience-ui-bundle-project-generate/SKILL.md +14 -40
  25. package/skills/experience-ui-bundle-project-generate/scripts/flatten-project.mjs +33 -11
  26. package/skills/experience-ui-bundle-project-generate/scripts/generate-project.mjs +77 -0
  27. package/skills/experience-ui-bundle-project-generate/scripts/install-deps.mjs +95 -0
  28. package/skills/integration-connectivity-connected-app-configure/SKILL.md +5 -5
  29. package/skills/integration-connectivity-generate/SKILL.md +10 -10
  30. package/skills/integration-connectivity-generate/scripts/configure-named-credential.sh +2 -2
  31. package/skills/platform-apex-test-generate/SKILL.md +1 -1
  32. package/skills/platform-apex-test-run/SKILL.md +1 -1
  33. package/skills/platform-custom-field-generate/SKILL.md +1 -1
  34. package/skills/platform-custom-lightning-type-generate/SKILL.md +1 -1
  35. package/skills/platform-custom-metadata-type-generate/SKILL.md +1 -1
  36. package/skills/platform-custom-object-generate/SKILL.md +1 -1
  37. package/skills/platform-custom-report-type-generate/SKILL.md +1 -1
  38. package/skills/platform-custom-setting-generate/SKILL.md +1 -1
  39. package/skills/platform-data-and-tooling-api-context-get/SKILL.md +1 -1
  40. package/skills/platform-data-manage/SKILL.md +10 -10
  41. package/skills/platform-flexipage-generate/SKILL.md +1 -1
  42. package/skills/platform-lightning-app-coordinate/SKILL.md +1 -1
  43. package/skills/platform-metadata-api-context-get/SKILL.md +1 -1
  44. package/skills/platform-metadata-retrieve/SKILL.md +1 -1
  45. package/skills/platform-permission-set-generate/SKILL.md +1 -1
  46. package/skills/platform-report-generate/SKILL.md +1 -1
  47. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +4 -4
  48. package/skills/platform-sharing-owd-configure/SKILL.md +1 -1
  49. package/skills/platform-sharing-rules-generate/SKILL.md +1 -1
  50. package/skills/platform-soql-query/SKILL.md +1 -1
  51. package/skills/platform-value-set-generate/SKILL.md +1 -1
  52. package/skills/service-agentforce-human-escalation-configure/SKILL.md +4 -0
  53. package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +26 -6
  54. package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +5 -4
  55. package/skills/service-de-waba-integrate/SKILL.md +2 -1
  56. package/skills/service-digital-engagement-deployment-configure/SKILL.md +2 -0
  57. package/skills/service-digital-engagement-deployment-configure/scripts/check-api-version.sh +29 -0
  58. package/skills/service-email-to-case-configure/SKILL.md +1 -1
  59. package/skills/service-omni-channel-setup-coordinate/SKILL.md +1 -0
  60. package/skills/service-omni-command-center-analyze/SKILL.md +1 -0
  61. package/skills/service-omni-command-center-configure/SKILL.md +92 -0
  62. package/skills/service-omni-command-center-configure/references/api-notes.md +50 -0
  63. package/skills/service-omni-command-center-configure/scripts/configure-and-report.sh +257 -0
  64. package/skills/service-omni-command-center-configure/scripts/settings_document.py +97 -0
  65. 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: "Generate and validate Apex test classes with TestDataFactory patterns, bulk testing (251+ records), mocking strategies, assertion best practices, and disciplined test-fix loops. Use this skill when creating new Apex test classes, improving test coverage, debugging and fixing failing Apex tests, running test execution and coverage analysis, or implementing testing patterns for triggers, services, controllers, batch jobs, queueables, and integrations. Triggers on *Test.cls, *_Test.cls files, sf apex run test workflows, coverage reports, test-fix loops. Do NOT trigger for production Apex code (use platform-apex-generate) or Jest/LWC tests."
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 needs to run Apex tests, check code coverage, fix failing tests, or work with *Test.cls / *_Test.cls files. TRIGGER when: 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)."
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 this skill when users need to create, generate, or validate Salesforce Custom Field metadata. Trigger when users mention custom fields, field types, Roll-up Summary fields, Master-Detail relationships, Lookup relationships, formula fields, picklists, dependent (controlling) picklists, referencing a value set from a field, or scoping/limiting picklist values for a specific record type. Also use when users encounter field deployment errors, especially around Roll-up Summary format, Master-Detail constraints, formula issues, or a record type that won't deploy without a business process. Use this skill for custom field metadata work, field generation, and field troubleshooting. DO NOT TRIGGER for creating or customizing the value set itself — defining a new GlobalValueSet, or modifying a StandardValueSet catalog like Industry or Lead Source — use platform-value-set-generate instead; this skill covers the field that references a value set, not the value set definition."
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 this skill when users need to create, generate, or validate Salesforce Custom Metadata Type metadata — the __mdt object, its fields, and its deployable records. Trigger when users mention custom metadata types, CMDT, __mdt objects, custom metadata records, .md-meta.xml files, or reference/config data that must ship between orgs. Also trigger for admin-maintained mapping, lookup, or crosswalk tables and field mappings (\"map fields from A to B\", code lookups) — config admins change without a code deploy belongs in a CMDT, never hardcoded in Apex or Flow — and when troubleshooting CMDT record/type deploy errors. DO NOT TRIGGER for Custom Settings — route to platform-custom-setting-generate; for regular custom objects holding business records — use platform-custom-object-generate; or for secrets and API keys — recommend a Named Credential, which this skill never generates."
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 this skill when users need to create, generate, or validate Salesforce Custom Object metadata. Trigger when users mention custom objects, creating objects, object metadata, .object files, sharing models, name fields, or validation rules on objects. Also use when users say things like \"create a custom object\", \"generate object metadata\", \"set up an object for...\", or when they're troubleshooting object deployment errors especially around sharing models and Master-Detail relationships. Always use this skill for any custom object metadata work, including enriching and keeping the object's description current whenever its fields or validation rules change. Do NOT use this skill for non-Custom-Object metadata (Apex, Flows, LWC, Permission Sets, Custom Metadata Types) or for standard Salesforce objects."
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 this skill when users need to create, generate, or validate Salesforce Custom Report Type metadata. Trigger when users mention custom report types, report types, CRTs, reporting frameworks, cross-object reports, report builder data sources, or ask to expose fields for reporting across related objects. Also use when users mention primary and related objects for reports, inner vs outer joins in reports, report type categories, or encounter 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 general reporting questions that don't involve authoring a .reportType-meta.xml file."
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 this skill when users need to create, generate, or validate Salesforce Custom Setting metadata. Trigger when users mention custom settings (hierarchy or list), customSettingsType, SetupOwnerId, per-profile/per-user config overrides, feature flags, feature toggles, kill switches, or on/off switches admins flip to enable/disable behavior, e.g. bypass triggers/automation during a data load. Also use for \"create a custom setting\" or errors like \"Cannot specify: pluralLabel for CustomSettings\" or a setting that silently deployed as a regular custom object. A trigger bypass or kill switch is just a checkbox on a hierarchy custom setting — generate ONLY the setting, never an Apex trigger/handler. DO NOT TRIGGER for Custom Metadata Types or __mdt objects — route to platform-custom-metadata-type-generate; for business-record objects — use platform-custom-object-generate; for secrets, API keys, passwords, or tokens — recommend a Named Credential, never generated here."
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 — use to look up standard sObject and Tooling field API names, types, properties (filterable/sortable/groupable/updateable), and relationship names for Account, Contact, Opportunity, Lead, Case, ApexClass, ApexCodeCoverage, TraceFlag, and more. Load this alongside a SOQL/query/Apex skill when the field names, types, or Filter/Sort/Group capabilities are unverified — not when the fields are already known and only query syntax or optimization is needed. TRIGGER when verifying, validating, or debugging fields in a SOQL/SOSL query or DML against a standard object — capabilities, relationship/subquery paths, or what fields an object has — so the query runs instead of guessing. Custom __c objects and __c fields are NOT in these assets; describe the live org for those (sf sobject describe). DO NOT TRIGGER for authoring/deploying *-meta.xml or sfdx source (use the Metadata API skill)."
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 this skill to create, update, delete, bulk import/export, generate test data, and clean up org records using sf CLI and anonymous Apex. TRIGGER when: user creates test data, performs bulk import/export, uses sf data CLI commands, needs data factory patterns for Apex tests, or needs to seed/clean records in a Salesforce org. DO NOT TRIGGER when: SOQL query writing only (use platform-soql-query), Apex test execution (use platform-apex-test-run), or metadata deployment (use platform-metadata-deploy)."
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
- cliTools:
6
- - tool: ["jq"]
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
- version: "1.1"
21
- domains: ["Platform"]
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 this skill when users need to create, generate, modify, or validate Salesforce Lightning pages (FlexiPages). Trigger when users mention RecordPage, AppPage, HomePage, Lightning pages, page layouts, adding components to pages, or page customization. Also use when users say things like 'create a Lightning page', 'add a component to a page', 'customize the record page', 'generate a FlexiPage', or when they're working with FlexiPage XML files and need help with components, regions, or deployment errors. Always use this skill for any FlexiPage-related work, even if they just mention 'page' in the context of Salesforce. DO NOT TRIGGER when users ask about Visualforce pages, Aura components without FlexiPage context, page layout assignments in the UI, or Lightning Web Component development that does not involve placing components on a FlexiPage."
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"
@@ -438,4 +438,4 @@ Check for:
438
438
  - Reserved words in API names
439
439
  - Relationship limits (max 2 M-D per object)
440
440
  - Name length limits
441
- - Duplicate names
441
+ - Duplicate names
@@ -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 generation skill; if you load a generator, you ALSO load this. Use it whenever you create, generate, add, edit, or author metadata or a *-meta.xml file: custom object, custom field, formula field, picklist, lookup, master-detail, validation rule, permission set, profile, custom tab, lightning record page, flexipage, list view, custom application, flow, layout, record type, sharing rules, report, and 604 Metadata API types. It provides the authoritative schema, fields, field properties, required flags, allowed enum values, and XML structure so generated *-meta.xml deploys cleanly — skipping it causes hallucinated element names and deploy failures. Trigger on *-meta.xml, metadata schema, api context, 'Salesforce metadata', or 'sfdx project'. DO NOT use for SOQL, DML, runtime sObject access, or Tooling API records."
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 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."
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"]
@@ -186,4 +186,4 @@ Before deploying, verify:
186
186
 
187
187
  ## Deployment
188
188
 
189
- Deploy using Salesforce CLI
189
+ Deploy using Salesforce CLI
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: platform-report-generate
3
- description: "Use this skill when users need to create, generate, or validate Salesforce Lightning Report metadata. Trigger when users mention reports, creating reports, report metadata, .report-meta.xml files, tabular reports, summary reports, matrix reports, joined reports, report columns, report groupings, report filters, report charts, cross-filters, bucket fields, report formulas, or report time frame filters. Also use when users say things like 'create a report', 'generate a report', 'build a report on Accounts', 'add a chart to my report', or when they encounter deployment errors for .report-meta.xml files. Do NOT trigger for: creating or modifying Custom Report Type metadata (.reportType-meta.xml — use platform-custom-report-type-generate), creating dashboards, creating list views, running or viewing existing reports in the UI, or SOQL queries."
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 data copying. TRIGGER when: user wants to connect a non-standard external API to Salesforce, asks to write a DataSource.Provider or DataSource.Connection, wants to surface external data as Salesforce records, says \"connect my API to Salesforce without copying data\", or asks whether custom Apex is the right approach for any system. Also trigger on: \"custom adapter\", \"ExternalId field\", \"DataSource namespace\". DO NOT TRIGGER when: user is configuring a standard adapter they already have and is NOT asking about custom Apex (e.g., OData endpoint setup, Snowflake connector config). DO NOT TRIGGER when: user wants to copy or bulk-sync data — use platform-data-manage. DO NOT TRIGGER for Apex callouts outside Connect — use platform-apex-generate or integration-connectivity-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 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 [platform-apex-generate](../platform-apex-generate/SKILL.md) or [integration-connectivity-generate](../integration-connectivity-generate/SKILL.md)).
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 | [platform-data-manage](../platform-data-manage/SKILL.md) |
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 | [platform-apex-generate](../platform-apex-generate/SKILL.md) or [integration-connectivity-generate](../integration-connectivity-generate/SKILL.md) |
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 when: user asks to check current OWD settings, view sharing defaults, change default access levels (Private, Public Read Only, Public Read/Write, Controlled by Parent), configure internal or external access for standard or custom objects, mentions org-wide defaults, wants to make records private or restrict who can see records, wants to control default record visibility for an object, or references .settings-meta.xml sharing fields or sharingModel in .object-meta.xml files. DO NOT TRIGGER when: user asks about sharing rules, criteria-based sharing, role hierarchy, or manual sharing — delegate to platform-sharing-rules-generate."
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 this skill when users need to get, create, edit, delete, or manage Salesforce Sharing Rules metadata. TRIGGER when: users mention sharing rules, record sharing, criteria-based sharing, role-based sharing, guest user sharing, sharingRules, sharingCriteriaRules, sharingGuestRules, sharingOwnerRules, .sharingRules-meta.xml files, or ask to share records with specific roles or groups. Also trigger when users want to retrieve or view existing sharing rules from an org, modify or remove existing sharing rules, or update sharing rule criteria or access levels. DO NOT TRIGGER when user needs permission sets or profiles (use platform-permission-set-generate), or needs object-level security rather than record-level sharing (use platform-permission-set-generate)."
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: "SOQL query generation, optimization, and analysis with 100-point scoring. Use this skill when the user needs SOQL/SOSL authoring or optimization: natural-language-to-query generation, relationship queries, aggregates, query-plan analysis, and performance or safety improvements for Salesforce queries. TRIGGER when: user writes, optimizes, or debugs SOQL/SOSL queries, touches .soql files, or asks about relationship queries, aggregates, or query performance. DO NOT TRIGGER when: bulk data operations (use platform-data-manage), Apex DML logic (use platform-apex-generate), or report/dashboard queries."
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 this skill when users need to create, generate, or validate a Salesforce global value set or customize a standard value set. Trigger when users mention a global value set, GlobalValueSet, standard value set, StandardValueSet, a reusable picklist, a picklist value set shared across fields, or customizing standard picklists like Industry, Lead Source, or Opportunity Stage. Also use when users hit deployment errors adding values to a standard picklist, referencing a value set from a custom field, or working with .globalValueSet-meta.xml or .standardValueSet-meta.xml files. DO NOT TRIGGER for an inline one-off picklist on a single field with no reuse, or for general custom field metadata work that does not involve a GlobalValueSet or StandardValueSet — use platform-custom-field-generate instead."
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(SKILLS_ROOT / script_rel), *args],
227
- capture_output=True, text=True, cwd=str(SKILLS_ROOT),
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. The actual sharing happens in Meta Business Suite (UI-only; Meta provides no Graph endpoint to automate this step). 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."
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
@@ -10,6 +10,8 @@ metadata:
10
10
  - "platform-permission-set-generate"
11
11
  - "service-digital-engagement-channel-configure"
12
12
  cliTools:
13
+ - tool: ["python3"]
14
+ semver: ">=3.8"
13
15
  - tool: ["sf"]
14
16
  semver: ">=2.0.0"
15
17
  ---
@@ -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 in a headless flow via the Metadata API. Reads the current CaseSettings, applies the desired emailToCase configuration with the updateMetadata CRUD call, and verifies by re-reading. Also the entry point when the user wants an Agentforce service agent on Email-to-Case: this skill configures the E2C base, then delegates agent creation and channel wiring. Start here even when no agent exists yet. TRIGGER when the user says set up Email-to-Case, configure email to case, enable Email-to-Case routing addresses, add an email routing address, Email-to-Case Metadata API, or set up Email-to-Case with an Agentforce service agent (attach an agent to an email routing address). DO NOT TRIGGER when the user needs the interactive Service Easy Setup wizard for E2cEasy addresses, when configuring On-Demand Email-to-Case only, for general Case object or web-to-case setup, or when only creating an Agentforce agent with no Email-to-Case involved."
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"
@@ -8,6 +8,7 @@ metadata:
8
8
  minApiVersion: "66.0"
9
9
  relatedSkills:
10
10
  - "service-omni-channel-setup-coordinate"
11
+ - "service-omni-command-center-configure"
11
12
  - "service-omni-supervisor-config-deploy"
12
13
  accessCheck:
13
14
  - type: license
@@ -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.