agentforce-architectur…
Declared architecture snapshot for one Agentforce agent: planner, topics, actions, flows, Apex, prompt templates, and NGA…
Apply a Salesforce sandbox post-copy automation JSON config against a target org. Use when the user asks to apply, run, execute, dry-run, or preview a post-copy or post-refresh config file (e.g. `post-copy-config.json`) against a sandbox — including activating/deactivating a
Claude Code
$ npx -y skills add forcedotcom/sf-skills --skill automation-sandbox-post-copy-configure --agent claude-code
Codex
$ npx skills add forcedotcom/sf-skills --skill automation-sandbox-post-copy-configure -a codex -y
Cursor
$ npx skills add forcedotcom/sf-skills --skill automation-sandbox-post-copy-configure -a cursor -y
Gemini CLI
$ npx skills add forcedotcom/sf-skills --skill automation-sandbox-post-copy-configure -a gemini-cli -y
GitHub Copilot
$ npx skills add forcedotcom/sf-skills --skill automation-sandbox-post-copy-configure -a github-copilot -y
OpenCode
$ npx skills add forcedotcom/sf-skills --skill automation-sandbox-post-copy-configure -a opencode -y
Windsurf
$ npx skills add forcedotcom/sf-skills --skill automation-sandbox-post-copy-configure -a windsurf -y
name: automation-sandbox-post-copy-configure
description: "Apply a Salesforce sandbox post-copy automation JSON config against a target org. Use when the user asks to apply, run, execute, dry-run, or preview a post-copy or post-refresh config file (e.g. `post-copy-config.json`) against a sandbox — including activating/deactivating a Flow (PATCH `FlowDefinition.Metadata.activeVersionNumber` to the version, or `null`), re-pointing an OBM endpoint, updating a RemoteSiteSetting URL, or re-scheduling a ScheduledApex job after refresh. Also trigger for phrasings like \"apply post-copy config\", \"run post-copy automation\", \"activate Flow <name> post-refresh\", \"deactivate Flow <name>\", \"re-point outbound messages after refresh\", or \"configure sandbox after refresh\". Per entry, derive the Tooling API sobject, verify via describe, resolve the Id via SOQL, then PATCH the compound `Metadata` field (`ScheduledApex` uses anonymous Apex). DO NOT TRIGGER for generating config JSON from an SOP (use `automation-sandbox-post-copy-config-generate`) or for deploying metadata XML."
allowed-tools: Bash Read Write
metadata:
relatedSkills:
- "automation-sandbox-post-copy-config-generate"
- "dx-org-permission-set-assign"
- "platform-metadata-deploy"
version: "1.3"
domains: ["Automation"]
cliTools:
- tool: ["curl"]
semver: ">=7.0.0"
- tool: ["jq"]
semver: ">=1.6"
- tool: ["node"]
semver: ">=18.0.0"
- tool: ["sf"]
semver: ">=2.0.0"Apply a Salesforce sandbox post-copy automation JSON config to a target org. Four canonical `ConfigurationName` values are pinned: `OutboundMessages` + `RemoteSiteSettings` → compound-`Metadata` PATCH (Steps A–E); `ScheduledApex` → anonymous-Apex (Step F) since `CronTrigger` is read-only; `Flows` → flow-activation (Step G), same compound-`Metadata` transport as A–E with fixed mutation key `activeVersionNumber` + state-aware pre-flight (`ALREADY_ACTIVE` / `ALREADY_INACTIVE`). Non-canonical names are derived + describe-verified. Every A–E entry must pass Step B (describe 200 + `Metadata` compound field) before any PATCH is planned; Step B skipped for `ScheduledApex`. Unverified entries are surfaced in the summary and skipped — never guessed at.
**Use ONLY the Bash tool** to execute `sf` CLI commands (`sf data query --use-tooling-api`, `sf api request rest`, `sf org display`). Do NOT use MCP tools like `execute_soql` — the compound `Metadata` PATCH pattern this skill requires is not available through MCP wrappers. Invoke `sf` **without** `--target-org` when the user didn't name an alias (the harness sets the CLI default); never pass `--target-org default` (`NamedOrgNotFoundError`). SOQL-over-REST is same-OAuth — no direct DB / non-Salesforce SQL access.
Never call the org from memory. Before the first request:
1. Read the config JSON end-to-end from the exact path the user gave (default `./post-copy-config.json`). Every entry must have all five keys (`ConfigurationName`, `Label`, `Fields`, `IsActive`, `ExecutionOrder`). If any entry is malformed, abort and surface the file path + entry index — do **not** partially apply. **Do not invent entries.** If the file is missing, stop and ask; never fabricate a plan against synthetic labels. 2. For each distinct `ConfigurationName` in the config, run the derivation + describe-verify step (below) **before** planning any PATCH. An entry whose API cannot be verified must never appear as a planned PATCH — it is rejected up front. 3. Confirm the target org alias with the user unless they supplied one explicitly. This skill mutates a live org — writing to the wrong org (e.g., a production alias set as default) is the most expensive failure mode.
If you announce "I will apply … now" without having read the config file and run the describe-verify for every distinct `ConfigurationName`, stop and do those first.
---
The skill carries a pinned mapping for the canonical types below, and a derive-then-verify path for anything else. Follow these steps **for every entry**, in order. `Step B` (describe-verify) is mandatory regardless of whether the mapping came from the pinned table or the derive path — its HTTP status must appear in the summary.
**Pinned canonicals (authoritative — use these exactly, do NOT substitute a different sobject name):**
| ConfigurationName | Tooling API sobject | Record-lookup SOQL | |-------------------|---------------------|--------------------| | `OutboundMessages` | `WorkflowOutboundMessage` | `SELECT Id, FullName FROM WorkflowOutboundMessage WHERE EntityDefinition.QualifiedApiName = '<Fields.Object>'` — then client-side pick the row whose `FullName == '<Fields.Object>.<Label>'`. SOQL cannot filter on `FullName` directly for this sobject. | | `RemoteSiteSettings` | `RemoteProxy` | `SELECT Id, SiteName FROM RemoteProxy WHERE SiteName = '<Label>'`. | | `ScheduledApex` | `CronTrigger` (read-only — Anonymous Apex route, see Step F) | See Step F — pre-flight `SELECT Id FROM CronTrigger WHERE CronJobDetail.Name = '<escaped>'` gate. | | `Flows` | `FlowDefinition` (compound-`Metadata` PATCH with fixed `activeVersionNumber` mutation — see Step G) | See Step G — pre-flight `SELECT Id, DeveloperName, ActiveVersion.VersionNumber FROM FlowDefinition WHERE DeveloperName = '<Fields.FlowApiName>'`. |
For canonical entries use the pinned sobject + SOQL as-is; skip "derive". Do not invent `OutboundMessage`, `RemoteSiteSetting`, or `MasterLabel` variants. Field-name resolution (overrides + case rule
**Non-canonical**: derive a candidate (usually singular of the Metadata API type name); Step B rules out wrong guesses.
This repository provides Salesforce agent skills, plugins, and sample apps for building applications.
Declared architecture snapshot for one Agentforce agent: planner, topics, actions, flows, Apex, prompt templates, and NGA…
Use this skill to Upgrade Einstein Bots into Agentforce agents end-to-end in a single pass, orchestrating per-bot Agent Spec…
Data Cloud 360° view of a single Agentforce session. TRIGGER when user asks to trace, inspect, summarize, or describe a specific…
Build, modify, audit, repair, optimize, debug, and deploy agents with Agentforce Agent Script. TRIGGER when: user creates,…
Analyze production Agentforce agent behavior using session traces and Data Cloud, and manage Agent Health Monitoring (AHM)…
Use to design an AI agent persona — identity, voice, tone, behavioral style, guardrails — and encode it into Agent Script (.agent…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.