A VS Code extension for Salesforce developers that streamlines day-to-day work without leaving the editor: browse and retrieve org components, generate package.xml files from branch changes, integrate with Jira to fetch components linked to stories, manage feature/release branches, and merge an entire Jira release of story branches onto your release branch in one step.
Features
Browse & Retrieve Org Components
Query your connected Salesforce org for recently modified metadata across any metadata type. Select what you want and retrieve it into your local project — fast.
- Supports scratch orgs, sandboxes, and production
- Auto-detects source tracking; uses Tooling API
SourceMember when available, falls back to sf org list metadata otherwise
- Filter, sort, and search by type, name, or modified by
- Two retrieval backends: SF CLI (stable) or Metadata API via jsforce (10–100× faster for small selections)
- Bulk Select via paste or fetch from a Jira issue
- All CLI/API activity logged to the SF Metadata Toolkit output channel
Bulk Select from a list
Paste a list of components (any common format — markdown table, tab-separated, vertical Jira copy, plain Type: Name) and the parser figures it out:
- Header-aware (
Type, Component Type, Name, API, Component Name)
- Type-anchored fallback for headerless lists
- Auto-reformats clipboard paste into a clean
Type: Name view
- Smart matching: handles missing
__c/__mdt suffixes, exact + suffix + ambiguous resolution
Retrieve from Jira
Pull the component list directly from a custom field on a Jira issue, parse it, and pre-fill the Bulk Select textarea. Configure the field name once (e.g. Salesforce Components) and the extension resolves the field ID via Jira's REST API.
Generate package.xml from changes
Generate a deployment manifest from changes on the current branch — including committed changes, not just uncommitted ones.
- Uses
git log --first-parent --no-merges to capture only what was directly committed on this branch (excludes content brought in by main syncs or branch merges)
- Adds staged, unstaged, and untracked files
- Maps file paths to Salesforce metadata types
- Auto-generates and shows the
package.xml preview
- Saves directly to
manifest/<STORY-KEY>.xml when the current branch matches a configured Jira ticket prefix
- Sorts type and member names with locale-aware case-insensitive collation
- Reads
sourceApiVersion from sfdx-project.json
Merge Release Stories
Merge every story branch in a Jira release / fixVersion onto your current branch.
- Check out (or create) the branch you want to use as the release branch
- Run Merge Release Stories and enter a release name (matches Jira
fixVersion)
- The extension queries Jira (via the
/rest/api/3/search/jql API) for all stories in that release and locates the matching git branch for each
- A confirmation table shows story key, title, status, assignee, and the matched branch — rows without a branch are highlighted and unchecked by default
- After you confirm, each selected story's remote branch is merged into the current branch one at a time. Per-story merge conflicts are aborted and reported, so the rest of the queue keeps going
- The current branch is left exactly as the merges left it. Nothing is committed beyond the merge commits, and nothing is pushed — review and push when you're ready
Sign in to Jira
A guided sign-in panel collects your Atlassian email + API token (with a link to create one), tests the credentials, and stores:
- Settings (User scope):
jiraBaseUrl, jiraEmail — synced and shareable
- Token: in VS Code's encrypted SecretStorage — never written to settings.json, never synced
Available as SF Metadata Toolkit: Sign in to Jira and SF Metadata Toolkit: Sign out of Jira.
For teams that follow a story → environment branch model:
- Create New Branch / Continue Existing Branch — guided flows for starting/resuming feature work
- Commit Changes — fast staging + commit, optionally checks for changes before saving
- Promote — push the current branch and open a PR against a configured environment branch (e.g.
dev, staging)
- Deploy Branch to Sandbox — push the non-merge changes on this branch directly to a configured sandbox
These sections appear automatically in the sidebar when their dependencies are satisfied (e.g. Promote shows when promotionTargets is configured; Release shows when you're inside a git repo).
Requirements
- Salesforce CLI (
sf) installed and on your PATH
- An authenticated Salesforce org (
sf org login)
- Git installed
- A Salesforce DX project open in VS Code (for retrieve, package.xml, release flows)
- Jira Cloud account + API token (for Jira features)
Quick Start
- Open your Salesforce DX project in VS Code
- The SF Metadata Toolkit sidebar appears in the activity bar
- Click Browse Org Components to retrieve metadata, or
- Run SF Metadata Toolkit: Sign in to Jira to enable Jira-backed features
Commands
| Command |
Description |
SF Metadata Toolkit: Browse Org Components |
Open the component browser |
SF Metadata Toolkit: Generate package.xml from changes |
Generate a deployment manifest from branch changes |
SF Metadata Toolkit: Sign in to Jira |
Configure Jira credentials |
SF Metadata Toolkit: Sign out of Jira |
Clear stored credentials |
SF Metadata Toolkit: Merge Release Stories |
Merge every story branch in a Jira release onto the current branch |
SF Metadata Toolkit: Sort package.xml |
Sort and deduplicate the active package.xml file |
SF Metadata Toolkit: Create New Branch |
Branch from main (when branching is enabled) |
SF Metadata Toolkit: Continue Existing Branch |
Switch to an existing feature branch |
SF Metadata Toolkit: Promote |
Push & open PR to an environment branch |
SF Metadata Toolkit: Deploy Branch to Sandbox |
Deploy branch changes to a configured sandbox |
Settings
| Setting |
Default |
Purpose |
sfMetadataToolkit.allowedManagedNamespaces |
[] |
Managed package namespaces to include in browse results (e.g. ["SBQQ"]) |
sfMetadataToolkit.retrieveMethod |
metadataApi |
metadataApi (default, faster — jsforce) or sfCli (fallback) |
sfMetadataToolkit.mainBranch |
main |
Production / target branch |
sfMetadataToolkit.jiraBaseUrl |
"" |
e.g. https://yourcompany.atlassian.net |
sfMetadataToolkit.jiraEmail |
"" |
Atlassian account email (set by Sign in to Jira) |
sfMetadataToolkit.jiraComponentsField |
"" |
Name or ID of the Jira field listing Salesforce components |
sfMetadataToolkit.promotionTargets |
[] |
List of { branch, environment } for promote buttons |
sfMetadataToolkit.codeOwnerTeams |
[] |
GitHub team slugs whose members populate the Promote reviewer picker |
sfMetadataToolkit.requireLinkInPrDescription |
false |
Require a Jira ticket or Salesforce case link in PR descriptions |
sfMetadataToolkit.updateExtensionUrl |
"" |
Optional direct VSIX URL for self-hosted updates |
Privacy
All Jira and GitHub network requests are initiated by user actions (sign-in, fetching a story, opening a PR). The extension does not send telemetry. Credentials are stored in VS Code's encrypted SecretStorage; never logged or synced.
Known Limitations
- The component browser returns up to 1000 most recently modified components for source-tracked orgs and 5000 for non-source-tracked queries.
- The package.xml generator includes files tracked by git on the current branch (committed + working tree). Files brought in by merges from other branches are excluded.
- Jira features require Jira Cloud (the new
/search/jql endpoint). Server / Data Center support is not implemented.
- Retrieve and release operations require an open Salesforce DX project folder.
Development
npm install # one-time
npm run compile # tsc + esbuild bundle of metadataApi
npx vsce package # produces sf-metadata-toolkit-<version>.vsix
To run the extension locally: open this folder in VS Code and press F5 to launch an Extension Development Host. From inside the host, open a separate Salesforce DX project folder to test against.
The build runs tsc -p ./ followed by node esbuild.metadataApi.mjs. The esbuild step bundles src/metadataApi.ts together with jsforce into a single out/metadataApi.js (~1.3MB) so jsforce doesn't need to ship as a dependency in the VSIX.
License
MIT.