Skip to content
OpenSmartRoute
Skillv1.0.0

salesforce-local-dev-loop

Configure Salesforce local development with scratch orgs, SFDX, and testing. Use when setting up a development environment, configuring test workflows, or establishing a fast iteration cycle with Sale

by jeremylongshore(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from jeremylongshore/tons-of-skills-marketplace (plugins/saas-packs/salesforce-pack/skills/salesforce-local-dev-loop/SKILL.md). Install upstream with npx skills add jeremylongshore/tons-of-skills-marketplace --skill salesforce-local-dev-loop. Copyright stays with the author (MIT).

Salesforce Local Dev Loop

Overview

Set up a fast, reproducible local development workflow using Salesforce CLI (sf), scratch orgs, and jsforce with hot reload.

Prerequisites

  • Completed salesforce-install-auth setup
  • Salesforce CLI installed (npm install -g @salesforce/cli)
  • Dev Hub enabled in your production org (Setup > Dev Hub)
  • Node.js 18+ with npm/pnpm

Instructions

Step 1: Create SFDX Project Structure

# Initialize a new SFDX project
sf project generate --name my-sf-project --template standard

# Project structure created:
# my-sf-project/
# ├── config/
# │   └── project-scratch-def.json   # Scratch org definition
# ├── force-app/
# │   └── main/default/              # Metadata source (Apex, LWC, etc.)
# ├── scripts/
# │   └── apex/                      # Anonymous Apex scripts
# ├── sfdx-project.json              # Project config
# └── .sf/                           # Local CLI state

Step 2: Create a Scratch Org

# Authenticate to your Dev Hub first
sf org login web --set-default-dev-hub --alias DevHub

# Create a scratch org (expires in 7 days by default)
sf org create scratch \
  --definition-file config/project-scratch-def.json \
  --alias my-scratch \
  --duration-days 7 \
  --set-default

# Open scratch org in browser
sf org open --target-org my-scratch

Step 3: Configure scratch-def for development

{
  "orgName": "My Dev Org",
  "edition": "Developer",
  "features": ["EnableSetPasswordInApi", "MultiCurrency"],
  "settings": {
    "lightningExperienceSettings": {
      "enableS1DesktopEnabled": true
    },
    "securitySettings": {
      "passwordPolicies": {
        "enableSetPasswordInApi": true
      }
    }
  }
}

Step 4: Node.js Integration Dev Loop

my-integration/
├── src/
│   ├── salesforce/
│   │   ├── connection.ts     # jsforce connection wrapper
│   │   ├── accounts.ts       # Account operations
│   │   ├── contacts.ts       # Contact operations
│   │   └── queries.ts        # SOQL query builders
│   └── index.ts
├── tests/
│   ├── unit/
│   │   └── queries.test.ts   # Mock-based tests
│   └── integration/
│       └── accounts.test.ts  # Live org tests
├── .env.local                # Local secrets (git-ignored)
├── .env.example              # Template for team
└── package.json

Step 5: Configure Hot Reload

{
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "test": "vitest",
    "test:watch": "vitest --watch",
    "test:integration": "SF_ENV=scratch vitest run tests/integration/",
    "push": "sf project deploy start --target-org my-scratch",
    "pull": "sf project retrieve start --target-org my-scratch"
  }
}

Step 6: Configure Testing with Mocked Connections

import { describe, it, expect, vi } from 'vitest';

// Mock jsforce for unit tests — no live org needed
vi.mock('jsforce', () => ({
  default: {
    Connection: vi.fn().mockImplementation(() => ({
      login: vi.fn().mockResolvedValue({ id: '005xx', organizationId: '00Dxx' }),
      query: vi.fn().mockResolvedValue({
        totalSize: 1,
        done: true,
        records: [{ Id: '001xx', Name: 'Test Account', Industry: 'Tech' }],
      }),
      sobject: vi.fn().mockReturnValue({
        create: vi.fn().mockResolvedValue({ id: '001xx', success: true }),
        update: vi.fn().mockResolvedValue({ id: '001xx', success: true }),
        destroy: vi.fn().mockResolvedValue({ id: '001xx', success: true }),
      }),
    })),
  },
}));

describe('Account Service', () => {
  it('should query accounts with SOQL', async () => {
    const conn = new (await import('jsforce')).default.Connection({});
    const result = await conn.query("SELECT Id, Name FROM Account LIMIT 5");
    expect(result.totalSize).toBe(1);
    expect(result.records[0].Name).toBe('Test Account');
  });
});

