Salesforce Load Scale
jeremylongshore/tons-of-skills-marketplace
Test Salesforce integration capacity in an authorized non-production org with synthetic data, bounded load, org limits, and business-invariant checks.
A skill your agent uses to build a Wave Recipe, deploy a CRM Analytics dataset or dashboard, or author the full CRMA asset stack — apps, Wave Recipes (.wdpr), datasets, and dashboards — against a…
$ npx skills add forcedotcom/sf-skills --skill crm-analytics-wave-generate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install forcedotcom/sf-skills crm-analytics-wave-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/crm-analytics-wave-generate .claude/skills/crm-analytics-wave-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 "crm-analytics-wave-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/crm-analytics-wave-generate into .claude/skills/crm-analytics-wave-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "crm-analytics-wave-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/crm-analytics-wave-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 crm-analytics-wave-generate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install forcedotcom/sf-skills crm-analytics-wave-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/crm-analytics-wave-generate .agents/skills/crm-analytics-wave-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 "crm-analytics-wave-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/crm-analytics-wave-generate into .agents/skills/crm-analytics-wave-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "crm-analytics-wave-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 crm-analytics-wave-generate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install forcedotcom/sf-skills crm-analytics-wave-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/crm-analytics-wave-generate .cursor/skills/crm-analytics-wave-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 "crm-analytics-wave-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/crm-analytics-wave-generate into .cursor/skills/crm-analytics-wave-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "crm-analytics-wave-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/crm-analytics-wave-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 crm-analytics-wave-generate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install forcedotcom/sf-skills crm-analytics-wave-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/crm-analytics-wave-generate .gemini/skills/crm-analytics-wave-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 "crm-analytics-wave-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/crm-analytics-wave-generate into .gemini/skills/crm-analytics-wave-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "crm-analytics-wave-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 crm-analytics-wave-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 crm-analytics-wave-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/crm-analytics-wave-generate .github/skills/crm-analytics-wave-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 "crm-analytics-wave-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/crm-analytics-wave-generate into .github/skills/crm-analytics-wave-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "crm-analytics-wave-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 crm-analytics-wave-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 crm-analytics-wave-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/crm-analytics-wave-generate .opencode/skills/crm-analytics-wave-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 "crm-analytics-wave-generate" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/crm-analytics-wave-generate into .opencode/skills/crm-analytics-wave-generate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "crm-analytics-wave-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.
crm-analytics-wave-generateA skill your agent uses to build a Wave Recipe, deploy a CRM Analytics dataset or dashboard, or author the full CRMA asset stack — apps, Wave Recipes (.wdpr), datasets, and dashboards — against a…
CRM Analytics Wave Generate is an agent skill from forcedotcom/sf-skills. Use to build a Wave Recipe, deploy a CRM Analytics dataset or dashboard, or author the full CRMA asset stack — apps, Wave Recipes (.wdpr), datasets, and dashboards — against a connected Salesforce org via REST and Metadata APIs, without CRM Analytics Studio or Dashboard Builder. TRIGGER when: user asks to build or create a Wave Recipe, generate a .wdpr or .wdpr-meta.xml, deploy a .wdash or .wapp, run a recipe or dataflowjob programmatically, upload CSV data via InsightsExternalData, validate a dataset schema with…
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 30 other files, including scripts, reference files and assets (for example `assets/dashboard-template.json`, `references/dashboard-authoring.md` and `references/dataset-hygiene.md`).
It sits in Sales & Support, covering CRM management and Test data and fixtures. 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 4bbae5c. 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, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
sfFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
CRM Analytics Wave Generate loads about 4.1k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 259 tokens; SKILL.md has 1,799 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 4bbae5c, republished under its Apache-2.0 licence (© forcedotcom). 1,799 words, ~4,142 tokens.
.claude/skills/crm-analytics-wave-generate/SKILL.md (or your agent's skills folder). This skill also uses 26 other files; get the full folder from GitHub.End-to-end workflow for authoring the full CRM Analytics asset stack — application, Wave Recipe, dataset, and Wave Dashboard — against a Salesforce org from a local SFDX project, without the UI.
Before acting, read references/method-decision-tree.md to select the correct API path for the user's goal. Wrong method choices (e.g. multipart upload instead of R3 JSON body) cause silent failures that are hard to diagnose.
sf org display -o <alias> --json)Opportunity, Account)Defaults:
SFDC_LOCAL (verify via GET /wave/dataConnectors)result.apiVersion from sf org display/usr/local/lib/sf/bin/node (bundled with sf CLI)Before starting, identify the user's goal and determine which phases to run:
| User goal | Phases to run |
|---|---|
| Build or update a recipe and dataset | 0 → 1 → 2 |
| Validate recipe output schema after run | 0 → 1 → 2 → 3 |
| Build or update a dashboard | 0 → 1 → 2 → 4 |
| Full end-to-end: recipe + validation + dashboard | 0 → 1 → 2 → 3 → 4 |
| Audit dataset for unused fields / stale SAQL | 0 → 1 → 5 |
Execute only the phases in the selected path. Do not revisit this table mid-workflow.
scripts/ directory exists in the skill root. All 11 scripts listed in references/scripts-reference.md are bundled with this skill. If a script is somehow missing, check that the skill was installed from the full repo (not a partial clone). Do not regenerate scripts from the descriptions — the implementations are authoritative.Verify org connection — run sf org display -o <alias> --json. Capture accessToken and instanceUrl. If EPERM error, shell is sandboxed — re-run with full permissions.
Look up or create the CRMA app — run scripts/create_app.js <alias> <appName>. The script lists existing folders and only creates if missing. Do NOT include assetIcon.
Read the R3 node schema — load references/r3-node-schema.md before writing any recipe JSON. Every node shape, critical field rule, and formula gotcha is documented there.
Author the recipe JSON — the .wdpr file contains only the recipeDefinition object (the nodes map, runMode, and ui section). Do NOT wrap it in an API envelope (fileFormat, label, name, recipe: {}) — the deploy script reads this file directly as the recipeDefinition body; wrapping it causes the wrong JSON structure to be POSTed at ?format=R3, leaving targetDataflowId null. Save to force-app/main/default/wave/<RecipeName>.wdpr. Key rules:
runMode must be "full" for generated recipes — NOT "R3" (which is only used as a query param on the API endpoint). Use "incremental" instead of "full" for large objects where reprocessing the entire source on every run is too slow; use "streaming" for near-real-time pipelines. "full" is the safe default for new recipes.sources (array), never source (singular)expressionType: "SQL" and type: "NUMBER" or type: "TEXT" on formula fieldsdate_format(field, 'yyyy') or date_format(field, 'MM/yyyy')"formula" — NOT "computeExpression", "augmentColumns", or "transform". Fields array key is "fields" (NOT "columns"). Expression key is "formulaExpression" (NOT "expression"). Do NOT use backtick quotes around field names in expressions.EXTRACT0 (extractGrains) node between the last formula node and aggregateui section format — read references/ui-section-template.mdCRITICAL — top-level .wdpr file structure. nodes is a ROOT-LEVEL object with UPPERCASE string keys. Do NOT put nodes inside ui. Do NOT use an array for ui.nodes. The file has exactly three top-level keys: runMode, nodes, ui. See examples/wdpr-skeleton.wdpr for a minimal 5-node skeleton (load → formula → extractGrains → aggregate → save).
See the wrong-variant reference table in references/r3-node-schema.md → "Common wrong variants" for the full list of correct vs incorrect field names per node type.
Write SFDX metadata wrappers — every .wdpr file MUST be accompanied by a .wdpr-meta.xml in the same directory. These are always created as a pair — outputting the recipe JSON without its metadata wrapper is incomplete. Use the template at assets/wdpr-meta-template.xml. Required fields: <application>, <masterLabel>, <targetDatasetAlias>, <dataflow> (set to the same value as <targetDatasetAlias>). Do NOT add <description>, <label>, <accessType>, <shareType>, or <format> — each triggers a deploy failure. Similarly, every .wapp requires a .wapp-meta.xml.
Deploy recipe via REST — run scripts/deploy_and_run_recipe.js <alias> <recipeFile.wdpr> <appName> <recipeName>. This script: looks up folder id → POSTs or PATCHes recipe at ?format=R3 → asserts targetDataflowId returned → POSTs to /wave/dataflowjobs → polls until terminal.
Verify recipe ran — terminal statuses: Success, Failure, Warning, Cancelled. On Failure, run scripts/check_connector_error.sh <alias> <connectorId> — exits 0 for System errors (safe to retry), exits 1 for User/Limit errors (do not retry; fix config first). If retries persist on a System error, run POST /wave/dataConnectors/{id}/ingest to force a connector refresh.
Upload synthetic data — run scripts/gen_synthetic_dataset.js (schema-driven, reads live XMD) then scripts/upload_dataset.js. Read references/external-data-upload.md for InsightsExternalData rules.
Verify with SAQL — run scripts/verify_synthetic_dataset.js. A 200 on Action=Process only means ingestion was queued — wait for Status=Completed, then verify with a count query.
Read dashboard rules — load references/dashboard-authoring.md before writing any .wdash. Covers the two-step deploy+PATCH workflow, accepted widget parameters per type, and the SAQL re-encoding trap.
Build minimal .wdash — use assets/dashboard-template.json as the starting structure. Keep widget parameters minimal at deploy time (see references/dashboard-authoring.md → "Deploy-time rules"). Deploy with sf project deploy start. When a listselector must drive another step's SAQL (not a global facet), put a {{column(step.selection, ["Field"]).asEquality("TargetField")}} binding in that step's query and set broadcastFacet/useGlobal to false on both steps — see references/dashboard-authoring.md → "Query bindings".
Apply styling via PATCH — after deploy, PATCH /wave/dashboards/{id} with enriched state. Always decodeAll every state.steps[*].query immediately after GET, before any mutation + PATCH. This is the #1 silent failure mode: the API HTML-encodes SAQL on write (" → "). GET → PATCH without decoding encodes again (&quot;, then &amp;quot;) and every widget renders Error 119. The helper is in references/dashboard-authoring.md. Use scripts/patch_t_oppo_view.js as the canonical GET → decodeAll → merge → PATCH template.
Verify all steps render — before running, edit the DASH_ID and DS constants at the top of scripts/verify_dashboard_steps.js to the deployed dashboard's 18-char ID and the dataset's current ID/versionId. Then run scripts/verify_dashboard_steps.js <alias>. For each step: GET stored SAQL → decode → swap dataset name for id/currentVersionId → POST to /wave/query. Confirm 200 + rows. Do not mark done until user confirms widgets render in the browser.
scripts/find_unused_dataset_fields.js <alias> <DatasetName>. Read references/dataset-hygiene.md for caveats (aggregateflex steps, multi-dataset SAQL, archived apps).| Constraint | Rationale |
|---|---|
Every .wdpr MUST be paired with a .wdpr-meta.xml in the same directory | Metadata wrapper is required for SFDX deploy; recipe JSON alone is an incomplete artifact |
Always POST recipes at ?format=R3 with recipeDefinition in JSON body | Multipart upload creates recipe but never compiles it — targetDataflowId stays null |
PATCH recipe with ?format=R3 JSON body only; never multipart PATCH | Multipart PATCH updates raw file but destroys compiled state → "tableModelInfo is null" |
On tableModelInfo is null: DELETE then re-POST | Only re-POST triggers server-side compilation |
Use targetDataflowId (02K...) on /wave/dataflowjobs, never recipe id (05v...) | /wave/dataflowjobs only accepts the dataflow id |
| One field per formula node | REST API accepts multiple but Recipe Designer breaks with "Can't Load the Recipe" |
Use column not col in gridLayouts widget entries | col triggers Unrecognized field "col" on deploy |
widgetStyle.borderRadius must be integer (e.g. 8), not CSS string | String value rejected at PATCH |
| Use name-based dataset load in stored SAQL, not id/version | id/version load requires a datasets binding the PATCH input rep rejects |
Always decode SAQL before PATCH — use decodeAll | GET returns HTML-encoded SAQL; re-encoding on every PATCH accumulates → &amp;quot; |
valuestable widget rejects all styling at PATCH — use chart with visualizationType: "flatTable" | chart widget accepts the full rich-styling param set |
POST /wave/dashboards only creates retired classic dashboards | Use Metadata API deploy for modern grid dashboards |
KPI total requires group q by all before foreach | Without it, foreach acts as a window function returning one row per source row |
| Issue | Resolution |
|---|---|
Recipe sits in New status, targetDataflowId null | Re-create via POST /wave/recipes?format=R3 with recipeDefinition in JSON body |
Formula type "TEXT" but expression returns number | Use type: "NUMBER" and expressionType: "SQL" — other type strings silently normalize to TEXT |
Aggregate fails: Can't find field _Year / _Month | Auto-derived date helpers don't exist mid-pipeline; derive explicitly via date_format formula node |
400 errorCode 276 on POST recipe | Name already in use — PATCH the existing recipe instead |
| All widgets show Error after PATCH | SAQL re-encoding — run decodeAll on every step query before PATCH |
listselector list text invisible on dark bg | Set filterStyle.valueColor — it defaults to dark; always set a contrasting color |
date_format(CloseDate, 'MMM yyyy') produces numeric month | Use 'MM/yyyy' for text dimensions — MMM silently returns integer in recipe formula context |
force-app/main/default/wave/<RecipeName>.wdpr — Wave Recipe JSON (R3 format)force-app/main/default/wave/<AppName>.wapp-meta.xml — app metadata wrapperforce-app/main/default/wave/<RecipeName>.wdpr-meta.xml — recipe metadata wrapperforce-app/main/default/wave/<DashboardName>.wdash — dashboard state JSONforce-app/main/default/wave/<DashboardName>.wdash-meta.xml — dashboard metadata wrapperAll scripts accept org alias as first positional arg. Read references/scripts-reference.md for full descriptions and usage.
| Script | Purpose |
|---|---|
scripts/create_app.js | Idempotently create a CRMA app folder |
scripts/deploy_and_run_recipe.js | Create + compile + run recipe end-to-end |
scripts/probe_recipe.js | Fetch recipe compile status + targetDataflowId |
scripts/fetch_dataset_xmd.js | Dump dataset XMD (dimensions/measures/dates) |
scripts/gen_synthetic_dataset.js | Schema-driven synthetic data generator |
scripts/upload_dataset.js | Upload CSV via InsightsExternalData API |
scripts/verify_synthetic_dataset.js | Post-upload SAQL sanity checks |
scripts/find_unused_dataset_fields.js | List XMD fields not referenced in any dashboard SAQL |
scripts/verify_dashboard_steps.js | POST each step's SAQL to /wave/query and confirm rows |
scripts/patch_t_oppo_view.js | Full-cycle PATCH template with dark theme and decodeAll |
scripts/check_connector_error.sh | Check connector errorCategory; exits 0=System (retryable), 1=User/Limit (do not retry) |
| Need | Delegate to |
|---|---|
| Deploying Wave metadata via SFDX project deploy | Use standard sf project deploy — no skill needed |
| LWC components that consume Wave datasets | Use an appropriate LWC skill |
| File | When to read |
|---|---|
references/method-decision-tree.md | Phase 1 — before choosing API path |
references/r3-node-schema.md | Phase 2 — before writing any recipe node |
references/ui-section-template.md | Phase 2 — when building the Designer-native ui section |
assets/wapp-meta-template.xml | Phase 2 — when creating .wapp-meta.xml |
assets/wdpr-meta-template.xml | Phase 2 — when creating .wdpr-meta.xml |
references/external-data-upload.md | Phase 3 — InsightsExternalData rules and common errors |
references/dashboard-authoring.md | Phase 4 — full dashboard deploy+PATCH rules and re-encoding trap |
assets/wdash-meta-template.xml | Phase 4 — when creating .wdash-meta.xml |
assets/dashboard-template.json | Phase 4 — minimal deploy-valid .wdash starting structure |
references/dataset-hygiene.md | Phase 5 — unused field detection and SAQL re-encoding audit |
references/scripts-reference.md | Any phase — full script descriptions and usage |
examples/wdpr-skeleton.wdpr | Phase 2 — minimal 5-node skeleton (load → formula → extractGrains → aggregate → save) |
examples/opportunity-revenue-recipe.wdpr | Phase 2 — fully annotated example recipe with all node types |
examples/pipeline-by-industry-quarter.wdpr | Phase 2 — kitchen-sink join + formula chain + extractGrains + case/coalesce/quarter |
examples/industry-binding-dashboard.wdash | Phase 4 — listselector driving a SAQL filter via column().asEquality() |
© 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 26 other files (scripts, references, assets) in skills/crm-analytics-wave-generate of forcedotcom/sf-skills.
Open the folder on GitHubat commit 4bbae5c
CRM Analytics Wave 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 |
|---|---|---|---|---|---|---|
| CRM Analytics Wave Generate this skillforcedotcom/sf-skills | 1.1k | — | ~4.1k | Automated safety check: Pass | Apache-2.0 | |
| Salesforce Load Scalejeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Soql Lib Query Builderbeyond-the-cloud-dev/soql-lib | 154 | — | ~4.3k | Automated safety check: Pass | MIT | |
| Sf DatacloudJaganpro/sf-skills | 424 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Soql Lib Selectorbeyond-the-cloud-dev/soql-lib | 154 | — | ~2k | Automated safety check: Pass | MIT | |
| Dev SetupPortwood-Global-Solutions/Portwood | 126 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 |
jeremylongshore/tons-of-skills-marketplace
Test Salesforce integration capacity in an authorized non-production org with synthetic data, bounded load, org limits, and business-invariant checks.
beyond-the-cloud-dev/soql-lib
Builds Salesforce SOQL queries using the SOQL Lib fluent builder API (SOQL.cls).
Jaganpro/sf-skills
Salesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows.
beyond-the-cloud-dev/soql-lib
Creates Salesforce Apex selector classes using the SOQL Lib selector pattern.
Portwood-Global-Solutions/Portwood
Get from a fresh clone of Portwood to a working, fully-tested Salesforce org.
Jaganpro/sf-skills
Creates and validates Salesforce Flows with 110-point scoring.
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
A skill your agent uses to build a Wave Recipe, deploy a CRM Analytics dataset or dashboard, or author the full CRMA asset stack — apps, Wave Recipes (.wdpr), datasets, and dashboards — against a…. CRM Analytics Wave Generate is an agent skill from forcedotcom/sf-skills.wdpr), datasets, and dashboards — against a connected Salesforce org via REST and Metadata APIs, without CRM Analytics Studio or Dashboard Builder.
CRM Analytics Wave Generate fits situations like: build a Wave Recipe; deploy a CRM Analytics dataset; author the full CRMA asset stack — apps; wave Recipes (.wdpr).
Run `npx skills add forcedotcom/sf-skills --skill crm-analytics-wave-generate -a claude-code`. Or copy the skill folder (skills/crm-analytics-wave-generate in forcedotcom/sf-skills) into .claude/skills/crm-analytics-wave-generate in your project. Claude Code loads it when a task matches its description.
Run `npx skills add forcedotcom/sf-skills --skill crm-analytics-wave-generate -a codex`. Or copy the skill folder (skills/crm-analytics-wave-generate in forcedotcom/sf-skills) into .agents/skills/crm-analytics-wave-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 crm-analytics-wave-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/crm-analytics-wave-generate, .gemini/skills/crm-analytics-wave-generate, .github/skills/crm-analytics-wave-generate and .opencode/skills/crm-analytics-wave-generate in your project.
Going by SKILL.md and its folder, CRM Analytics Wave Generate needs a shell for the scripts in its folder and the command-line tools its instructions call (sf). Our summary lists: Node.js; A Bash shell.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
CRM Analytics Wave 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 4.1k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with CRM Analytics Wave Generate: Salesforce Load Scale (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Soql Lib Query Builder (beyond-the-cloud-dev/soql-lib, 154 stars), Sf Datacloud (Jaganpro/sf-skills, 424 stars) and Soql Lib Selector (beyond-the-cloud-dev/soql-lib, 154 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,067 GitHub stars. The repository holds 252 skills in this directory. The repository was last updated on October 9, 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.