Salesforce layout CLI and API operations. Use when creating, retrieving, modifying, or deploying page layouts, Lightning Record Pages, and Compact Layouts via command line or Metadata API.
From opspal-salesforcenpx claudepluginhub revpalsfdc/opspal-commercial --plugin opspal-salesforceThis skill is limited to using the following tools:
deploy-patterns.mderror-recovery.mdprofile-assignment.mdretrieve-patterns.mdProvides process, architecture, review, hiring, and testing guidelines for engineering teams relying on AI code generation.
Delivers DB-free sandbox API regression tests for Next.js/Vitest to catch AI blind spots in self-reviewed code changes like API routes and backend logic.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Activate this skill when the user needs to:
Metadata Type: Layout
API Name Format: ObjectAPIName-LayoutName
Examples:
Account-Account LayoutContact-Contact LayoutOpportunity-Opportunity LayoutCustomObject__c-CustomObject LayoutFile Extension: .layout-meta.xml
Metadata Type: FlexiPage
API Name Format: Object_Record_Page (no spaces, underscores)
Examples:
Account_Record_PageContact_Record_PageCustom_Object_Record_PageFile Extension: .flexipage-meta.xml
Metadata Type: CompactLayout
API Name Format: ObjectAPIName.CompactLayoutAPIName
Examples:
Account.Account_Compact_LayoutContact.Mobile_Contact_LayoutFile Extension: .compactLayout-meta.xml
# All Page Layouts
sf project retrieve start -m Layout
# All Lightning Record Pages
sf project retrieve start -m FlexiPage
# All Compact Layouts
sf project retrieve start -m CompactLayout
# Page Layout (Classic)
sf project retrieve start -m "Layout:Account-Account Layout"
# Lightning Record Page
sf project retrieve start -m "FlexiPage:Account_Record_Page"
# Compact Layout
sf project retrieve start -m "CompactLayout:Account.Account_Compact_Layout"
# Get all layout-related metadata for an object
sf project retrieve start -m \
"Layout:Account-*,FlexiPage:Account_*,CompactLayout:Account.*"
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Account-Account Layout</members>
<members>Contact-Contact Layout</members>
<name>Layout</name>
</types>
<types>
<members>Account_Record_Page</members>
<name>FlexiPage</name>
</types>
<types>
<members>Account.Account_Compact_Layout</members>
<name>CompactLayout</name>
</types>
<version>62.0</version>
</Package>
sf project retrieve start -x package.xml
# Page Layout
sf project deploy start -m "Layout:Account-Account Layout"
# Lightning Record Page
sf project deploy start -m "FlexiPage:Account_Record_Page"
# Compact Layout
sf project deploy start -m "CompactLayout:Account.Account_Compact_Layout"
Profile layout assignments are stored in Profile metadata. To deploy layout with assignments:
# Deploy layout and profiles together
sf project deploy start -m \
"Layout:Account-Account Layout,Profile:Standard User,Profile:Sales User"
# Deploy all layouts in project
sf project deploy start -d force-app/main/default/layouts
# Deploy specific directory
sf project deploy start -d force-app/main/default/flexipages
# Check-only deployment (no actual changes)
sf project deploy start -m "Layout:Account-Account Layout" --dry-run
# Validate entire project
sf project deploy validate -d force-app
<Profile>
<layoutAssignments>
<layout>Account-Account Layout</layout>
</layoutAssignments>
<layoutAssignments>
<layout>Account-Sales Account Layout</layout>
<recordType>Account.Customer</recordType>
</layoutAssignments>
</Profile>
sf project retrieve start -m "Profile:Standard User,Profile:Admin"
sf project retrieve start -m "Profile:TargetProfile"<layoutAssignments> in the XMLsf project deploy start -m "Profile:TargetProfile"# Backup current state
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
sf project retrieve start -m "Layout:Account-Account Layout" \
-d backup_${TIMESTAMP}
# Make changes, then deploy
sf project deploy start -m "Layout:Account-Account Layout"
# Rollback if needed
sf project deploy start -d backup_${TIMESTAMP}
# Retrieve all Account-related layouts
sf project retrieve start -m "Layout:Account-*"
# Deploy all retrieved layouts
sf project deploy start -d force-app/main/default/layouts
# Retrieve from sandbox
sf project retrieve start -m "Layout:Account-*" \
--target-org sandbox -d sandbox_layouts
# Retrieve from production
sf project retrieve start -m "Layout:Account-*" \
--target-org prod -d prod_layouts
# Compare
diff -r sandbox_layouts prod_layouts
sf data query --query \
"SELECT Name, EntityDefinition.QualifiedApiName
FROM Layout
WHERE EntityDefinition.QualifiedApiName = 'Account'" \
--use-tooling-api
sf data query --query \
"SELECT DeveloperName, EntityDefinition.QualifiedApiName
FROM FlexiPage
WHERE EntityDefinition.QualifiedApiName = 'Account'" \
--use-tooling-api
sf data query --query \
"SELECT DeveloperName, FullName
FROM CompactLayout
WHERE SobjectType = 'Account'" \
--use-tooling-api
sf data query --query \
"SELECT DefaultCompactLayoutName
FROM EntityDefinition
WHERE QualifiedApiName = 'Account'" \
--use-tooling-api
For detailed guidance, see:
retrieve-patterns.md - Advanced retrieval scenariosdeploy-patterns.md - Deployment strategies and validationprofile-assignment.md - Profile layout assignment managementerror-recovery.md - Troubleshooting deployment failures