platform-custom-field-generate

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, referencin

By forcedotcom · 5,815 installs

npx skills add forcedotcom/sf-skills --skill platform-custom-field-generate

Source repository · Upstream listing

Salesforce Custom Field Generator and Validator Overview Generates and validates Salesforce CustomField metadata XML, with special handling for the highest failure rate types — Roll Up Summary and Master Detail. The agent must verify the constraints below before outputting XML to prevent Metadata API deployment errors. 1. Universal Mandatory Attributes Every generated field must include these tags: Attribute Requirement Notes <fullName Required Field name only: derive from <label — capitalize each word, replace spaces with , append c . Must start with a letter. E.g., label Total Contract Value → Total Contract Value c . This rule is for the FIELD name. Picklist VALUE <fullName is different — keep it exactly as the user spelled it, spaces and all, no c (e.g. Closed Won , NOT Closed Won ). See [ references/advanced picklists.md ](references/advanced picklists.md) (ref §3). <label Required The UI name (Title Case) <description Always include Explain the business reason why this field exists. <inlineHelpText Always include Actionable end user guidance that adds value beyond the label (e.g., "Enter the value in USD including tax", not "The amount"). <description and <inlineHelpText are mandatory even though the Metadata API does not enforce them — omitting them yields low quality metadata. File path (SFDX source format): save each field as force app/main/default/objects/<Object /fields/<FieldName c.field meta.xml , where <Object is the object's API name ( Account , Opportunity , or a custom Inventory Item c ). A correct XML at the wrong path is never seen by the Metadata API. External ID Configuration Trigger: If the user mentions "integration," "importing data," "external system ID," or "unique key from [System Name]," set <externalId true</externalId . Applicable Types: Text, Number, Email 2. Precision, Scale, and Length Rules To ensure deployment success, follow these mathematical constraints: Precision vs. Scale Rules precision is the total digits; scale is the decimal digits Rule: precision ≤ 18 AND scale ≤ precision Calculation: Digits to the left of decimal = precision scale The "Fixed 255" Rule TextArea: do NOT include <length — the API fixes it at 255 implicitly and rejects an explicit value ("Can not specify 'length' for a CustomField of type TextArea"). The field needs only <fullName , <label , and <type TextArea</type . Visible Lines Mandatory for Long/Rich text and Multi select picklists to control UI height. 3. Field Data Types 3.1 Simple Attribute Types Type <type Value Required Attributes Auto Number AutoNumber displayFormat (must include {0} ), startingNumber Checkbox Checkbox Default defaultValue to false Date Date No precision/length required Date/Time DateTime No precision/length required Email Email Built in format validation Lookup Relationship Lookup referenceTo , relationshipName , deleteConstraint Master Detail Relationship MasterDetail referenceTo , relationshipName , relationshipOrder Number Number precision , scale Currency Currency Default precision: 18, scale: 2 Percent Percent Default precision: 5, scale: 2 Phone Phone Standardizes phone number formatting Picklist Picklist valueSet containing EITHER valueSetDefinition (inline) OR valueSetName (reference); restricted (see "Picklist restricted default" below; advanced cases in §3.4) Text Text length (Max 255) Text Area TextArea None — do NOT include <length ; the API fixes length at 255 implicitly Text (Long) LongTextArea length , visibleLines (default 3) Text (Rich) Html length , visibleLines (default 25) Time Time Stores time only (no date) URL Url Validates for protocol and format 3.2 Computed & Multi Value Types Type <type Value Required Attributes Formula Result type (e.g., Number ) formula , formulaTreatBlanksAs Roll Up Summary Summary See Section 5 for complete requirements Multi Select Picklist MultiselectPicklist valueSet , visibleLines (default 4) 3.3 Specialized Types Type <type Value Required Attributes Geolocation Location scale , displayLocationInDecimal Picklist restricted default Always set <restricted true</restricted inside <valueSet unless the user explicitly says the picklist should accept custom values not in the admin defined list (e.g. "unrestricted"/"open"). Restricted sets are capped at 1,000 total values (active + inactive). Minimal inline shape: 3.4 Advanced Picklists The inline <valueSetDefinition above is the simple case. Full rules and worked correct/incorrect examples for everything below are in [ references/advanced picklists.md ](references/advanced picklists.md) — load it for any non trivial picklist. Section numbers in parentheses below (e.g. "ref §1") point to that reference file, not to this skill. The hard rules: Value set reference (ref §1). A <valueSet holds EITHER <valueSetName (reference) OR <valueSetDefinition (inline) — never both . Reference by the bare developer name — Standard set Industry , GlobalValueSet Priority Levels with NO gvs and no c (the gvs suffix is org storage display only; the Metadata API uses the bare name). A value set backed field is <restricted true</restricted . Creating the value set is the platform value set generate skill's job; this one only references it. Value name fidelity (ref §3). A picklist value's <fullName / <label keep the user's exact text including spaces ( Closed Won , never Closed Won ). The space→ + c rule is for the FIELD name only. Dependent picklists (ref §2). Use the modern API 38.0+ form: <controllingField + one <valueSettings ( <controllingFieldValue + <valueName ) per pair; never the legacy <picklist / <picklistValues / <controllingFieldValues tags. Both controlling and dependent fields MUST be <restricted true</restricted , even if the request doesn't say so. Enhanced value attributes (ref §3). <value entries also accept <color (hex, leading ), <isActive ( false retires a value), and a value level <description . Scoping a picklist to a record type (ref §5). Per record type value visibility lives on the RecordType ( <picklistValues ), not the field. The RecordType file carries its own <fullName (bare developer name). First decide if the object needs a BusinessProcess: only Opportunity / Lead / Case / Solution require one — they won't deploy without a <businessProcess ( Required field is missing: businessProcess ), even when only a custom picklist is filtered. There you emit two coupled files : the businessProcesses/<Name .businessProcess meta.xml file AND a matching <businessProcess <Name </businessProcess inside the <RecordType (after <active , before <picklistValues ; the <fullName in the BP file is bare , never object qualified). Custom objects ( c ) and all other standard objects (Account, Contact, …) need NO BusinessProcess — emit the RecordType alone; do not invent one. Scope limit: picklist value visibility per record type only — NOT general record type authoring (compact layouts, page layouts, branding). 4. Master Detail Relationship Rules CRITICAL Master Detail fields have strict attribute restrictions that differ from Lookup fields. Violating these rules causes deployment failures. Forbidden Attributes on Master Detail Fields NEVER include these attributes on Master Detail fields: Forbidden Attribute Why What Happens <required Master Detail is ALWAYS required by design Deployment error <deleteConstraint Master Detail ALWAYS cascades deletes Deployment error <lookupFilter Only supported on Lookup fields Deployment error Master Detail vs Lookup Comparison Attribute Master Detail Lookup <required FORBIDDEN Optional <deleteConstraint FORBIDDEN (always CASCADE) Required ( SetNull , Restrict , Cascade ) <lookupFilter FORBIDDEN Optional <relationshipOrder Required (0 or 1) Not applicable <reparentableMasterDetail Optional Not applicable <writeRequiresMasterRead Optional Not applicable INCORRECT — Master Detail with forbidden attributes: Errors: Master Detail Relationship Fields Cannot be Optional or Required · Can not specify 'deleteConstraint' for a CustomField of type MasterDetail · Lookup filters are only supported on Lookup Relationship Fields CORRECT — Master Detail field: CORRECT — Lookup field (with optional attributes): Additional Master Detail Rules Relationship Order: First Master Detail on object = 0 , second = 1 Relationship Name: Must be a plural PascalCase string (e.g., Travel Bookings ) Junction Objects: Use two Master Detail fields for standard many to many (enables Roll ups) Limit: Maximum 2 Master Detail relationships per object. Use Lookup for additional relationships. 5. Roll Up Summary Field Rules CRITICAL Roll up Summary fields have the highest deployment failure rate . Follow these rules exactly. Required Elements for Roll Up Summary Element Requirement Format <type Required Always Summary <summaryOperation Required count , sum , min , or max <summaryForeignKey Required ChildObject c.MasterDetailField c <summarizedField Conditional Required for sum , min , max . NOT for count Forbidden Elements on Roll Up Summary NEVER include these attributes on Roll Up Summary fields: Forbidden Attribute Why <precision Summary inherits from summarized field <scale Summary inherits from summarized field <required Not applicable to Summary fields <length Not applicable to Summary fields Format Rules for summaryForeignKey and summarizedField CRITICAL: Both summaryForeignKey and summarizedField MUST use the fully qualified format: Decision Logic: summaryForeignKey = ChildObject c.MasterDetailFieldOnChild c summarizedField = ChildObject c.FieldToSummarize c INCORRECT — Roll Up Summary with common errors: Errors: Can not specify 'precision' for a CustomField of type Summary Must specify the name in the CustomObject.CustomField format (e.g. Account.MyNewCustomField) CORRECT — Roll Up Summary (SUM operation): COUNT: like SUM but omit <summarizedField (keep <summaryForeignKey ). MIN / MAX: like SUM with <summaryOperation min</summaryOperation or max . Roll Up Summary Quick Reference Operation summarizedField Required? Use Case count NO Count number of child records sum YES Add up numeric values min YES Find smallest value max YES Find largest value Roll Up Summary Prerequisites Roll Up Summary fields can ONLY be created on the parent object in a Master Detail relationship The child object MUST have a Master Detail field pointing to this parent The summarized field must exist on the child object 6. Formula Field Rules Formula Result Types A Formula is not a type itself. The <formula tag is added to a field whose <type is the result data type ( Checkbox , Currency , Date , DateTime , Number , Percent , Text ). A formula field never carries <length — not even a Text result formula. The API rejects it: Can not specify a length for CustomFields that have a formula . Formula XML Generation Rules The contents of the <formula tag MUST be wrapped in <![CDATA[ ... ]] , so the parser does not read formula operators ( & , < ,