Sf Integration
Jaganpro/sf-skills
Salesforce integration architecture with 120-point scoring. An agent skill from Jaganpro/sf-skills.
MUST activate when the project contains a uiBundles//src/ directory and the task involves uploading, attaching, or dropping files.
$ npx skills add forcedotcom/sf-skills --skill experience-ui-bundle-file-upload-generate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-file-upload-generate --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-file-upload-generate .claude/skills/experience-ui-bundle-file-upload-generate && 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-file-upload-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-file-upload-generate into .claude/skills/experience-ui-bundle-file-upload-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-file-upload-generate", 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-file-upload-generateType 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-file-upload-generate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-file-upload-generate --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-file-upload-generate .agents/skills/experience-ui-bundle-file-upload-generate && 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-file-upload-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-file-upload-generate into .agents/skills/experience-ui-bundle-file-upload-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-file-upload-generate", 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-file-upload-generate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-file-upload-generate --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-file-upload-generate .cursor/skills/experience-ui-bundle-file-upload-generate && 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-file-upload-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-file-upload-generate into .cursor/skills/experience-ui-bundle-file-upload-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-file-upload-generate", 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-file-upload-generate--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-file-upload-generate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install forcedotcom/sf-skills experience-ui-bundle-file-upload-generate --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-file-upload-generate .gemini/skills/experience-ui-bundle-file-upload-generate && 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-file-upload-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-file-upload-generate into .gemini/skills/experience-ui-bundle-file-upload-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-file-upload-generate", 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-file-upload-generateInstalls 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-file-upload-generate -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-file-upload-generate .github/skills/experience-ui-bundle-file-upload-generate && 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-file-upload-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-file-upload-generate into .github/skills/experience-ui-bundle-file-upload-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-file-upload-generate", 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-file-upload-generate -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-file-upload-generate --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-file-upload-generate .opencode/skills/experience-ui-bundle-file-upload-generate && 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-file-upload-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/experience-ui-bundle-file-upload-generate into .opencode/skills/experience-ui-bundle-file-upload-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "experience-ui-bundle-file-upload-generate", 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-file-upload-generateMUST activate when the project contains a uiBundles//src/ directory and the task involves uploading, attaching, or dropping files.
Experience UI Bundle File Upload Generate is an agent skill from forcedotcom/sf-skills. MUST activate when the project contains a uiBundles//src/ directory and the task involves uploading, attaching, or dropping files. Use this skill when adding file upload functionality to a UI bundle app. Provides progress tracking and Salesforce ContentVersion integration. This feature provides programmatic APIs ONLY — build custom UI using the upload() API. ALWAYS use this instead of building file upload from scratch with FormData or XHR.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering File uploads and storage and CRM management. 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.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e5164d9. 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.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
From 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 File Upload Generate loads about 3k tokens when it runs. Until then it costs about 122 tokens; SKILL.md has 849 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); files beside SKILL.md are not scanned.
The full file from forcedotcom/sf-skills at commit e5164d9, republished under its Apache-2.0 licence (© forcedotcom). 849 words, ~3,034 tokens.
.claude/skills/experience-ui-bundle-file-upload-generate/SKILL.md (or your agent's skills folder).When the user wants file upload functionality in a React UI bundle, follow this workflow. This feature provides APIs only — you must build the UI components yourself using the provided APIs.
The package exports programmatic APIs, not React components or hooks. You will:
upload() function to handle file uploads with progress trackingonProgress callbackDo NOT:
<FileUpload /> — they are not exporteduseFileUpload — they are not exportedThe source code contains reference components for demonstration, but they are not available as imports. Use them as examples to build your own UI.
npm install @salesforce/ui-bundle-template-feature-react-file-uploadDependencies are automatically installed:
@salesforce/ui-bundle (API client)@salesforce/platform-sdk (data SDK; the old @salesforce/sdk-data name is dead — see the experience-ui-bundle-salesforce-data-access skill)Upload files to Salesforce and get back contentBodyId for each file. No ContentVersion record is created.
When to use:
import { upload } from "@salesforce/ui-bundle-template-feature-react-file-upload";
const results = await upload({
files: [file1, file2],
onProgress: (progress) => {
console.log(`${progress.fileName}: ${progress.status} - ${progress.progress}%`);
},
});
// results[0].contentBodyId: "069..." (always available)
// results[0].contentVersionId: undefined (no record linked)Upload files and immediately link them to an existing Salesforce record by creating ContentVersion records.
When to use:
import { upload } from "@salesforce/ui-bundle-template-feature-react-file-upload";
const results = await upload({
files: [file1, file2],
recordId: "001xx000000yyyy", // Existing record ID
onProgress: (progress) => {
console.log(`${progress.fileName}: ${progress.status} - ${progress.progress}%`);
},
});
// results[0].contentBodyId: "069..." (always available)
// results[0].contentVersionId: "068..." (linked to record)Upload files without a record, then link them after the record is created.
When to use:
import {
upload,
createContentVersion,
} from "@salesforce/ui-bundle-template-feature-react-file-upload";
// Step 1: Upload files (no recordId)
const uploadResults = await upload({
files: [file1, file2],
onProgress: (progress) => console.log(progress),
});
// Step 2: Create the record
const newRecordId = await createRecord(formData);
// Step 3: Link uploaded files to the new record
for (const file of uploadResults) {
const contentVersionId = await createContentVersion(
new File([""], file.fileName),
file.contentBodyId,
newRecordId,
);
}The package provides the backend — you build the frontend. Here's a minimal example:
import {
upload,
type FileUploadProgress,
} from "@salesforce/ui-bundle-template-feature-react-file-upload";
import { useState } from "react";
function CustomFileUpload({ recordId }: { recordId?: string }) {
const [progress, setProgress] = useState<Map<string, FileUploadProgress>>(new Map());
const handleFileSelect = async (event: React.ChangeEvent<HTMLInputElement>) => {
const files = Array.from(event.target.files || []);
await upload({
files,
recordId,
onProgress: (fileProgress) => {
setProgress((prev) => new Map(prev).set(fileProgress.fileName, fileProgress));
},
});
};
return (
<div>
<input type="file" multiple onChange={handleFileSelect} />
{Array.from(progress.entries()).map(([fileName, fileProgress]) => (
<div key={fileName}>
{fileName}: {fileProgress.status} - {fileProgress.progress}%
{fileProgress.error && <span>Error: {fileProgress.error}</span>}
</div>
))}
</div>
);
}The onProgress callback fires multiple times for each file as it moves through stages:
| Status | When | Progress Value |
|---|---|---|
"pending" | File queued for upload | 0 |
"uploading" | Upload in progress (XHR) | 0-100 (percentage) |
"processing" | Creating ContentVersion (if recordId provided) | 0 |
"success" | Upload complete | 100 |
"error" | Upload failed | 0 |
Always provide visual feedback:
Use an AbortController to allow users to cancel uploads:
const abortController = new AbortController();
const handleUpload = async (files: File[]) => {
try {
await upload({
files,
signal: abortController.signal,
onProgress: (progress) => console.log(progress),
});
} catch (error) {
console.error("Upload cancelled or failed:", error);
}
};
const cancelUpload = () => {
abortController.abort();
};If the user wants to upload files to their own profile or personal library:
import {
upload,
getCurrentUserId,
} from "@salesforce/ui-bundle-template-feature-react-file-upload";
const userId = await getCurrentUserId();
await upload({ files, recordId: userId });Main upload API that handles complete flow with progress tracking.
interface UploadOptions {
files: File[];
recordId?: string | null; // If provided, creates ContentVersion
onProgress?: (progress: FileUploadProgress) => void;
signal?: AbortSignal; // Optional cancellation
}
interface FileUploadProgress {
fileName: string;
status: "pending" | "uploading" | "processing" | "success" | "error";
progress: number; // 0-100 for uploading, 0 for other states
error?: string;
}
interface FileUploadResult {
fileName: string;
size: number;
contentBodyId: string; // Always available
contentVersionId?: string; // Only if recordId was provided
}Returns: Promise<FileUploadResult[]>
Manually create a ContentVersion record from a previously uploaded file.
async function createContentVersion(
file: File,
contentBodyId: string,
recordId: string,
): Promise<string | undefined>;Parameters:
file — File object (used for metadata like name)contentBodyId — ContentBody ID from previous uploadrecordId — Record ID for FirstPublishLocationIdReturns: ContentVersion ID if successful
Get the current user's Salesforce ID.
async function getCurrentUserId(): Promise<string>;Returns: Current user ID
<input type="file" multiple accept=".pdf,.doc,.docx,.jpg,.png" onChange={handleFileSelect} />Build your own dropzone using native events:
function DropZone({ onDrop }: { onDrop: (files: File[]) => void }) {
const handleDrop = (e: React.DragEvent) => {
e.preventDefault();
const files = Array.from(e.dataTransfer.files);
onDrop(files);
};
return (
<div
onDrop={handleDrop}
onDragOver={(e) => e.preventDefault()}
style={{ border: "2px dashed #ccc", padding: "2rem" }}
>
Drop files here
</div>
);
}{
progress.status === "uploading" && (
<div style={{ width: "100%", background: "#eee" }}>
<div
style={{
width: `${progress.progress}%`,
background: "#0176d3",
height: "8px",
}}
/>
</div>
);
}User asks for file upload functionality:
Ask about record context:
Based on response:
recordIdgetCurrentUserId()Build the UI:
Test the implementation:
contentBodyId is returnedrecordId was provided, verify contentVersionId is returnedThe package includes a reference implementation in src/features/fileupload/ with:
FileUpload.tsx — Complete component with dropzone and dialogFileUploadDialog.tsx — Progress tracking dialogFileUploadDropZone.tsx — Drag-and-drop zoneuseFileUpload.ts — React hook for state managementThese are NOT exported but can be viewed as examples. Read the source files to understand patterns for building your own UI.
Upload fails with CORS error:
localhostNo progress updates:
onProgress callback is providedContentVersion not created:
recordId is provided to upload() functionFiles upload but don't appear in record:
recordId is correctcontentVersionId in results)upload() API<FileUpload /> component — it's not exporteduseFileUpload hook — it's not exported© 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
Just SKILL.md in skills/experience-ui-bundle-file-upload-generate of forcedotcom/sf-skills.
Open the folder on GitHubat commit e5164d9
Experience UI Bundle File Upload Generate 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 File Upload Generate this skillforcedotcom/sf-skills | 1.1k | — | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Sf IntegrationJaganpro/sf-skills | 424 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Implementing Zero Trust For SaaS Applicationsmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~2.9k | Automated safety check: Pass | Apache-2.0 | |
| Salesforce Webhooks Eventsjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Sf Connected AppsJaganpro/sf-skills | 424 | — | ~1.9k | Automated safety check: Notes | MIT | |
| Databricks Lakeflow Connectdatabricks/databricks-agent-skills | 345 | — | ~3.8k | Automated safety check: Pass | Custom licence |
Jaganpro/sf-skills
Salesforce integration architecture with 120-point scoring. An agent skill from Jaganpro/sf-skills.
mukul975/Anthropic-Cybersecurity-Skills
Secures SaaS apps (Microsoft 365, Google Workspace, Salesforce, Slack) via CASB/SSPM deployment, conditional access policies, OAuth app governance, and session-level DLP controls enforcing identity…
jeremylongshore/tons-of-skills-marketplace
Select and govern Salesforce change delivery across Pub/Sub API, Change Data Capture, Platform Events, event relay, Streaming API, Outbound Messages, or polling.
Jaganpro/sf-skills
Salesforce Connected Apps and OAuth configuration with 120-point scoring.
databricks/databricks-agent-skills
Build managed ingestion pipelines into Databricks using Lakeflow Connect.
SalesforceAIResearch/agentforce-adlc
Build, modify, audit, repair, optimize, debug, and deploy agents with Agentforce Agent Script.
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 project contains a uiBundles//src/ directory and the task involves uploading, attaching, or dropping files. Experience UI Bundle File Upload Generate is an agent skill from forcedotcom/sf-skills. MUST activate when the project contains a uiBundles//src/ directory and the task involves uploading, attaching, or dropping files.
Experience UI Bundle File Upload Generate fits situations like: adding file upload functionality to a UI bundle app; tasks that involve File uploads and storage; tasks that involve CRM management.
Run `npx skills add forcedotcom/sf-skills --skill experience-ui-bundle-file-upload-generate -a claude-code`. Or copy the skill folder (skills/experience-ui-bundle-file-upload-generate in forcedotcom/sf-skills) into .claude/skills/experience-ui-bundle-file-upload-generate in your project. Claude Code loads it when a task matches its description.
Run `npx skills add forcedotcom/sf-skills --skill experience-ui-bundle-file-upload-generate -a codex`. Or copy the skill folder (skills/experience-ui-bundle-file-upload-generate in forcedotcom/sf-skills) into .agents/skills/experience-ui-bundle-file-upload-generate 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-file-upload-generate -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-file-upload-generate, .gemini/skills/experience-ui-bundle-file-upload-generate, .github/skills/experience-ui-bundle-file-upload-generate and .opencode/skills/experience-ui-bundle-file-upload-generate in your project.
Going by SKILL.md and its folder, Experience UI Bundle File Upload Generate needs the command-line tools its instructions call (npm). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. 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. Review the folder before installing.
Experience UI Bundle File Upload Generate 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 3k tokens (SKILL.md is roughly 12k 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 File Upload Generate: Sf Integration (Jaganpro/sf-skills, 424 stars), Implementing Zero Trust For SaaS Applications (mukul975/Anthropic-Cybersecurity-Skills, 34k stars), Salesforce Webhooks Events (jeremylongshore/tons-of-skills-marketplace, 2.8k stars) and Sf Connected Apps (Jaganpro/sf-skills, 424 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,060 GitHub stars. The repository holds 251 skills in this directory. The repository was last updated on October 7, 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.