Manipulate Salesforce metadata.
See docs/force-md.md for all supported commands.
The commands are long, but tab completion makes them relatively painless.
Enable bash completion or see force-md completion --help for other options.
$ source <(force-md completion bash)
Below are some basic examples. See the wiki for higher level examples.
Clean up metadata by sorting groups of elements in natural order.
$ force-md permissionset tidy src/permissionsets/*
Tidy every tidyable metadata file in a directory and its subdirectories, and
format every Apex class (.cls) and trigger (.trigger) with
apexfmt. Files that are not
metadata and hidden directories such as .git are skipped, and an Apex file
that apexfmt cannot parse is reported and left unchanged. Add -l to list
the files that need tidying or formatting without changing them.
$ force-md tidy -r force-app/main/default
Add field permissions for a new field to Permission Sets by copying the permissions from another field.
$ force-md permissionset field-permissions clone -s Account.My_Field__c -f Account.New_Field__c src/permissionsets/*
Grant all permissions from a source permission set to another permission set.
$ force-md permissionset merge -s src/permissionsets/Subset.permissionset src/permissionsets/Superset.permissionset
Enable access to an apex class
$ force-md permissionset apex add -c MyClass src/permissionsets/My_Permission_Set.permissionset
Enable tab visibility
$ force-md permissionset tab add -t My_Tab src/permissionsets/My_Permission_Set.permissionset
Add object permissions to Profiles. All permissions will default to false; use profile object-permissions edit to update.
$ force-md profile object-permissions add -o Account src/profiles/*
Update the Read, Create, Edit, Delete, View All, and Modify All permissions on Profiles. Any permissions not specified on the command line will be left unchanged.
$ force-md profile object-permissions edit -o Account -e -D src/profiles/*
Copy metadata between source format (SFDX) and metadata format (MDAPI). Automatically handles merging/splitting of CustomObjects and CustomObjectTranslations.
$ force-md copy src -t sfdx -f source # Convert from metadata to source format
$ force-md copy sfdx -t src -f metadata # Convert from source to metadata format
$ force-md copy src -t sfdx -f source -x package.xml # Convert with package.xml filter
The -x flag allows filtering metadata based on a package.xml file:
- Named components: Only the specified components are copied
- Wildcards (
*): All components of that type are copied - Mixed (wildcards + named): All components are copied, but fails if any named component is missing
To add support for a new metadata type, zek can
be useful for getting started by generating a struct that matches the XML
structure, e.g.
$ zek -C -m src/queues/*