
Salesforce Development
Ship CRM features on Salesforce with LWC, Apex, APIs, and DX scratch-org workflows without guessing platform idioms.
Install
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill salesforce-developmentWhat is this skill?
- LWC patterns with @wire, Lightning Data Service, and Apex-backed reactive data
- Apex triggers and classes with platform-appropriate bulk and governor-limit awareness
- REST and Bulk API integration patterns for external systems
- Connected Apps and OAuth-style app registration on the platform
- Salesforce DX: scratch orgs and second-generation packages (2GP)
Adoption & trust: 498 installs on skills.sh; 40.1k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Entra App Registrationmicrosoft/azure-skills
Azure Aigatewaymicrosoft/azure-skills
Lark Openapi Explorerlarksuite/cli
Supabasesupabase/agent-skills
Firebase Auth Basicsfirebase/agent-skills
Firebase Data Connectfirebase/agent-skills
Journey fit
Primary fit
Salesforce work is product construction on a hosted platform—components, server logic, and external APIs land in Build. The skill centers Connected Apps, REST/Bulk APIs, and packaged DX flows that wire your app into Salesforce and third parties.
Common Questions / FAQ
Is Salesforce Development safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Salesforce Development
# Salesforce Development Expert patterns for Salesforce platform development including Lightning Web Components (LWC), Apex triggers and classes, REST/Bulk APIs, Connected Apps, and Salesforce DX with scratch orgs and 2nd generation packages (2GP). ## Patterns ### Lightning Web Component with Wire Service Use @wire decorator for reactive data binding with Lightning Data Service or Apex methods. @wire fits LWC's reactive architecture and enables Salesforce performance optimizations. // myComponent.js import { LightningElement, wire, api } from 'lwc'; import { getRecord, getFieldValue } from 'lightning/uiRecordApi'; import getRelatedRecords from '@salesforce/apex/MyController.getRelatedRecords'; import ACCOUNT_NAME from '@salesforce/schema/Account.Name'; import ACCOUNT_INDUSTRY from '@salesforce/schema/Account.Industry'; const FIELDS = [ACCOUNT_NAME, ACCOUNT_INDUSTRY]; export default class MyComponent extends LightningElement { @api recordId; // Passed from parent or record page // Wire to Lightning Data Service (preferred for single records) @wire(getRecord, { recordId: '$recordId', fields: FIELDS }) account; // Wire to Apex method (for complex queries) @wire(getRelatedRecords, { accountId: '$recordId' }) wiredRecords({ error, data }) { if (data) { this.relatedRecords = data; this.error = undefined; } else if (error) { this.error = error; this.relatedRecords = undefined; } } get accountName() { return getFieldValue(this.account.data, ACCOUNT_NAME); } get isLoading() { return !this.account.data && !this.account.error; } // Reactive: changing recordId automatically re-fetches } // myComponent.html <template> <lightning-card title={accountName}> <template if:true={isLoading}> <lightning-spinner alternative-text="Loading"></lightning-spinner> </template> <template if:true={account.data}> <p>Industry: {industry}</p> </template> <template if:true={error}> <p class="slds-text-color_error">{error.body.message}</p> </template> </lightning-card> </template> // MyController.cls public with sharing class MyController { @AuraEnabled(cacheable=true) public static List<Contact> getRelatedRecords(Id accountId) { return [ SELECT Id, Name, Email, Phone FROM Contact WHERE AccountId = :accountId WITH SECURITY_ENFORCED LIMIT 100 ]; } } ### Context - building LWC components - fetching Salesforce data - reactive UI ### Bulkified Apex Trigger with Handler Pattern Apex triggers must be bulkified to handle 200+ records per transaction. Use handler pattern for separation of concerns, testability, and recursion prevention. // AccountTrigger.trigger trigger AccountTrigger on Account ( before insert, before update, before delete, after insert, after update, after delete, after undelete ) { new AccountTriggerHandler().run(); } // TriggerHandler.cls (base class) public virtual class TriggerHandler { // Recursion prevention private static Set<String> executedHandlers = new Set<String>(); public void run() { String handlerName = String.valueOf(this).split(':')[0]; // Prevent recursion String contextKey = handlerName + '_' + Trigger.operationType; if (executedHandlers.contains(contextKey)) { return; } executedHandlers.add(contextKey); switch on Trigger.operationType { when BEFORE_INSERT { this.beforeInsert(); } when BEFORE_UPDATE { this.beforeUpdate(); } when BEFORE_DELETE { this.beforeDelete(); } when AFTER_INSERT { this.afterInsert(); } when AFTER_UP