Orgbench — VS Code extension
A thin VS Code client of the sf-core-server core: compare Salesforce
CustomField metadata between two locally authenticated sf CLI aliases and
selectively deploy the differences, optionally synchronizing field-level
security (FLS). Authentication stays entirely in the local Salesforce CLI; the
extension never handles tokens or credentials. It shares the same Rust core as
the IntelliJ IDEA plugin.
Requirements
- macOS arm64, macOS x64 or Windows x64 (the bundled core is fail-closed on
other platforms; Linux is planned). The Windows x64 build is for Windows on
x64; it has not been verified on Windows on ARM, and VS Code itself may
reject installing an x64-targeted VSIX (
targetPlatform: win32-x64) there. - VS Code 1.85 or newer.
- Salesforce CLI (
sf) installed and onPATH. On Windows the core also looks forsf.exe,sf.cmd,sf.batandsfin%LOCALAPPDATA%\sf\client\bin. - Two authenticated aliases that resolve to different Salesforce org IDs.
Install from disk
- Obtain the VSIX for your platform:
orgbench-darwin-arm64.vsix(Apple silicon),orgbench-darwin-x64.vsix(Intel) ororgbench-win32-x64.vsix(Windows x64), or build it (below). - In VS Code, open the Extensions view, choose Install from VSIX… from the
…menu, and select the file. - Open the Orgbench view from the Activity Bar.
Workflow
- Select a Source Org and a Target Org (different underlying org IDs).
- Select one or more source objects and choose Compare Fields.
- Review the differences, tick the deployable fields, pick an FLS Mode (Do not transfer FLS, Additive FLS, or All FLS), and Deploy; or Back to change the selection.
- Read the field and FLS result tables. Copy details copies only the sanitized diagnostics. New comparison starts over.
Comparison or deployment can be cancelled from the progress view.
Filtering
Every webview table (objects, differences, FLS containers, and both result tables) shares one per-column filter row directly under its header:
- Text columns get a free-text prefix box (matches from the start of the value, case-insensitively).
- Enum columns — Change, Kind, Presence, Operation, Status — get a
multi-select popup listing every value with checkboxes. Two carry a smart
default: the differences Change popup hides
No changerows, and the FLS-results Status popup hidesSkipped. - The selection column and boolean columns (Read/Edit) get a tri-state toggle.
Column filters combine with AND. Filtering only hides rows: a row that is checked and then hidden by a filter keeps its selection, and the selection column's header checkbox selects or clears only the currently visible, filtered rows (hidden selections are left untouched). Filters reset to their defaults when you leave the screen (a new comparison, or stepping between the review and FLS-container screens).
Selections (chosen objects, deployable fields, and FLS containers), together with each table's column filters and sort, are preserved when the view is hidden and shown again, so switching away from the panel never re-checks a container you deselected before deploying or drops the filters you set. Filters and sort persist while you stay on a screen and reset only when you leave it.
Sorting
Click any column header except the selection column to sort the table by that column. Each click cycles the sort: ascending (▲), then descending (▼), then off (original order). One column sorts at a time. Enum columns sort by their displayed label; boolean columns (Read/Edit) sort unchecked-before-checked. Sorting only reorders rows — it never changes which rows a filter has hidden — and, like the column filters, persists while you stay on a screen, resetting to the original order when you leave it.
Settings
orgbench.coreServerPath— absolute path to asf-core-serverbinary that overrides the bundled one. For development only; leave empty to use the binary shipped inside the VSIX.
Build
The extension is part of the repository's Gradle build:
cd vscode && npm ci
cd vscode && npm test # tsc typecheck + node:test suite
cd vscode && npm run build # esbuild: extension-host + webview bundles
./gradlew buildVsixAarch64 # writes vscode/orgbench-darwin-arm64.vsix
./gradlew buildVsixX64 # writes vscode/orgbench-darwin-x64.vsix
./gradlew buildVsixWin32X64 # writes vscode/orgbench-win32-x64.vsix
The three tasks share vscode/bin/, so they run one after another, never in
parallel. Building the Windows VSIX from macOS needs cargo install cargo-xwin
and rustup target add --toolchain 1.97.0 x86_64-pc-windows-msvc.
Each VSIX bundles exactly one native core binary for its target.
Troubleshooting
The Salesforce core process did not start
The extension launches a bundled sf-core-server binary from its bin/
directory. If the view reports that the core process could not start or
terminated, confirm the platform is supported (macOS arm64, macOS x64 or
Windows x64) and that the VSIX was installed without modification. On Windows
the bundled binary is unsigned, so SmartScreen or the antivirus may quarantine
it on first launch. The core process log is written to the Orgbench Core
output channel.
No aliases are listed
Run sf org list --json in a terminal, authenticate aliases if needed, and use
the Reload Orgs button. Entries without an alias are intentionally not shown.
Source and target are rejected as the same org
Choose aliases that resolve to different org IDs; two alias names can point to one org.