Soql Lib Query Builder
beyond-the-cloud-dev/soql-lib
Builds Salesforce SOQL queries using the SOQL Lib fluent builder API (SOQL.cls).
Set up Voice to Form on Field Service Mobile end-to-end against a Salesforce org, covering both variants: Voice to Record Edit (voice-fills any record-edit screen) and Voice to Form Data Capture…
$ npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install forcedotcom/sf-skills field-service-voice-to-form-configure --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/field-service-voice-to-form-configure .claude/skills/field-service-voice-to-form-configure && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "field-service-voice-to-form-configure" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/field-service-voice-to-form-configure into .claude/skills/field-service-voice-to-form-configure/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "field-service-voice-to-form-configure", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/forcedotcom/sf-skills/tree/main/skills/field-service-voice-to-form-configureType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install forcedotcom/sf-skills field-service-voice-to-form-configure --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/field-service-voice-to-form-configure .agents/skills/field-service-voice-to-form-configure && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "field-service-voice-to-form-configure" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/field-service-voice-to-form-configure into .agents/skills/field-service-voice-to-form-configure/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "field-service-voice-to-form-configure", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install forcedotcom/sf-skills field-service-voice-to-form-configure --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/field-service-voice-to-form-configure .cursor/skills/field-service-voice-to-form-configure && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "field-service-voice-to-form-configure" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/field-service-voice-to-form-configure into .cursor/skills/field-service-voice-to-form-configure/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "field-service-voice-to-form-configure", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/forcedotcom/sf-skills.git --path skills/field-service-voice-to-form-configure--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install forcedotcom/sf-skills field-service-voice-to-form-configure --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/field-service-voice-to-form-configure .gemini/skills/field-service-voice-to-form-configure && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "field-service-voice-to-form-configure" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/field-service-voice-to-form-configure into .gemini/skills/field-service-voice-to-form-configure/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "field-service-voice-to-form-configure", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install forcedotcom/sf-skills field-service-voice-to-form-configureInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/field-service-voice-to-form-configure .github/skills/field-service-voice-to-form-configure && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "field-service-voice-to-form-configure" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/field-service-voice-to-form-configure into .github/skills/field-service-voice-to-form-configure/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "field-service-voice-to-form-configure", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install forcedotcom/sf-skills field-service-voice-to-form-configure --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/field-service-voice-to-form-configure .opencode/skills/field-service-voice-to-form-configure && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "field-service-voice-to-form-configure" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/field-service-voice-to-form-configure into .opencode/skills/field-service-voice-to-form-configure/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "field-service-voice-to-form-configure", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
field-service-voice-to-form-configureSet up Voice to Form on Field Service Mobile end-to-end against a Salesforce org, covering both variants: Voice to Record Edit (voice-fills any record-edit screen) and Voice to Form Data Capture…
Field Service Voice To Form Configure is an agent skill from forcedotcom/sf-skills. Set up Voice to Form on Field Service Mobile end-to-end against a Salesforce org, covering both variants: Voice to Record Edit (voice-fills any record-edit screen) and Voice to Form Data Capture (voice-fills Discovery Framework / Data Capture forms). Discovers existing DC forms and asks which to enable, hands off to fs-data-capture-form-deployer to create them if none exist, assigns every permission a mobile user needs, and walks the admin through the Einstein generative AI base setup. TRIGGER when the user asks…
Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Sales & Support, covering CRM management. It works with Salesforce. The repository describes itself as: Salesforce's curated collection of agent skills for building applications. Optimized for Agentforce Vibes, compatible with all AI tools. The licence is Apache-2.0.
11 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4bbae5c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
sfFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
help.salesforce.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Field Service Voice To Form Configure loads about 11k tokens when it runs. Until then it costs about 215 tokens; SKILL.md has 5,155 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from forcedotcom/sf-skills at commit 4bbae5c, republished under its Apache-2.0 licence (© forcedotcom). 5,155 words, ~11,222 tokens.
.claude/skills/field-service-voice-to-form-configure/SKILL.md (or your agent's skills folder).Configure Voice to Form on Field Service Mobile from a fresh Field Service org. Voice to Form lets a mobile worker tap the microphone on a form or a record edit screen and dictate the contents. Einstein generative AI parses the speech and fills the matching fields.
There are two variants. They share a permission backbone but enable through different switches:
| Variant | What it does | Where it shows up | Underlying switch |
|---|---|---|---|
| Voice to Record Edit (V2RE) | Voice-fills the standard record edit screen on objects mobile workers can edit (Work Order, Service Appointment, Asset, Contact, Account, custom objects, etc.) | Mic icon on the Record Edit screen | FieldServiceMobileSettings.IsShowEditFullRecord = true (org-level row) + FieldServiceVoiceToRecordEdit system permission |
| Voice to Form Data Capture (V2F, Beta) | Voice-fills Discovery Framework / Data Capture flows the admin built in Flow Builder | Mic icon on a Data Capture form | FieldServiceVoiceToForm system permission + per-form LLM Targetable flag (UI toggle only) |
This skill walks the complete setup for both, in the order Salesforce documents them at:
help.salesforce.com/s/articleView?id=service.mfs_voice_to_form_setup.htm (V2F Data Capture)help.salesforce.com/s/articleView?id=service.mfs_voice_to_record_edit_setup.htm (V2 Record Edit)The skill is idempotent. Re-running on an already-configured org applies zero changes.
Runtime contract: every org interaction in this skill is a REST call dispatched through the Codey runtime (
dispatchlocally / the hosted Headless 360 MCP in shared surfaces). This skill has no dependency on the execution environment — nosfCLI, no shell scripts, no local Python, nojq, no temp files, no metadata deploy, no Apex. Detection is a set of REST GETs; the LDS toggle is a ToolingFieldServiceSettings.MetadataPATCH; the V2RE org switch is an sObject PATCH; the voice permset is a single sObject POST; entitlement grants are association-object POSTs. The one step with no callable API — the per-form LLM Targetable flag — is driven by the agent-native browser MCP or handed to the admin as a Setup deeplink (a click-through, not a shell step). Do not shell out.
vXX.0 — pin to the org's current API version (v62.0 or later; the V2F Beta assumes a recent release)./services/data/vXX.0/tooling/...; the rest are the core Data API (/services/data/vXX.0/...).GET /services/data/vXX.0/query?q=<soql> (Data API) or GET /services/data/vXX.0/tooling/query?q=<soql> (Tooling). Reads that return records are handled inline by the agent — there is no shell parsing.FieldServiceMobilePsl) to log into the app. In modern Field Service orgs this is a permission-set license layered on top of any standard user license — there is NOT a separate "Field Service Mobile" user license SKU. (Earlier docs said otherwise; trust the live PermissionSetLicense query in Step 0.)EinsteinFieldServicePsl).Before running the setup sequence, confirm all of the following:
EinsteinLlm runtime entitlement must be active (live LLM call returns 200, not FUNCTIONALITY_NOT_ENABLED). Trial and SDO orgs commonly have the PSLs assigned but the runtime never turned on — this is the single most common cause of "We couldn't recommend any updates" on the mobile app.help.salesforce.com/s/articleView?id=service.mfs_data_capture_setup.htm. The skill detects DC forms in Step 5 and, if none exist, hands off to the fs-data-capture-form-deployer skill in this repo to create them.Customize Application, Manage Profiles and Permission Sets, and Manage Flows.Run steps in order. Each step reads the org state before it writes; if a precondition fails, the step surfaces the failure and stops without mutating the org. Every read and write below is a single dispatch call.
Run six detection reads to classify the org. Several queries that look intuitive (FlowDefinitionView, Tooling FieldServiceMobileSettings, Flow.DeveloperName) DO NOT WORK — the field names and surfaces below are the verified ones.
1. Einstein / Agentforce / Mobile Field Service PSLs — GET /services/data/vXX.0/query:
SELECT DeveloperName, MasterLabel, TotalLicenses, UsedLicenses
FROM PermissionSetLicense
WHERE DeveloperName IN ('EinsteinFieldServicePsl','FieldServiceMobilePsl','AgentforceForFieldServicePsl')EinsteinFieldServicePsl + FieldServiceMobilePsl are required for a V2F demo; AgentforceForFieldServicePsl is optional. Only assign in Step 7 the PSLs that come back here.
2. Shipped EinsteinFieldServiceUser permset (read-only clone source reference) — GET /services/data/vXX.0/query:
SELECT Id, Name, Label FROM PermissionSet WHERE Name = 'EinsteinFieldServiceUser'Present → the FSL package is installed at a V2F-capable version. This permset is shipped read-only; the skill never edits it (and does NOT clone it — see Step 4).
3. Lightning Data Service mode (LDS) — Tooling GET /services/data/vXX.0/tooling/query:
SELECT FullName, Metadata FROM FieldServiceSettingsRead Metadata.enableLsdkMode. true → LDS on, proceed. false → Step 1 flips it. LDS is needed for V2F-DC, optional for V2RE.
4. V2RE org switch — regular sObject GET /services/data/vXX.0/query (NOT Tooling):
SELECT Id, MasterLabel, IsDefault, IsShowEditFullRecord FROM FieldServiceMobileSettingsCapture the Id of the IsDefault = true row (or the sole row) — Step 2's PATCH targets it.
5. Active Data Capture forms — Tooling GET /services/data/vXX.0/tooling/query (NOT FlowDefinitionView):
SELECT Id, MasterLabel, ProcessType, Status, DefinitionId
FROM Flow
WHERE ProcessType IN ('DataCaptureFlow','DiscoveryFrameworkDataCaptureFlow') AND Status = 'Active'Use MasterLabel for display — Flow has no DeveloperName column (querying it 400s INVALID_FIELD); follow Definition.DeveloperName for the API name. Zero rows → Step 5 hands off to fs-data-capture-form-deployer.
6. Existing V2F custom permset — GET /services/data/vXX.0/query:
SELECT Id, Name, Label FROM PermissionSet WHERE IsCustom = true AND Name LIKE '%V2F%'One row → a prior run created it; skip Step 4 and reuse its Id. Zero rows → Step 4 creates it.
Interpret the results to classify the org:
| Diagnostic 1 (PSL) | Diagnostic 2 (permset) | Diagnostic 5 (forms) | Action |
|---|---|---|---|
| MISSING | any | any | Stop. Contact Salesforce AE to purchase Einstein/Agentforce for Field Service. The skill cannot continue. |
| PRESENT | MISSING | any | Continue to Step 1.5. Einstein base setup is incomplete; run the wizard before anything else. |
| PRESENT | PRESENT | MISSING | Continue. V2RE will set up cleanly. V2F-DC will hand off to the DC skill in Step 5. |
| PRESENT | PRESENT | PRESENT | Continue. Both variants will set up cleanly. |
Voice to Form is a per-user feature: each technician needs the Field Service Mobile PSL, the Einstein for Field Service PSL, the V2F/V2RE permset, and an active ServiceResource row. The skill targets one technician at a time so the admin can pilot before broad rollout.
Ask the admin: "Do you have a specific technician user you want to enable Voice to Form for?"
If yes: the admin supplies a username or User Id. Validate that the user is active and has a ServiceResource record — two GET /services/data/vXX.0/query reads (substitute the supplied value into the bound WHERE):
SELECT Id, Name, Username, IsActive, Profile.Name FROM User
WHERE (Username = :tech OR Id = :tech) AND IsActive = trueSELECT Id, Name, ResourceType FROM ServiceResource
WHERE RelatedRecordId IN (SELECT Id FROM User WHERE Username = :tech OR Id = :tech)
AND IsActive = trueIf no: auto-pick a candidate — the first active ResourceType='T' technician on a non-administrator profile — and surface the choice for confirmation, GET /services/data/vXX.0/query:
SELECT Id, Name, RelatedRecord.Id, RelatedRecord.Username, RelatedRecord.Name, RelatedRecord.Profile.Name
FROM ServiceResource
WHERE IsActive = true AND ResourceType = 'T'
AND RelatedRecordId != null AND RelatedRecord.IsActive = true
AND RelatedRecord.Profile.Name NOT IN ('System Administrator')
AND (NOT RelatedRecord.Profile.Name LIKE '%Customer Community%')
AND (NOT RelatedRecord.Profile.Name LIKE '%Partner Community%')
ORDER BY Name LIMIT 1Capture the technician's User.Id (call it TECH_USER_ID) and Username for the assignment steps. The running admin's User Id is resolved the same way when needed (SELECT Id, Username FROM User WHERE ...) — the Codey runtime already knows the connected identity, so no org display call is required.
Voice to Form on Discovery Framework forms (V2F-DC) renders inside the LDS-aware mobile container. V2RE works without LDS, but enabling it is harmless and required for V2F-DC, so do it once up front.
LDS is enabled by default for new orgs from Winter '25; all orgs auto-migrate by Spring '26.
FieldServiceSettings is a Tooling sObject whose config lives in a JSON Metadata field — the same shape Step 0 diagnostic 3 reads back. So enabling LDS is a Tooling read-modify-write PATCH, not a metadata-file deploy. There is no .settings-meta.xml, no SFDX project, and no sf project deploy start — that path was never necessary; the Tooling Metadata surface is the real REST path (same pattern the sibling fs-data-capture-form-deployer skill uses for the FieldServiceSettings sharing prefs).
1a. Read the settings singleton (already done in Step 0 diagnostic 3, but re-read to get the full Metadata object and its row Id) — Tooling GET /services/data/vXX.0/tooling/query:
SELECT Id, FullName, Metadata FROM FieldServiceSettingsIf Metadata.enableLsdkMode is already true, LDS is on — skip to Step 1.5. Otherwise capture the row Id (a base64-encoded singleton Tooling id) and the full Metadata object.
1b. PATCH the full Metadata back with enableLsdkMode: true — PATCH /services/data/vXX.0/tooling/sobjects/FieldServiceSettings/{Id}:
{ "Metadata": { "...all sibling keys from the GET...", "enableLsdkMode": true } }Send the entire Metadata object read in 1a with only enableLsdkMode flipped — a partial body nulls the omitted org prefs (fieldServiceOrgPref, enableWorkOrders, the search-field arrays, etc.). A 204 is success.
1c. Verify it actually flipped — re-run the 1a Tooling read and confirm Metadata.enableLsdkMode == true. This guards the rare SDO/trial-org case where a write reports success but the flag stays false. If it did not flip, surface the Setup deeplink for the admin to toggle it by hand:
LDS Setup UI (fallback — only if the PATCH did not persist):
<instanceUrl>/lightning/setup/FieldServiceSettings/home
Enable 'Lightning SDK for Field Service Mobile' under the Lightning SDK section.(The Codey runtime knows the instance URL; the skill just names the relative Setup path for the admin.)
This is the step that most often goes missed. Without it the mic icon WILL render on-device, transcription WILL work, but every voice attempt fails with "We couldn't recommend any updates. Try again." — the LLM runtime returning FUNCTIONALITY_NOT_ENABLED: [EinsteinLlm] because the enableEinsteinGPT org pref was never flipped.
1.5a. Probe the runtime live. This is the only honest test — Tooling queries on Einstein settings are unreliable across releases. Dispatch GET /services/data/vXX.0/einstein/prompt-templates?pageSize=5:
promptRecords array (at least one row, e.g. Salesforce-managed defaults like einstein_gpt__summarizeContact) → the LLM runtime is ON. Continue to Step 2.FUNCTIONALITY_NOT_ENABLED: [EinsteinLlm] → the runtime is OFF. Walk 1.5b.1.5b. If the probe failed, surface the wizard deeplinks for the admin. The wizard is genuinely UI-only — the skill cannot click through it and does not try. Name the relative Setup paths (the runtime resolves the instance URL):
Einstein LLM runtime is OFF. Walk the wizard end-to-end.
PRIMARY (start here):
/lightning/setup/EinsteinSetup/home
Wizard sub-pages:
Generative AI: /lightning/setup/EinsteinGPTSetupHome/home
Trust Layer: /lightning/setup/EinsteinTrustSetup/home
Data Cloud: /lightning/setup/DataCloudSetup/home
Prompt Builder: /lightning/setup/EinsteinPromptStudio/home
Models config: /lightning/setup/EinsteinModelsConfiguration/home
In order:
1. Open the PRIMARY link. Toggle 'Turn On Einstein' -> accept terms.
2. Open the Generative AI sub-page. Step through each numbered stage
(enable the org pref, set up Trust Layer, acknowledge data usage,
enable Prompt Builder).
3. If the wizard prompts for Data Cloud, open Data Cloud Setup and activate.
If it's not visible, refresh or re-login; if still missing, the org needs
a Data Cloud SKU (a CRT to Salesforce Support).
4. Re-run the 1.5a probe. If it now returns promptRecords, continue to Step 2.
Most common SDO/trial-org symptom: PSLs all assigned, EinsteinSetup page exists,
but the runtime entitlement was never turned on. 'Turn On Einstein' flips it.1.5c. Re-probe after the admin completes the wizard. Re-run the 1.5a dispatch call. Do not move on until it returns promptRecords.
V2RE's org-level switch lives on FieldServiceMobileSettings, a regular sObject (not a Tooling Settings type — earlier docs were wrong about this). The relevant field is IsShowEditFullRecord (label "Enable full edit on records"). The settings record is named ("Field Service Mobile Settings" by default) and has an IsDefault flag controlling which profiles inherit it.
2a. Find the default settings row (from Step 0 diagnostic 4), or create one — if diagnostic 4 returned no row, create the default with POST /services/data/vXX.0/sobjects/FieldServiceMobileSettings:
{
"MasterLabel": "Field Service Mobile Settings",
"DeveloperName": "Field_Service_Mobile_Settings",
"IsDefault": true,
"IsShowEditFullRecord": true
}A 201 returns the new row Id (which already satisfies Step 2b — skip the PATCH).
2b. Flip IsShowEditFullRecord (and IsDefault) to true on the existing row — PATCH /services/data/vXX.0/sobjects/FieldServiceMobileSettings/{Id}:
{ "IsShowEditFullRecord": true, "IsDefault": true }A 204 is success. Re-read the row (Step 0 diagnostic 4) to confirm both fields are true. Without IsDefault = true, the toggle takes effect only on profiles explicitly mapped to this settings row via MobileSettingsAssignment — IsDefault = true is the simplest path for a pilot. The PATCH is idempotent: re-sending the same values returns 204 and changes nothing.
What the user sees on-device. Per Salesforce help (
mfs_actions_order.xml): onceIsShowEditFullRecord = trueand the user has Edit access to the object, Edit Work Order, Edit Work Order Line Item, and Edit Service Appointment appear in the Actions launcher on the Work Order Overview screen, after Quick Actions. The mobile app caches the settings — the technician must log out and back in for the new actions to appear.
Salesforce ships two distinct system perms — one per variant. They are enabled on a custom permset (Step 4). Their PermissionSet describe columns are:
FieldServiceVoiceToForm — column PermissionsFieldServiceVoiceToFormFieldServiceVoiceToRecordEdit — column PermissionsFieldServiceVoiceToRecordEditColumn presence in the describe IS the org-level feature-flag test. Dispatch GET /services/data/vXX.0/sobjects/PermissionSet/describe and filter fields[].name for PermissionsFieldServiceVoiceTo*:
PermissionsFieldServiceVoiceToRecordEdit → V2F Beta isn't enabled for this org. Per the help article: "Your Customer Org ID needs to be identified, and the feature flag must be turned on for your respective sandbox or production organization." File a CRT with Salesforce Support quoting the org ID, then continue with V2RE-only setup.The describe also confirms both columns are createable = true and updateable = true — which is why Step 4 can be a single POST (see below).
Create a thin custom permset that enables the voice system perms via a single sObject POST. PermissionSet is a REST-createable sObject and every Permissions* system-perm column is writable at create time (confirmed by the Step 3 describe: all 474 Permissions* columns are createable+updateable), so the permset is born with the voice perms already on — no XML, no SFDX project, no sf project deploy start.
Do NOT "clone"
EinsteinFieldServiceUser. The shipped permset grants zero object permissions and only two unrelated system perms (ShowPreWorkBriefGA,FieldServiceCopilotActions); its only real payload is the Einstein license link, which Step 7 already delivers via theEinsteinFieldServicePslPSL. A thin custom permset carrying just the voice system-perm booleans is correct and sufficient — replicating the shipped permset would add nothing.
Dispatch POST /services/data/vXX.0/sobjects/PermissionSet. Gate the body on the Step 3 describe — set PermissionsFieldServiceVoiceToForm: true only when that column is present (sending an unknown perm column 400s):
{
"Name": "EinsteinFieldServiceUser_V2F",
"Label": "Einstein for Field Service User (V2F)",
"Description": "Adds Field Service Voice to Form / Voice to Record Edit system perms. Assign to admins and mobile workers who use voice on the FSL mobile app.",
"PermissionsFieldServiceVoiceToRecordEdit": true,
"PermissionsFieldServiceVoiceToForm": true
}Name must match ^[A-Za-z][A-Za-z0-9_]*$; custom permsets are IsCustom = true automatically.PermissionsFieldServiceVoiceToForm and create a V2RE-only permset.Name returns 400 DUPLICATE_DEVELOPER_NAME — the Step 0 diagnostic 6 check guards this by skipping create when a V2F permset already exists (reuse its Id).Verify the perms actually landed (a create can report success while a downstream trigger clears a perm) — GET /services/data/vXX.0/query:
SELECT Id, Name, PermissionsFieldServiceVoiceToRecordEdit FROM PermissionSet
WHERE IsCustom = true AND Name = 'EinsteinFieldServiceUser_V2F'Add PermissionsFieldServiceVoiceToForm to the SELECT only when that column exists on the org. The perm columns should read back true. Capture the Id for Step 7.
This step is interactive ONLY for V2F-DC. V2RE is fully enabled by Step 2 + Step 4 + Step 7 (no per-form toggling).
5a. List active DC forms — Tooling GET /services/data/vXX.0/tooling/query (NOT FlowDefinitionView, which is not Tooling-queryable on most orgs):
SELECT Id, MasterLabel, ProcessType, Status, DefinitionId, Definition.DeveloperName
FROM Flow
WHERE ProcessType IN ('DataCaptureFlow','DiscoveryFrameworkDataCaptureFlow') AND Status = 'Active'
ORDER BY MasterLabelPresent the form count and, if greater than zero, list each form (Definition.DeveloperName — MasterLabel).
5b. If zero forms: hand off to the fs-data-capture-form-deployer skill and stop V2F-DC enablement. V2RE is unaffected. (This handoff is a machine-readable delegates_to edge in the SOR, gated on FORM_COUNT == 0.)
No Data Capture forms found.
Voice to Form fills DC forms; without at least one DC form, there is nothing to enable.
To create one, invoke the fs-data-capture-form-deployer skill in this repo
(../fs-data-capture-form-deployer/SKILL.md), or use fs-data-capture-form-designer
(prose or image/PDF input) for end-to-end form generation.
Re-run this skill from Step 5 after at least one DC form exists. Steps 0-4 are
idempotent; re-running is safe.
V2RE — Voice to Record Edit — does NOT depend on DC forms. If you only want V2RE,
Steps 1, 1.5, 2, 4, 7 are sufficient.5c. If one or more forms: ask the admin which forms. Default offer is all:
Which forms do you want to enable Voice to Form on?
[a] All <FORM_COUNT> forms above (recommended for a fresh setup)
[s] Some — pick a subset by row number or DeveloperName
[n] None for now — re-run laterVerified GAP (no callable API as of Summer '26). The LLM Targetable flag has NO metadata API representation. Seven candidate field names (
isLLMTargetable,isAIPromptable,isAvailableForLlm,voiceCaptureEnabled,supportsVoiceCapture,voiceToFormEnabled,isAITargetable) were all rejected by the Flow XSD parser asElement ... invalid at this location in type Flow. The Tooling RESTFlow.MetadataJSON contains no LLM/voice/targetable keys, andFlowDefinition.Metadatais barren. The flag exists ONLY in Flow Builder's "Save as" dialog under "Show Advanced". This is the one irreducible non-REST step in the skill — and it is handled agent-natively via the browser MCP, not via any execution-environment dependency.
There are two ways to flip it. Pick based on what's available in the runtime.
Path A (preferred — agent-native browser MCP drive). Verified working end-to-end: V2F triggered correctly on the mobile app after this path enabled the flag on real forms. The browser MCP is part of the agent runtime (like dispatch), not a shell or an external tool the skill depends on.
The sequence per form is exactly these clicks:
<instanceUrl>/builder_platform_interaction/flowBuilder.app?flowId=<FLOW_ID>. (The runtime supplies the authenticated session; the skill does not build frontdoor.jsp URLs or handle tokens.)Browser-MCP click sequence per form (node IDs change per page-load and must be re-fetched via browser_a11y_tree):
browser_navigate(<instanceUrl>/builder_platform_interaction/flowBuilder.app?flowId=<FLOW_ID>)
# Wait until the toolbar renders. The "Last saved on..." banner is reliable.
browser_a11y_tree(query="Save As New Version") -> click that node
browser_a11y_tree(query="Show Advanced") -> click that node
browser_click("LLM Targetable") # aria-label resolution works for the label
browser_a11y_tree(query="dialog") -> drill into the dialog root, click "Save"
browser_a11y_tree(query="Activate") -> click that nodeVerify per form — a new Active version with a higher VersionNumber confirms the save committed. Tooling GET /services/data/vXX.0/tooling/query:
SELECT Definition.DeveloperName, VersionNumber, Status, LastModifiedDate FROM Flow
WHERE Definition.DeveloperName = :formApiName ORDER BY VersionNumber DESC LIMIT 3The newest row should be Active with a LastModifiedDate near the run time.
Path B (fallback when no browser MCP is available) — hand the admin deeplinks. Surface one Flow Builder URL per selected form and the click steps. The admin opens each, clicks Save As New Version → Show Advanced → ticks LLM Targetable → Save → Activate:
Open each link. Click Save As New Version. Click Show Advanced.
Tick 'LLM Targetable'. Click Save. Click Activate.
<form MasterLabel>
<instanceUrl>/builder_platform_interaction/flowBuilder.app?flowId=<FLOW_ID>Gotcha: clicking Save alone (without Save As New Version) on an Active flow leaves the Save button greyed out — Flow Builder won't mutate an active flow in place. The version-properties dialog accepts the LLM Targetable click but a plain Save won't persist it. Save As New Version creates a Draft V(n+1); Activate then flips that Draft to Active.
After the form is saved + activated, the technician confirms on-device by opening the form and looking for the mic icon (Step 7's permset is a prerequisite, not the trigger).
Assign the PSLs that came back from Step 0 diagnostic 1, plus the Step 4 permset, to BOTH the admin (so they can validate end-to-end) and the technician (so the mic renders on-device and the LLM call goes through). Every grant is an association-object POST — one row per (user, entitlement) pair. An already-existing assignment returns 400 DUPLICATE_VALUE, which the caller treats as no-op success.
7a. Assign each detected PSL — one POST /services/data/vXX.0/sobjects/PermissionSetLicenseAssign per PSL per user. Resolve PermissionSetLicenseId from the Step 0 diagnostic 1 result:
{ "AssigneeId": "<userId>", "PermissionSetLicenseId": "<pslId>" }Fan out over {admin User Id, technician User Id} × {each PSL from diagnostic 1 — at minimum EinsteinFieldServicePsl and FieldServiceMobilePsl}.
7b. Assign the Step 4 permset — one POST /services/data/vXX.0/sobjects/PermissionSetAssignment per user:
{ "AssigneeId": "<userId>", "PermissionSetId": "<v2fPermsetId>" }7c. Verify the technician's full mobile-user permission stack. Run these four GET /services/data/vXX.0/query reads for TECH_USER_ID and confirm each returns the expected rows. A missing row here is a certain on-device failure with no error message.
SELECT PermissionSetLicense.DeveloperName FROM PermissionSetLicenseAssign
WHERE AssigneeId = :techId AND PermissionSetLicense.DeveloperName = 'FieldServiceMobilePsl'SELECT PermissionSetLicense.DeveloperName FROM PermissionSetLicenseAssign
WHERE AssigneeId = :techId AND PermissionSetLicense.DeveloperName = 'EinsteinFieldServicePsl'SELECT PermissionSet.PermissionsFieldServiceVoiceToForm, PermissionSet.PermissionsFieldServiceVoiceToRecordEdit
FROM PermissionSetAssignment
WHERE AssigneeId = :techId AND PermissionSet.Name = 'EinsteinFieldServiceUser_V2F'SELECT Id, IsActive FROM ServiceResource WHERE RelatedRecordId = :techId AND IsActive = trueSELECT SObjectType, PermissionsRead, PermissionsEdit FROM ObjectPermissions
WHERE ParentId IN (SELECT PermissionSetId FROM PermissionSetAssignment WHERE AssigneeId = :techId)
AND SObjectType IN ('WorkOrder','ServiceAppointment')Common gaps:
Once all four pass, the technician's permission stack is complete. On-device verification (below) is a manual admin task, outside the REST workflow.
The technician logs into the Field Service Mobile app on a device and confirms voice-fill works. This is a human step — the skill has finished configuring the org.
Three things to check, in order:
8a. V2RE — Edit Work Order action appears:
If they don't appear, log out and back in (settings cache).
8b. V2RE mic — voice fills fields:
If the mic appears but voice fails with "We couldn't recommend any updates. Try again." — return to Step 1.5 and re-run the live LLM probe. The Einstein wizard wasn't fully completed.
8c. V2F-DC mic — voice fills DC form:
If the mic doesn't appear on the form, the LLM Targetable click didn't save — re-open in Flow Builder (Step 6), verify the checkbox, save again.
Step 5 short-circuits. The skill hands off to the fs-data-capture-form-deployer skill (sibling skill in this repo) and stops V2F-DC enablement. V2RE is unaffected — Steps 1, 1.5, 2, 4, 7 are sufficient for V2RE alone.
To resume V2F-DC enablement after the DC skill creates at least one form, re-run from Step 5. Steps 0-4 are idempotent.
| Concern | Where it lives | How to change |
|---|---|---|
| Whether mobile workers see the mic at all | EinsteinFieldServiceUser_V2F permset assigned + EinsteinFieldServicePsl PSL assigned + FieldServiceMobilePsl PSL assigned | Step 7 (association-object POSTs) |
| Whether the Einstein LLM runtime is on | enableEinsteinGPT org pref | Setup → Einstein → Get Started wizard (Step 1.5, UI-only) |
| Whether Edit Work Order / Edit SA actions appear | FieldServiceMobileSettings.IsShowEditFullRecord + the FSM Settings row's IsDefault = true (or explicit profile assignment) | Step 2 (sObject PATCH) |
| Whether LDS is on for the mobile app | FieldServiceSettings.Metadata.enableLsdkMode | Step 1 (Tooling Metadata PATCH) |
| Whether V2RE works for a user | FieldServiceVoiceToRecordEdit system perm via the custom permset | Step 4, Step 7 |
| Whether V2F (Beta) works at all in the org | FieldServiceVoiceToForm system perm exists in describe + Customer Org ID feature flag enabled by Salesforce Support | Step 3 describe; CRT to Support if missing |
| Whether V2F is on for a specific DC form | LLM Targetable checkbox in Flow Builder Save dialog (no metadata API path) | Step 6 (browser MCP or deeplink) |
| Which LLM runs the voice-to-text and field mapping | Salesforce-managed | Not customer-configurable |
Mic doesn't appear on the record edit screen (V2RE).
Walk in this order:
FieldServiceMobileSettings.IsShowEditFullRecord = true AND that row has IsDefault = true (Step 2 verify).PermissionsFieldServiceVoiceToRecordEdit = true (Step 7c, item 3).FieldServiceMobilePsl PSL (Step 7c, item 1).Mic doesn't appear on a Data Capture form (V2F).
Walk in this order:
Mic appears but voice fails with "We couldn't recommend any updates. Try again."
This is the most common failure mode. The LLM runtime is off. Walk in this order:
FUNCTIONALITY_NOT_ENABLED: [EinsteinLlm], the runtime is off.promptRecords with at least one row, the runtime is on.If the probe still fails after the wizard, file a CRT with Salesforce Support quoting the org ID and the FUNCTIONALITY_NOT_ENABLED: [EinsteinLlm] error code. SDO and trial orgs occasionally need Salesforce-side enablement even after the wizard completes.
Mic appears, voice transcribes, but fills wrong fields.
The LLM is mapping speech to the wrong field. Two patterns:
Edit Work Order action doesn't appear in the mobile Actions list.
Per mfs_actions_order.xml: the Edit actions appear AFTER Quick Actions, only when IsShowEditFullRecord = true AND the user has Edit access to the object. Walk:
IsShowEditFullRecord = true AND IsDefault = true.Run before declaring Voice to Form enabled in production:
SELECT Id FROM Organization LIMIT 1) returns the expected org.TotalLicenses > 0 and UsedLicenses < TotalLicenses.Metadata.enableLsdkMode value read back after the PATCH, not just the 204).promptRecords. The live LLM call to /einstein/prompt-templates returns at least one row, not FUNCTIONALITY_NOT_ENABLED.FieldServiceMobileSettings.IsShowEditFullRecord = true AND the same row has IsDefault = true (or is explicitly assigned to the technician's profile).EinsteinFieldServiceUser_V2F exists with PermissionsFieldServiceVoiceToRecordEdit = true (and PermissionsFieldServiceVoiceToForm = true when V2F Beta is on).FieldServiceMobilePsl AND EinsteinFieldServicePsl assigned, plus an active ServiceResource row.dispatch REST call dispatched through the Codey runtime. The skill uses no sf CLI, no shell, no local Python or jq, no temp files, no metadata deploy, and no Apex. The one non-REST step (LLM Targetable) uses the agent-native browser MCP or a Setup deeplink — never a shell.DUPLICATE_VALUE treated as success).Ai4mSettings.enableEinsteinGPT returns <missing> even on fully-enabled orgs. The only honest check is the live LLM call in Step 1.5a.Metadata fields. The LDS PATCH sends the entire FieldServiceSettings.Metadata object with one key flipped — a partial body nulls omitted org prefs.The skill cannot perform these via API. Each returns a Setup deeplink for the admin to click:
| When | What | Why |
|---|---|---|
| Step 1.5b | Open /lightning/setup/EinsteinSetup/home, click 'Turn On Einstein', walk every numbered step in the Generative AI sub-page | Flips enableEinsteinGPT org pref. The single most important step. Without it, voice fails with "We couldn't recommend any updates" even though everything else is correct. |
| Step 1 (fallback only) | Open /lightning/setup/FieldServiceSettings/home, enable 'Lightning SDK for Field Service Mobile' | Only if the Tooling Metadata PATCH did not persist on a stubborn SDO/trial template. The PATCH is the primary path. |
| Step 6 (Path B fallback only) | Open each Flow Builder URL, Save As New Version → Show Advanced → tick LLM Targetable → Save → Activate | No metadata API path exists. Path A automates this via the browser MCP; this fallback applies when no browser MCP is in the runtime. |
| Step 8 | On-device: log out and back in to the Field Service Mobile app | Settings + permset cache; the app picks up changes only on a fresh session. |
All sibling skills in this repo:
fs-data-capture-form-deployer — creates a Data Capture form from a Flow Builder spec. Step 5 hands off here when the org has zero forms.fs-data-capture-form-designer — generates a DC form from a natural-language prompt OR a photographed/PDF paper form, then deploys via fs-data-capture-form-deployer.fs-data-capture-form-editor — modifies an existing DC form.configure-field-service-mobile — sets up FSL Mobile org-level settings (LDS, Forms tab visibility, branding); composes with this skill on Step 1 (LDS) and the Forms-tab association needed for V2F-DC to render on mobile.fs-mobile-branding — applies brand colors to the Field Service Mobile app.setting-up-pre-work-brief + customizing-pre-work-brief — sister skills in the same Frontline AI family. PWB renders an AI brief in the Work Order Overview tab; V2F lets the technician dictate into that Work Order's forms or record edit screens. The two compose cleanly: PWB before the visit, V2F during.fs-data-capture-reference — primer on Data Capture concepts; useful background reading.salesforce-agx-* — AGX Flow Builder family (background-flow, screen-flow, data-retrieval-flow, orchestration-flow); useful when authoring a custom DC flow rather than Voice-enabling an existing one.External (Salesforce Help):
https://help.salesforce.com/s/articleView?id=service.mfs_voice_to_form_setup.htmhttps://help.salesforce.com/s/articleView?id=service.mfs_voice_to_record_edit_setup.htmhttps://help.salesforce.com/s/articleView?id=service.mfs_settings_details.htmhttps://help.salesforce.com/s/articleView?id=service.mfs_actions_order.htmhttps://help.salesforce.com/s/articleView?id=service.mfs_data_capture_setup.htmhttps://help.salesforce.com/s/articleView?id=service.mfs_data_capture_buildflow.htmhttps://help.salesforce.com/s/articleView?id=service.mfs_data_capture_limitations.htmhttps://help.salesforce.com/s/articleView?id=ai.generative_ai_enable.htmhttps://help.salesforce.com/s/articleView?id=service.mfs_lightning_data_service.htmFlow.Metadata JSON contains no LLM-related keys. Per-form enablement requires Flow Builder UI. Step 6 Path A drives this agent-natively via the browser MCP (verified end-to-end); Path B falls back to deeplinks for an admin to click. This is the ONLY non-REST step in the skill.PermissionSet.PermissionsFieldServiceVoiceToForm describe column, but cannot toggle it. If missing, file a CRT with Salesforce Support.enableLsdkMode write reports success but doesn't flip; Step 1c re-reads to catch this and falls back to the Setup deeplink.© forcedotcom, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/field-service-voice-to-form-configure of forcedotcom/sf-skills.
Open the folder on GitHubat commit 4bbae5c
Field Service Voice To Form Configure next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Field Service Voice To Form Configure this skillforcedotcom/sf-skills | 1.1k | — | ~11k | Automated safety check: Pass | Apache-2.0 | |
| Soql Lib Query Builderbeyond-the-cloud-dev/soql-lib | 154 | — | ~4.3k | Automated safety check: Pass | MIT | |
| Sf DatacloudJaganpro/sf-skills | 424 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Soql Lib Selectorbeyond-the-cloud-dev/soql-lib | 154 | — | ~2k | Automated safety check: Pass | MIT | |
| Dev SetupPortwood-Global-Solutions/Portwood | 126 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Sf FlowJaganpro/sf-skills | 424 | — | ~1.8k | Automated safety check: Pass | MIT |
beyond-the-cloud-dev/soql-lib
Builds Salesforce SOQL queries using the SOQL Lib fluent builder API (SOQL.cls).
Jaganpro/sf-skills
Salesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows.
beyond-the-cloud-dev/soql-lib
Creates Salesforce Apex selector classes using the SOQL Lib selector pattern.
Portwood-Global-Solutions/Portwood
Get from a fresh clone of Portwood to a working, fully-tested Salesforce org.
Jaganpro/sf-skills
Creates and validates Salesforce Flows with 110-point scoring.
gmapsscraper/google-maps-agent-skills
Export Google Maps business data to CSV, JSON, or CRM format (HubSpot, Pipedrive, Salesforce).
forcedotcom/sf-skills
Declared architecture snapshot for one Agentforce agent: planner, topics, actions, flows, Apex, prompt templates, and NGA plugins.
forcedotcom/sf-skills
Data Cloud 360° view of a single Agentforce session. An agent skill from forcedotcom/sf-skills.
forcedotcom/sf-skills
Apply a Salesforce sandbox post-copy automation JSON config against a target org.
forcedotcom/sf-skills
Apply a Salesforce sandbox post-copy automation JSON config against a target org.
forcedotcom/sf-skills
Apply SLDS-compliant UI using the correct blueprints, styling hooks, utility classes, and icons.
forcedotcom/sf-skills
Lightning Web Components with PICKLES methodology and 165-point scoring.
Works with
Categories
Set up Voice to Form on Field Service Mobile end-to-end against a Salesforce org, covering both variants: Voice to Record Edit (voice-fills any record-edit screen) and Voice to Form Data Capture…. Field Service Voice To Form Configure is an agent skill from forcedotcom/sf-skills. Set up Voice to Form on Field Service Mobile end-to-end against a Salesforce org, covering both variants: Voice to Record Edit (voice-fills any record-edit screen) and Voice to Form Data Capture (voice-fills Discovery Framework / Data Capture forms).
Field Service Voice To Form Configure fits situations like: the user asks to enable; set up Voice to Form; voice to Record Edit; the microphone on the mobile app.
Run `npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a claude-code`. Or copy the skill folder (skills/field-service-voice-to-form-configure in forcedotcom/sf-skills) into .claude/skills/field-service-voice-to-form-configure in your project. Claude Code loads it when a task matches its description.
Run `npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a codex`. Or copy the skill folder (skills/field-service-voice-to-form-configure in forcedotcom/sf-skills) into .agents/skills/field-service-voice-to-form-configure in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add forcedotcom/sf-skills --skill field-service-voice-to-form-configure -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/field-service-voice-to-form-configure, .gemini/skills/field-service-voice-to-form-configure, .github/skills/field-service-voice-to-form-configure and .opencode/skills/field-service-voice-to-form-configure in your project.
Going by SKILL.md and its folder, Field Service Voice To Form Configure needs the command-line tools its instructions call (sf).
SKILL.md names 1 domain. In commands or code: help.salesforce.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Field Service Voice To Form Configure is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 11k tokens (SKILL.md is roughly 45k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Field Service Voice To Form Configure: Soql Lib Query Builder (beyond-the-cloud-dev/soql-lib, 154 stars), Sf Datacloud (Jaganpro/sf-skills, 424 stars), Soql Lib Selector (beyond-the-cloud-dev/soql-lib, 154 stars) and Dev Setup (Portwood-Global-Solutions/Portwood, 126 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
forcedotcom (a GitHub organization) maintains it in forcedotcom/sf-skills, which has 1,067 GitHub stars. The repository holds 252 skills in this directory. The repository was last updated on October 9, 2026.
Source: forcedotcom/sf-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.