Handling Destructive Changes
SkillCloud & infraLets your agent remove components like objects, fields, classes, and flows from a Salesforce org via a delete-and-deploy.
Use Handling Destructive Changes in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Handling Destructive Changes and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the Handling Destructive Changes skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
About this skill
Execute the destructiveChanges.xml delete-and-deploy workflow against a Salesforce org. TRIGGER when the user asks to delete/remove a custom object, field, Apex class, flow, or any metadata component FROM an org, or to perform a 'destructive deploy' / removal as part of a release. Validates first an
What this skill tells your AI
The instructions your AI receives, as published by forcedotcom/sf-skills in plugins/builder/salesforce-development/skills/platform-destructive-deploy/SKILL.md and read by ahel’s review.
Coordinate metadata deletion against a Salesforce org via the destructiveChanges manifest. Runs in three phases: scope → validate → execute, with stricter guardrails for production.
Phase 1 — Scope the deletion
Step 1a — Gather the components to remove
Ask the user (or infer from context) which components to delete. For each, capture:
- Metadata type (e.g.
CustomObject,CustomField,ApexClass,Flow,PermissionSet) - API name (e.g.
Project__c,Account.Status__c,MyController)
Step 1b — Local dependency scan (best-effort)
Before generating the manifest, scan the local project for references to each component. Use Grep over force-app/:
grep -rn "<componentApiName>" force-app/ --include='*.cls' --include='*.trigger' --include='*.xml' --include='*.js' --include='*.html'
If references are found:
- List them to the user
- Recommend either updating those references first OR removing them in the same destructive deploy
- Do NOT proceed silently — surface the dependency risk
Step 1c — Generate destructiveChanges.xml
Write to manifest/destructiveChangesPre.xml (for pre-deploy deletion) or manifest/destructiveChangesPost.xml (for post-deploy deletion). Use the standard Salesforce metadata format:
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Project__c</members>
<members>OldThing__c</members>
<name>CustomObject</name>
</types>
<types>
<members>Account.Status__c</members>
<name>CustomField</name>
</types>
<version>62.0</version>
</Package>
Use the API version from sfdx-project.json's sourceApiVersion.
Group components by metadata type (one <types> block per type). For namespaced fields, use Object.Field notation.
Phase 2 — Validate
ALWAYS validate before executing a destructive deploy:
sf project deploy validate \
--pre-destructive-changes manifest/destructiveChangesPre.xml \
--manifest manifest/package.xml \
--target-org <alias> \
--test-level RunLocalTests \
--json
(For post-destructive: use --post-destructive-changes.)
If package.xml doesn't exist, create an empty one alongside (deletion-only deploy needs a package descriptor):
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<version>62.0</version>
</Package>
If validation fails, surface errors and STOP. Common failure modes:
- "Cannot delete: referenced by Apex/Flow/Layout" → component still has references
- "Cannot delete: required for license" → managed-package or license dependency
- "Insufficient access" → user lacks delete permission
Phase 3 — Execute
Production path
Confirm whether the target is production before executing. The reliable check is the gate's classifier (returns production|sandbox|scratch|trial|devhub|unknown):
sf org display --target-org <alias> --json | "${CLAUDE_PLUGIN_ROOT}/scripts/sf-deploy-gate" classify
If the classifier returns production:
- Display destructive confirmation banner (mirroring
platform-quick-deploy) - List EVERY component that will be deleted
- Require explicit "yes, delete from PRODUCTION" confirmation
- Reject
--purge-on-deleteunless the user types it explicitly
The PreToolUse hook (sf-deploy-gate destructive) will already block bare destructive commands against prod — surface that denial to the user, do not work around it.
Sandbox / Scratch path
sf project deploy start \
--pre-destructive-changes manifest/destructiveChangesPre.xml \
--manifest manifest/package.xml \
--target-org <alias> \
--json \
--wait 30
Add --purge-on-delete only if the user explicitly asked to permanently delete (skip the recycle bin).
Phase 4 — Post-delete cleanup
After a successful destructive deploy:
- Recommend a
sf project retrieve start --metadata <Type>:<Name>is NOT useful (component is gone) — instead suggest cleaning up the local source:# Remove the now-deleted local files to keep source tracking accurate rm -rf force-app/main/default/<path-to-component> - If deleting a custom field with data, remind the user that data is gone (or in the recycle bin until purged)
- Recommend running tests to confirm no runtime regressions
Rules
- ALWAYS validate first; NEVER skip Phase 2
- ALWAYS scan for local references; NEVER delete blindly
- ALWAYS gate production with explicit user confirmation
- NEVER add
--purge-on-deletewithout explicit user request - NEVER use
--ignore-errorson a destructive deploy - ALWAYS use the API version from
sfdx-project.json, not a hardcoded value - If the user is deleting a field with
required="true"or that's used inRecordTypepicklist values, surface the cascade impact before proceeding
Signals
- GitHub stars
- 1k
- Forks
- 351
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
platform-destructive-deploy- Source
- github.com/forcedotcom/sf-skills
github.com/forcedotcom/sf-skills
More in Cloud & infra
Skill · vercel-labs
More in Cloud & infravercel-react-best-practices
Skill · vercel-labs
More in Cloud & infraturborepo
Skill · vercel
More in Cloud & inframicrosoft-foundry
Skill · microsoft
More in Cloud & infraazure-diagnostics
Skill · microsoft
More in Cloud & infrauncloud
Skill · affaan-m
More in Cloud & infra