Output

  • SFDX project with scratch org configured
  • Hot reload development server running
  • Unit tests with mocked jsforce connections
  • Integration tests against scratch org
  • Fast iteration cycle: edit, auto-reload, test

Error Handling

Error Cause Solution
ERROR: No default dev hub Dev Hub not set Run sf org login web --set-default-dev-hub
INVALID_OPERATION: scratch org limit Hit scratch org limit (6 active) Delete old orgs: sf org delete scratch --target-org old-alias
SourceConflictError Local/remote metadata conflicts Run sf project retrieve start to sync
MODULE_NOT_FOUND: jsforce Not installed Run npm install jsforce
sf: command not found CLI not installed Run npm install -g @salesforce/cli

Examples

Use a disposable scratch org for a focused change

Create a scratch org from a versioned definition, push only the metadata needed for the feature, and seed test data through a reproducible script with no customer identifiers. Run unit tests and a minimal integration path, then delete the scratch org when the branch closes or its time-to-live expires. Keep Dev Hub credentials in the approved developer secret store and never treat a scratch-org success as evidence for a production deployment.

Resources

Next Steps

See salesforce-sdk-patterns for production-ready code patterns.

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/jeremylongshore-tons-of-skills-marketplace-salesforce-lo-6fd3f2/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

jeremylongshore-tons-of-skills-marketplace-salesforce-lo-6fd3f2.ocm.jsonjson
{
  "ocm": "1",
  "id": "jeremylongshore-tons-of-skills-marketplace-salesforce-lo-6fd3f2",
  "kind": "skill",
  "name": "salesforce-local-dev-loop",
  "description": "Configure Salesforce local development with scratch orgs, SFDX, and testing. Use when setting up a development environment, configuring test workflows, or establishing a fast iteration cycle with Salesforce. Trigger with phrases like \"salesforce dev setup\", \"salesforce local development\", \"salesforce scratch org\", \"sfdx project\", \"develop with salesforce\".",
  "publisher": "jeremylongshore",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "general"
    ],
    "tags": [
      "skill-md",
      "saas",
      "crm",
      "salesforce",
      "skills-sh"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "Configure Salesforce local development with scratch orgs, SFDX, and testing. Use when setting up a development environment, configuring test workflows, or establishing a fast iteration cycle with Salesforce. Trigger with phrases like \"salesforce dev setup\", \"salesforce local development\", \"salesforce scratch org\", \"sfdx project\", \"develop with salesforce\"."
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "skills.sh",
      "repository": "https://github.com/jeremylongshore/tons-of-skills-marketplace",
      "path": "plugins/saas-packs/salesforce-pack/skills/salesforce-local-dev-loop/SKILL.md",
      "ref": "HEAD",
      "url": "https://github.com/jeremylongshore/tons-of-skills-marketplace/blob/HEAD/plugins/saas-packs/salesforce-pack/skills/salesforce-local-dev-loop/SKILL.md",
      "key": "jeremylongshore/tons-of-skills-marketplace/plugins/saas-packs/salesforce-pack/skills/salesforce-local-dev-loop/SKILL.md"
    },
    "compatibility": "Designed for Claude Code",
    "allowed_tools": [
      "Read,",
      "Write,",
      "Edit,",
      "Bash(npm:*),",
      "Bash(pnpm:*),",
      "Bash(sf:*),",
      "Grep"
    ],
    "license": "MIT"
  },
  "instructions": "# Salesforce Local Dev Loop\n\n## Overview\n\nSet up a fast, reproducible local development workflow using Salesforce CLI (sf), scratch orgs, and jsforce with hot reload.\n\n## Prerequisites\n\n- Completed `salesforce-install-auth` setup\n- Salesforce CLI installed (`npm install -g @salesforce/cli`)\n- Dev Hub enabled in your production org (Setup > Dev Hub)\n- Node.js 18+ with npm/pnpm\n\n## Instructions\n\n### Step 1: Create SFDX Project Structure\n\n```bash\n# Initialize a new SFDX project\nsf project generate --name my-sf-project --template standard\n\n# Project structure created:\n# my-sf-project/\n# ├── config",
  "cost": {
    "context_tokens": 1414
  }
}

Fetch it by URL: GET /api/v1/registry/jeremylongshore-tons-of-skills-marketplace-salesforce-lo-6fd3f2/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.