Sf Debug
Jaganpro/sf-skills
Salesforce debug log analysis and troubleshooting with 100-point scoring.
MUST activate when the user wants to package, distribute, or install/upgrade/uninstall/promote a UI Bundle as a Salesforce second-generation (2GP) package (project may contain uiBundles/ or…
$ npx skills add forcedotcom/sf-skills --skill experience-ui-bundle-2gp-deploy -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-2gp-deploy --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/experience-ui-bundle-2gp-deploy .claude/skills/experience-ui-bundle-2gp-deploy && 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 "experience-ui-bundle-2gp-deploy" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-2gp-deploy into .claude/skills/experience-ui-bundle-2gp-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-2gp-deploy", 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/experience-ui-bundle-2gp-deployType 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 experience-ui-bundle-2gp-deploy -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-2gp-deploy --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/experience-ui-bundle-2gp-deploy .agents/skills/experience-ui-bundle-2gp-deploy && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "experience-ui-bundle-2gp-deploy" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-2gp-deploy into .agents/skills/experience-ui-bundle-2gp-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-2gp-deploy", 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 experience-ui-bundle-2gp-deploy -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-2gp-deploy --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/experience-ui-bundle-2gp-deploy .cursor/skills/experience-ui-bundle-2gp-deploy && 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 "experience-ui-bundle-2gp-deploy" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-2gp-deploy into .cursor/skills/experience-ui-bundle-2gp-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-2gp-deploy", 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/experience-ui-bundle-2gp-deploy--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 experience-ui-bundle-2gp-deploy -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-2gp-deploy --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/experience-ui-bundle-2gp-deploy .gemini/skills/experience-ui-bundle-2gp-deploy && 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 "experience-ui-bundle-2gp-deploy" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-2gp-deploy into .gemini/skills/experience-ui-bundle-2gp-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-2gp-deploy", 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 experience-ui-bundle-2gp-deployInstalls 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 experience-ui-bundle-2gp-deploy -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/experience-ui-bundle-2gp-deploy .github/skills/experience-ui-bundle-2gp-deploy && 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 "experience-ui-bundle-2gp-deploy" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-2gp-deploy into .github/skills/experience-ui-bundle-2gp-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-2gp-deploy", 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 experience-ui-bundle-2gp-deploy -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 experience-ui-bundle-2gp-deploy --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/experience-ui-bundle-2gp-deploy .opencode/skills/experience-ui-bundle-2gp-deploy && 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 "experience-ui-bundle-2gp-deploy" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-2gp-deploy into .opencode/skills/experience-ui-bundle-2gp-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-2gp-deploy", 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.
experience-ui-bundle-2gp-deployMUST activate when the user wants to package, distribute, or install/upgrade/uninstall/promote a UI Bundle as a Salesforce second-generation (2GP) package (project may contain uiBundles/ or…
Experience UI Bundle 2gp Deploy is an agent skill from forcedotcom/sf-skills. MUST activate when the user wants to package, distribute, or install/upgrade/uninstall/promote a UI Bundle as a Salesforce second-generation (2GP) package (project may contain uiBundles/ or sfdx-project.json for packaging tasks; install/upgrade tasks may lack local bundle files). Handles making a bundle packageable, choosing managed/unlocked flavor, creating package/version with sf package, installing/upgrading in another org, and debugging failures. TRIGGER on packaging, 2GP, managed package, unlocked package…
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including scripts and assets (for example `scripts/find-bundle-package-dir.sh`).
It sits in Sales & Support, covering CRM management and Project scaffolding. 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.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 3c15867. 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.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
sfjqnpmnodeFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
developer.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.
Experience UI Bundle 2gp Deploy loads about 5.5k tokens when it runs. Until then it costs about 223 tokens; SKILL.md has 1,951 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); the scripts in this folder are not scanned.
The full file from forcedotcom/sf-skills at commit 3c15867, republished under its Apache-2.0 licence (© forcedotcom). 1,951 words, ~5,483 tokens.
.claude/skills/experience-ui-bundle-2gp-deploy/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.How to take a UI Bundle that already exists in the current project
(under <packageDir>/uiBundles/<name>/, where <packageDir> is the package
directory from sfdx-project.json — commonly force-app/main/default) and ship
it as a second-generation package (2GP), then install / upgrade / uninstall
it in another org.
This is reference knowledge, not a runbook to execute top-to-bottom. The user already has a project and a built (or buildable) bundle. Read their intent and apply only the matching part:
Answer only what was asked. Give the commands for the one part the user
needs plus the org each targets and any genuine caveat — nothing else. Do not
restate the other parts, re-explain the flavor table, or replay the full
build→create→install→promote sequence when the user asked about a single step. A
debug question wants the fix, not a packaging tutorial; an install question wants
the sf package install line and the subscriber-vs-Dev-Hub distinction, not
Part 1 and Part 2. Brevity is correctness here.
| The user wants to… | Go to |
|---|---|
| Decide managed vs. unlocked | Choose a flavor |
| Make the bundle packageable / wire a CustomApplication | Part 1 |
| Create the package or a new version | Part 2 |
| Install / upgrade / uninstall / promote | Part 3 |
| Debug a failure | Part 4 + Troubleshooting |
This skill is for packaging and cross-org distribution (sf package …). For
plain source deploy of a bundle into one org (sf project deploy …), use
experience-ui-bundle-deploy instead. Never sf project generate or
sf template generate ui-bundle here — the project and bundle exist.
MyReactApp / force-app / force-app/main/default are placeholders; substitute
the user's real bundle name and their <packageDir> everywhere they appear
below. Resolve <packageDir> deterministically — never guess [0] in a
multi-package project — with:
packageDir="$(scripts/find-bundle-package-dir.sh <bundleName>)" # walks packageDirectories; picks the entry whose tree contains uiBundles/<bundleName>/Do not assume the default org. Ask the user, or read sf org list, then
restate what you'll use:
devhub) — where the package is created, versions are built, and
source is deployed. Always required.subscriber) — the org you install into. Only required for
install / upgrade / uninstall.sf org list # connected orgs + default Dev Hub
sf org list --json | jq -r '.result.nonScratchOrgs[]?.alias'Rules:
Substitute the real aliases for devhub / subscriber everywhere below.
ID legend (packaging): 0Ho… package · 04t… installable version
(SubscriberPackageVersionId) · 05i… Package2Version · 08c… version-create
request · 0Hf… install request · 06y… uninstall request.
ID legend (runtime, useful when debugging a broken subscriber): 9YE… UI
Bundle row · 9YF… UIBundleApplication junction · 02u… CustomApplication /
TabSet · 0Zu… ManagedContentSpace (workspace) · 0ap… ManagedContentChannel
(WEB_APP). A missing App Launcher tile after install almost always traces back
to one of these being absent or misprovisioned.
2GP needs a manual Setup toggle on the Dev Hub that no CLI command or metadata deploy can flip. Setup → Dev Hub, both on:
Until #2 is on, sf package create returns NOT_FOUND and any Package2 query
returns sObject type 'Package2' is not supported. There is no CLI workaround —
flip the toggle. Verify before starting:
# clean "0 records" = 2GP ON; "sObject type 'Package2' is not supported" = toggle OFF
sf data query --target-org devhub --use-tooling-api --query "SELECT Id FROM Package2 LIMIT 1"
sf org display --target-org devhub --json | jq '.result.isDevHub'All three are 2GP (same sf package CLI). Pick before creating — it drives the
namespace, how the bundle is named on install, and coexistence.
| Managed | Unlocked — namespaced | Unlocked — org-dependent | |
|---|---|---|---|
| Namespace | required | required | none (empty "") |
| Source visibility | hidden (IP-protected) | visible / editable | visible / editable |
| Installs as | ns__Name | ns__Name | bare Name (flat) |
| Coexists with a local same-name bundle | yes (ns-filtered) | yes (ns-filtered) | no — collides |
| Upgrade behavior | clean replace (locked) | replace, overwrites subscriber edits | replace, overwrites subscriber edits |
| Rollback risk on failed upgrade | yes | yes | none |
| Typical use | ISV / AppExchange distribution | org-agnostic sharing, source open | package depends on metadata already in the target org |
Namespaced flavors (managed, unlocked-namespaced) need a namespace registered and linked to this Dev Hub (App Launcher → Namespace Registries). No registered namespace? Use org-dependent unlocked — it needs none.
The namespace lives in a separate Developer Edition (DE) org that owns it; the Dev Hub borrows it via a linked registration. Concretely:
namespace in sfdx-project.json to the linked namespace slug. If the
value here isn't linked to the target Dev Hub, sf package version create
fails with a namespace error (see Troubleshooting).One DE org can carry multiple namespaces, and one Dev Hub can link multiple DE orgs — so a single Dev Hub can build packages under several namespaces. The namespace is locked in at version-create time and travels with every UI Bundle row inside the built version; you cannot change it later.
You do not have to explain this to answer a routine question. Reach for it when
the user asks why: why managed hides source, why namespaced installs are
ns__Name, why some URLs look different, or why an unlocked upgrade wiped
their edits.
*.salesforce.app, distinct from salesforce.com core UI. Tiers:salesforce.com — 1st-party core UI*.salesforce.app — 2nd-party AFS-hosted bundles (no namespace)<ns>.salesforce.app — 3rd-party / namespaced (managed + unlocked-namespaced)
Because each namespace gets its own subdomain, two bundles from different
packages can coexist without cross-origin bleed.getSourceZip() returns null in subscriber orgs — the compiled dist/ is
stored as opaque content and never handed back. For unlocked (namespaced
or org-dependent), the served binary is fully readable by the subscriber.ns__Name
and can coexist with a local same-name bundle. Org-dependent unlocked has no
namespace — it installs as bare Name and collides with a local bundle of
the same developer name.sf package install of a newer 04t…, the platform
compares content-index hashes of each incoming dist/ asset against what's
already stored and skips any asset whose hash is unchanged — a patch that
touches one bundle re-writes only that bundle's changed files. Developer-owned
artifacts (dist/, ui-bundle.json, ISV base permission sets) are replaced;
subscriber-owned state (subscriber-created permission sets, custom metadata,
provisioned domain) is preserved.Prepare the project so it can be packaged and used in-org. Apply only what the request needs.
sfdx-project.jsonThe namespace here decides which flavor you can build (see table above), so set
it deliberately — there is no safe default. Substitute the user's real registered
namespace for <ns>; use "" for org-dependent.
# namespaced (managed / unlocked-namespaced): <ns> MUST be registered & linked to this Dev Hub
node -e "const fs=require('fs'),f='sfdx-project.json',j=JSON.parse(fs.readFileSync(f)); j.sourceApiVersion='68.0'; j.namespace='<ns>'; fs.writeFileSync(f,JSON.stringify(j,null,2))"
# org-dependent unlocked: no namespace
node -e "const fs=require('fs'),f='sfdx-project.json',j=JSON.parse(fs.readFileSync(f)); j.sourceApiVersion='68.0'; j.namespace=''; fs.writeFileSync(f,JSON.stringify(j,null,2))"
cat sfdx-project.json # confirm namespace + sourceApiVersion before packagingnamespace = a registered, linked namespace.namespace as "".dist/ must exist before packagingcd force-app/main/default/uiBundles/MyReactApp # the real bundle dir
npm install --no-audit --no-fund
npm run build
cd -Package or deploy before dist/ exists and the app installs but renders
blank — the bundle ships with its built assets. Always build first.
Skip this step when the bundle is already referenced another way (embedded in a
FlexiPage, Experience Cloud site, etc.). Otherwise read
<SKILL_DIR>/assets/CustomApplication.app-meta.xml (where <SKILL_DIR> is the
absolute path to this skill's own directory), replace every MyReactApp with
the real bundle developer name, and write the result to the user's project
under <packageDir>/applications/. Author <uiBundle> with the bundle's
developer name — inside the same package no prefix is needed; cross-namespace
it resolves as ns__Name (namespaced) or c__Name (no namespace).
The three fields the App Launcher tile actually cares about — installed subscribers won't see a broken tile if they're set correctly:
<uiType>Lightning</uiType> — required for the App Launcher to render it<navType>Standard</navType> — standard navigation container<formFactors>Large</formFactors> — desktop form factor (validation is
install-time only, so a missing/wrong value passes deploy but hides the tile)mkdir -p force-app/main/default/applications
# then write the substituted template to:
# force-app/main/default/applications/<BundleName>.app-meta.xmlpackage create)sf project deploy start --source-dir force-app --target-org devhub --api-version 68.0 --wait 30Read <SKILL_DIR>/assets/PermissionSet.permissionset-meta.xml, replace
MyReactApp with the real bundle name (both in <application> and the label),
write the result into the user's project, then deploy and assign:
mkdir -p force-app/main/default/permissionsets
# write the substituted template to:
# force-app/main/default/permissionsets/<BundleName>_Access.permissionset-meta.xml
sf project deploy start --source-dir force-app/main/default/permissionsets/MyReactApp_Access.permissionset-meta.xml --target-org devhub --api-version 68.0 --wait 30
sf org assign permset --name MyReactApp_Access --target-org devhubNo subscriber org involved. sf package create runs once (registers the
0Ho… container); you build installable 04t… versions repeatedly after. Pick
the one flavor you chose above:
# managed
sf package create --name MyReactApp --package-type Managed --path force-app --target-dev-hub devhub
# unlocked, namespaced (namespace comes from sfdx-project.json)
sf package create --name MyReactApp --package-type Unlocked --path force-app --target-dev-hub devhub
# unlocked, org-dependent (no namespace)
sf package create --name MyReactApp --package-type Unlocked --org-dependent --path force-app --target-dev-hub devhubThen build a version:
sf package version create --package MyReactApp --installation-key-bypass --wait 20 --target-dev-hub devhub
# a specific/patch version instead:
sf package version create --package MyReactApp --version-number 1.0.1 --wait 20 --target-dev-hub devhub--version-number 1.0.0.NEXT auto-bumps the build number; a fixed 1.0.1 pins
it. --installation-key-bypass builds an unprotected version (no key to
install); omit it and pass --installation-key <key> to gate installs.
--wait can time out while the build sits queued, losing the request handle.
Submit async, capture the 08c… id, poll:
REQ=$(sf package version create --package MyReactApp --installation-key-bypass \
--skip-validation --target-dev-hub devhub --json | jq -r '.result.Id')
echo "request: $REQ"
while :; do
J=$(sf package version create report -i "$REQ" --target-dev-hub devhub --json)
ST=$(echo "$J" | jq -r '.result[0].Status'); echo "status: $ST"
case "$ST" in
Success) echo "$J" | jq -r '.result[0].SubscriberPackageVersionId'; break;;
Error) echo "$J" | jq -r '.result[0].Error[]? // "build failed"'; break;;
esac
sleep 30
done--skip-validation is faster but produces a beta version (can't be promoted,
and beta can't upgrade beta — see Part 3). Drop it for a releasable build. Resume
a queued build anytime:
sf package version create report -i 08c… --target-dev-hub devhub
Confirm the subscriber alias first (Step 0). Everything here hits the subscriber — except promote, which runs on the Dev Hub.
# fresh install
sf package install --package 04t… --target-org subscriber --wait 10
# add --installation-key <key> if the version was built with one
# add --publish-wait 10 to wait for the version to finish publishing
# upgrade (newer version over the old)
sf package install --package 04t…v2 --target-org subscriber --upgrade-type Mixed --wait 10
# --upgrade-type: Mixed (default) | DeprecateOnly | Delete (destructive — care)
# uninstall
sf package uninstall --package 04t… --target-org subscriber --wait 20
# promote a managed version to released/immutable — runs on the DEV HUB, irreversible
sf package version promote --package 04t… --target-dev-hub devhubBeta can't upgrade beta. A --skip-validation (beta) v0.2 over a beta v0.1
fails with "Cannot upgrade beta package." Either promote v0.1 (managed) or
uninstall v0.1 first, then install v0.2.
Unlocked upgrades overwrite subscriber edits to the bundle. Org-dependent has no rollback on a failed upgrade; namespaced flavors do.
sf package install --wait can exit 0 while the request is still IN_PROGRESS —
a false success. Verify:
sf package install --package 04t… --target-org subscriber --wait 20 --no-prompt
sf package installed list --target-org subscriber --json \
| jq -r '.result[]? | select(.SubscriberPackageVersionId=="04t…") | .SubscriberPackageVersionId'Prints nothing → still processing server-side; poll sf package installed list
a few minutes before concluding it failed.
Mostly read-only. Reach for these to diagnose a failure or inspect state.
# Dev Hub state
sf org display --target-org devhub --json | jq '{isDevHub:.result.isDevHub, user:.result.username, instance:.result.instanceUrl, api:.result.apiVersion}'
# Is 2GP on? (the #1 root cause)
sf data query --target-org devhub --use-tooling-api --query "SELECT Id, Name, NamespacePrefix, ContainerOptions FROM Package2"
# Packages & versions on the Dev Hub
sf package list --target-dev-hub devhub
sf package version list --packages MyReactApp --target-dev-hub devhub --verbose
# Version-create failures — status + Error[]
sf package version create list --target-dev-hub devhub
sf package version create report -i 08c… --target-dev-hub devhub
sf data query --target-org devhub --use-tooling-api \
--query "SELECT Id, Status, Package2Id, Error FROM Package2VersionCreateRequest ORDER BY CreatedDate DESC LIMIT 5"
# A version's details
sf package version report --package 04t… --target-dev-hub devhub
# What's installed in the subscriber
sf package installed list --target-org subscriber --json \
| jq -r '.result[]? | "\(.SubscriberPackageName) \(.SubscriberPackageVersionNumber) \(.SubscriberPackageVersionId)"'
# Install/uninstall stuck IN_PROGRESS
sf package install report --request-id 0Hf… --target-org subscriber
sf package uninstall report --request-id 06y… --target-org subscriber
# Deploy failures (before you can even package)
sf project deploy start --source-dir force-app --target-org devhub --dry-run --wait 30
sf project deploy report --target-org devhub
# Bundle renders blank — confirm built assets shipped
ls -la force-app/main/default/uiBundles/MyReactApp/dist| Symptom | Cause / fix |
|---|---|
sObject type 'Package2' is not supported | 2GP toggle OFF — Setup → Dev Hub → enable "Unlocked & Second-Gen Managed Packages" (manual, no CLI fix). |
sf package create → NOT_FOUND | Same — 2GP not provisioned. Enable toggle, re-auth. |
isDevHub: false/null after enabling | Cached CLI login — re-auth. Trust the Package2 query + package create, not the cached flag. |
version create hangs / --wait times out | Build queued. Use the async submit + version create report -i 08c… poll; resume later with the same id. |
install --wait exits 0 but app missing | Still IN_PROGRESS server-side. Confirm with sf package installed list; poll a few minutes. |
| "Cannot upgrade beta package" | Beta can't upgrade beta. Promote v0.1 (managed) or uninstall it first, then install v0.2. |
| Namespace error on managed/namespaced build | Namespace not registered/linked to this Dev Hub (App Launcher → Namespace Registries), or switch to org-dependent unlocked (no namespace). |
| App installs but renders blank | Bundle not built before deploy/package — npm run build, confirm dist/, redeploy, rebuild the version. |
| Installed into the wrong org | Wrong alias confirmed in Step 0. Re-check sf org list; subscriber ≠ devhub. |
| Org-dependent bundle collides with a local one | Both use a bare (null-prefix) name. Use a namespaced flavor, or rename. |
package create
(once) → package version create (each release) → install → promote
(managed only).sf package CLI; see the "Unlocked
Packages" section of the same guide for the unlocked-namespaced and
org-dependent flavors.© 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
SKILL.md and 3 other files (scripts, assets) in skills/experience-ui-bundle-2gp-deploy of forcedotcom/sf-skills.
Open the folder on GitHubat commit 3c15867
Experience UI Bundle 2gp Deploy 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 |
|---|---|---|---|---|---|---|
| Experience UI Bundle 2gp Deploy this skillforcedotcom/sf-skills | 1.1k | — | ~5.5k | Automated safety check: Pass | Apache-2.0 | |
| Sf DebugJaganpro/sf-skills | 424 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Sf ApexJaganpro/sf-skills | 424 | — | ~2k | Automated safety check: Pass | MIT | |
| Churn Riskindranilbanerjee/digital-marketing-pro | 854 | 1 repos | ~2.4k | Automated safety check: Pass | MIT | |
| Lead Importindranilbanerjee/digital-marketing-pro | 854 | 1 repos | ~3.3k | Automated safety check: Pass | MIT | |
| Pipeline Updateindranilbanerjee/digital-marketing-pro | 854 | 1 repos | ~3.3k | Automated safety check: Pass | MIT |
Jaganpro/sf-skills
Salesforce debug log analysis and troubleshooting with 100-point scoring.
Jaganpro/sf-skills
Generates and reviews Salesforce Apex code with 150-point scoring.
indranilbanerjee/digital-marketing-pro
Score customer segments for churn risk from behavioral signals — email engagement decline, purchase recency, usage drops, support sentiment — producing a 0-100 risk scorecard with four tiers…
indranilbanerjee/digital-marketing-pro
Import leads into Salesforce, HubSpot, Zoho, or Pipedrive with validation, deduplication against existing CRM records, lead scoring, consent and compliance checks, and source attribution — then push…
indranilbanerjee/digital-marketing-pro
Update CRM deals — move stages, change values and close dates, attach notes and activities, create follow-up tasks — with validation against pipeline rules, a before-and-after comparison, and…
majiayu000/claude-skill-registry
Pipeline analysis composite. An agent skill from majiayu000/claude-skill-registry.
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
MUST activate when the user wants to package, distribute, or install/upgrade/uninstall/promote a UI Bundle as a Salesforce second-generation (2GP) package (project may contain uiBundles/ or…. Experience UI Bundle 2gp Deploy is an agent skill from forcedotcom/sf-skills.json for packaging tasks; install/upgrade tasks may lack local bundle files).
Experience UI Bundle 2gp Deploy fits situations like: wants to package; install/upgrade/uninstall/promote a UI Bundle as a Salesforce second-generation (2GP) package (project may contain uiBundles/; sfdx-project.json for packaging tasks; install/upgrade tasks may lack local bundle files).
Run `npx skills add forcedotcom/sf-skills --skill experience-ui-bundle-2gp-deploy -a claude-code`. Or copy the skill folder (skills/experience-ui-bundle-2gp-deploy in forcedotcom/sf-skills) into .claude/skills/experience-ui-bundle-2gp-deploy in your project. Claude Code loads it when a task matches its description.
Run `npx skills add forcedotcom/sf-skills --skill experience-ui-bundle-2gp-deploy -a codex`. Or copy the skill folder (skills/experience-ui-bundle-2gp-deploy in forcedotcom/sf-skills) into .agents/skills/experience-ui-bundle-2gp-deploy 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 experience-ui-bundle-2gp-deploy -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/experience-ui-bundle-2gp-deploy, .gemini/skills/experience-ui-bundle-2gp-deploy, .github/skills/experience-ui-bundle-2gp-deploy and .opencode/skills/experience-ui-bundle-2gp-deploy in your project.
Going by SKILL.md and its folder, Experience UI Bundle 2gp Deploy needs a shell for the scripts in its folder and the command-line tools its instructions call (sf, jq, npm and node). Our summary lists: Node.js; A Bash shell.
SKILL.md names 1 domain. As links in the text: developer.salesforce.com. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Experience UI Bundle 2gp Deploy 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 5.5k tokens (SKILL.md is roughly 22k 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 Experience UI Bundle 2gp Deploy: Sf Debug (Jaganpro/sf-skills, 424 stars), Sf Apex (Jaganpro/sf-skills, 424 stars), Churn Risk (indranilbanerjee/digital-marketing-pro, 854 stars) and Lead Import (indranilbanerjee/digital-marketing-pro, 854 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,058 GitHub stars. The repository holds 248 skills in this directory. The repository was last updated on October 3, 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.