Features
The extension ships 46 features (count generated from the extension’s own registrations). Every feature is opt-in — toggle it on or off in the options page — and any feature can be remotely disabled without a Web Store re-review.
Features are surfaced through the ⚡ side button menu, which adapts to the page you’re on (Setup, a Flow list, the Flow canvas, a record page, or the standalone Workspace tab).
Features marked 🔌 Bridge require a running sfdt CLI bridge. Everything else runs standalone against your existing Salesforce session.
Highlights
A few features aren’t tied to one Salesforce context — they open from anywhere, or add a whole sub-view to an existing tool.
Command palette (command-palette)
A global, keyboard-first ⚡ overlay on any Salesforce page — press Ctrl/Cmd+Shift+K
(or pick View all features from the ⚡ menu). Fuzzy-search across your enabled features, Setup
deep-links, objects, a pasted record Id (opens the inspector), and
your own custom shortcuts. Recent choices resurface first. Opening it makes zero Salesforce
API calls — the Objects list fills in after first paint. Manage custom name→URL shortcuts on the
options page; they open in a new tab and reappear under Recent.
Docked side panel
The tools can also run in a docked Chrome side panel (Firefox: native sidebar_action)
instead of the centered modal — open it from the toolbar popup’s Open side panel button. It
hosts the full Workspace next to the page you’re on, follows the active org as you switch tabs
(and quietly disables itself on non-Salesforce tabs), and an Appearance › Default tool surface
setting lets you prefer the panel over the modal. Chrome-only, via the sidePanel
permission.
SOSL mode in the SOQL Runner
The runner’s toolbar carries a SOQL | SOSL toggle, and the mode also follows what you type — a
query whose first keyword is FIND switches to SOSL, a SELECT switches back. That is the same
rule the CLI (sfdt soql) and the SOQL Console use, so a query behaves the
same in all three places. Clicking the toggle wins over that inference: your choice holds through
further edits of the same query, and detection takes over again only when the query’s own language
changes.
SOSL results are grouped per returned object: one labelled section per sObject
(Account · 2 rows), each with its own table and its own copy of the result toolbar — Copy CSV,
Export CSV, Copy JSON, Copy for Excel — so copy and export apply to that object’s rows
only (the export filename is per object too). History and bookmarks record the mode and restore
it, badging each entry SOQL or SOSL.
In SOSL mode the REST/Tooling toggle and Explain are disabled — the Search resource has no Tooling variant and no query plan. Your transport choice is only unavailable, never reset: SOSL runs on REST because that is all it can run on, and switching back to SOQL puts you back on Tooling if that is where you were.
Generate query (soql-nl-generate)
Off by default, and needs the bridge. Tick Generate SOQL from a description (AI) on the options page to switch it on. Until you do, the button is not built at all.
Describe the query you want in plain English and the SOQL arrives in the editor, for you to read before you run it. Generate query in the runner’s toolbar opens a panel above the editor: type a description, optionally name the objects (leave it blank and they’re inferred from your wording, matched against the org’s own sObject list — never invented), press Generate. The result is written into the query editor and the status line reads review it, then Run. Nothing runs on its own; Run is still the only thing that touches the org, and pressing it is still yours to do.
What is sent, and what is not. The prompt carries your description plus a Markdown field
table per object — the same format export-for-prompt copies to your clipboard — built from the
object describe: API name, label, type, required, inline help text, and nothing else. It does
not carry record data. The prompt assembler is never handed the result set, and a second check
scans the assembled prompt (minus your own wording, which is yours) for any value from the results
table on screen and refuses the send if it finds one. Large objects are capped at 150 fields, and
the prompt says so rather than truncating silently.
Where it goes. Through the bridge to your local sfdt CLI, using
the same ai request the Flow AI Assistant uses — the extension holds no AI endpoint and no API
key, and this feature adds no browser permission. The CLI decides the provider under your own
key. With no bridge running, an unpaired token, or "features.ai": false in the project’s
.sfdt/config.json, the panel shows what the bridge said plus the steps to fix it.
A generated string that fails the local SOQL checks — the same rules as
sfdt soql validate — is reported in the panel rather than pasted over
whatever you already had in the editor. Generation is SOQL only: switching the runner to SOSL
closes the panel and disables the button.
Bulk delete from a SOQL result set (soql-bulk-delete)
Off by default. It deletes org records, so the control does not exist until you switch
soql-bulk-delete on in the options page, where its row carries an
Off by default badge. The button is not built, not merely hidden. It is one of two features
that ship switched off — the other is Generate query.
With it on, and when your result set includes an Id column, the SOQL Runner’s result toolbar gains
Delete N rows — and each SOSL object group gets its own, scoped to that object’s rows. The count
on the button is the preview: it re-counts on every run and after Load more, and the button
disappears again if the next query returns no Id. A flat result set whose rows span more than one
object gets no button either — the runner refuses rather than guess which object to delete against.
There is no cap on N. One run deletes every loaded row the plan accepts — the only ceiling is how many rows the runner is holding, and Load more will stack up to ten pages. The count in the button and in the typed phrase is the only thing standing between you and that number.
Clicking it runs a fixed sequence, and there is no path through it that skips a step:
- A backup CSV is generated and handed to your browser — exactly the rows about to be deleted and nothing else, serialised by the same code as Export CSV, so it quotes commas and quotes identically to the export you already use.
- A modal asks you to type the phrase exactly —
DELETE 12 Account. Confirm stays disabled until it matches;Escapeand the backdrop cancel, and can never confirm. The count is inside the phrase deliberately: you can retypeDELETEfrom muscle memory, but not a number you have not read. - Only then does anything reach the org, in waves of 25 with a live progress count. A Cancel button stops the next wave; so does closing the runner or running a new query. Rows already sent cannot be recalled.
What the backup guarantee actually is. Two things are checked before the confirm appears, and failing either deletes nothing and never asks you: the serialised CSV must contain every record Id in the plan (a search of the text for each Id, so an empty or truncated file cannot pass), and the browser must mint a blob URL for it so the download can be handed off. That second check is the weaker one — it proves the handoff was started, not that it finished.
What SFDT cannot verify is that the file reached your disk. Nothing in the extension can:
that needs the downloads permission, which is not in the manifest.
So the dialog names the file (sfdt-delete-backup-Account-2026-08-05.csv) and asks you to
check your downloads before continuing. You are the only one who can.
The backup also holds only the columns your query selected. A SELECT Id FROM Account backup
restores nothing but Ids. Select the fields you would need to recreate the records.
A failed row does not abort the run: every row that did not delete is listed afterwards by Id, with its reason. A row that timed out is called out separately as may still have committed — the request never came back, so re-run the query to see what is actually left rather than retrying blind and deleting something twice.
Rows the org confirms are gone disappear from the table; rows that failed — including the timed-out ones — stay, because they are the ones to re-check. Deletes follow the runner’s REST / Tooling toggle, and add no new extension permission — they go through the same worker-proxied session every other write already uses.
Schema Browser (schema-browser)
A two-pane object/field explorer — a searchable, windowed object list beside a per-object field
table (types, lengths, required, inline picklist values, formula source, flattened compound
fields, reference targets as clickable cross-links, and child relationships). Copy API name on
any field, Insert into query to drop a field straight into the SOQL Runner draft, and an
Export selected for prompt field picker (every field pre-selected; unselect what you don’t
want) that hands the chosen fields to export-for-prompt. Runs as a Workspace
tool and from a record page via the ⚡ menu; all describes share one session cache.
Field Impact Analysis (field-impact)
“What writes this field?” — the question a schema browser can’t answer. Open it from the Schema
Browser’s per-field What writes this? action, from the Show API Names panel’s field picker,
or standalone from the Workspace / ⚡ menu, and it gathers three
kinds of writer for one Object.Field:
- Flows —
MetadataComponentDependencynarrows the candidates, then@sfdt/flow-coreparses each candidate’s metadata and keeps only the ones that actually write the field (Create/Update Records field assignments, and$Record.Field__c-style Assignment elements). A flow that merely reads the field in a filter or entry criterion is dropped — something a raw dependency query cannot do for you. - Workflow field updates — read from the Tooling API, which names the target field outright.
- Apex — a best-effort Tooling text search over class and trigger source.
Every row is badged confirmed or inferred, the same vocabulary the CLI’s
sfdt dependencies --gaps report uses:
| Badge | Means |
|---|---|
| confirmed | The metadata states the write — a parsed Flow assignment, or a field update naming the field. |
| inferred | A best-effort signal, not proof of a write — an Apex text hit (it may only read the field), a flow that a dependency edge links to the field but whose metadata couldn’t be analysed, or a Flow write whose object couldn’t be pinned down. |
An inferred hit is never shown as confirmed, and the confirmed/inferred counts are reported separately.
Scan limits and precision are both stated rather than hidden, in a Scan scope note. A
standard field has no dependency edge to narrow by, so Flow coverage falls back to a broad sweep
of the most recently modified active flows — and on that path a flow is reported only when its own
metadata binds the write to the object you asked about. A write into an untyped or Apex-defined
variable is skipped rather than guessed at: matching on the bare field name would otherwise
attribute any flow writing some other object’s Status / Type / Rating to yours. A flow whose
metadata can’t be read at all is likewise not listed on that path — nothing linked it to your field
in the first place, so a row would imply a reference that was never established. The trade is
deliberate — a missing row is recoverable, a confident-looking false one is not — and the note says
which results that rule omits. Per-scan caps (including the Apex search’s true bound) and any query
the org refuses are disclosed the same way. Each row carries an Open link into Flow Builder or
the relevant Setup page.
Debug Logs — Analyze view
The Debug Logs viewer gains a per-log 📊 Analyze action (backed by a pure Apex-log parser)
that renders a sortable method-timing table (total / self / count), per-namespace
governor-limit snapshots, and SOQL / DML / callout inventories with jump-to-line into the
raw body, plus a truncation banner. A Flame chart shows the same data as a canvas
invocation-tree timeline — zoom into a subtree, hover for detail, click a frame to select it (synced
both ways with the method table). You can 📂 Import log — drag-drop or pick a local
.log/.txt and analyze it with no org connection — and Execute Anonymous gains 📊 Run &
analyze, which runs the Apex, finds the log it produced, and opens it in the Analyzer.
Flow Builder
| Id | What it does |
|---|---|
canvas-search | Cmd/Ctrl+Shift+F search across canvas nodes; matches get a gold highlight, Enter cycles through them and pans the canvas to centre each match |
flow-health-check | Scores the open Flow against the @sfdt/flow-core rules engine — severity grid, issue families, and a flow-profile metrics panel; copies the report as JSON |
missing-description-flags | Flags Flow nodes and the Flow itself when they lack a description, with inline ⚠ markers |
api-name-generator | Generates API names from labels using a configurable case style — defaults to camelCase (also works in Object Manager) |
ai-assistant 🔌 | Token estimates plus AI answers about the current Flow via the bridge (Claude / Gemini / OpenAI) |
flow-deploy 🔌 | Deploys the current Flow via the bridge (sfdt deploy --metadata Flow:...) |
Setup → Flows
| Id | What it does |
|---|---|
flow-list-search | Fuzzy search over the Flow Definitions list, with status and type filters |
scheduled-flow-explorer | Lists every schedule-triggered Flow with its next run time and a relative descriptor (list or calendar view) |
flow-trigger-explorer-enhancer | Opens a cross-object panel of every active record-triggered Flow, grouped by object and timing (Before Save / After Save / Before Delete), each with its trigger event, process type, description, and a one-click Open in Flow Builder link — from a single live FlowDefinitionView query |
trigger-conflicts | Detects record-triggered Flows that overlap on the same Object · Timing · Event |
subflow-graph | SVG graph of subflow invocation relationships, with depth metrics and cycle detection |
comparison-exporter | Exports an org-vs-org Flow comparison report as TSV |
flow-version-manager 🔌 | Side panel of active/draft Flow versions with one-click activate / rollback |
Setup & navigation
| Id | What it does |
|---|---|
setup-tabs | Adds an Automation Home plus reorderable tabs to the Setup tab bar (classic + Lightning) |
org-release-badge | Shows the org’s Salesforce release (e.g. Summer ‘26) and max API version as a badge in the Setup tab strip; flags preview releases |
api-version-audit | On-demand API-version audit — launched from the ⚡ menu / command palette, opening as a Workspace tab or page view. Leads with an API v67 · N behind summary, then per-type API-version histograms (Apex classes/triggers, active Flows, LWC, Aura) with below-floor rows highlighted; each below-floor row expands to name the components behind. An org-max footer closes it out |
Salesforce APIs (Setup, Flow Builder, Trigger Explorer)
| Id | What it does |
|---|---|
soql-runner | Run SOQL or SOSL via a SOQL | SOSL toggle that also auto-follows a FIND {…} query. SOQL (REST or Tooling): field/object autocomplete (fed fields from the Schema Browser’s Insert into query), a 🔎 Explain query-plan view (cost/cardinality/leading operation, no execution), CSV export of the current page or all rows (follows queryMore pagination with a progress indicator + cancel), and a LangGraph node generator. SOSL (REST only — the Search resource has no Tooling variant, so Explain and the LangGraph generator don’t apply): results grouped per returned object. Both share the result toolbar — Copy CSV / Export CSV / Copy JSON / Copy for Excel (TSV) — which applies per group in SOSL. History and bookmarks remember which mode an entry used. See Highlights |
soql-nl-generate 🔌 | Off by default. Adds Generate query to the SOQL Runner: describe a query in plain English and the generated SOQL lands in the editor for review — it is never run for you. Sends your description plus the objects’ field metadata (never record data) through the bridge to the CLI’s configured AI provider; the extension holds no AI endpoint or key. SOQL only. See Highlights |
soql-bulk-delete | Off by default. Adds Delete N rows to the SOQL Runner’s result toolbar when the rows carry an Id: automatic backup CSV (verified to cover every row) → typed DELETE <n> <Object> confirmation → batched, cancellable delete with progress and a per-row failure report. See Highlights |
org-limits | Live governor-limit usage, sorted by pressure and colour-banded |
rest-explore | Fire arbitrary GET/POST/PATCH/PUT/DELETE against /services/data/... with a response viewer and history |
soap-explore | Build and send SOAP API requests with a payload editor and response viewer |
event-monitor | Subscribe to and monitor platform / streaming events live |
Record & Object Manager pages
| Id | What it does |
|---|---|
inspect-record | View a record’s complete field set — including empty and system fields — via the REST API, with a Fields / JSON toggle to see the raw REST payload (copyable); also reachable from a right-click “Inspect this record” context menu |
show-api-names | Toggle inline field API names on record pages (object API name + 18-char id in the header), with copy helpers: Id, Apex insert, SOQL SELECT, and a field picker that hands any field to Field Impact Analysis |
data-import | Guided CSV data import into the org |
field-creator | Bulk-create multiple custom fields at once |
metadata-retrieve | Manifest builder + retrieve/deploy: browse metadata types and members, tick components, and watch a live package.xml — or destructiveChanges.xml pair (Additive / Destructive mode toggle, with a deletion warning) — preview. With the bridge connected, discovery and XML come from the sfdt CLI (manifest.discover / manifest.render — byte-identical to sfdt manifest); without it, the extension falls back to the SOAP API. Selections persist per org, with clear-all |
export-for-prompt | Copy a dense Markdown schema for an object to the clipboard for pasting into an LLM prompt |
schema-browser | Two-pane object/field explorer (types, picklists, formula source, reference cross-links, child relationships) with Copy API name, Insert into query (into the SOQL Runner), and an Export selected for prompt field picker — see Highlights |
field-impact | What writes this field? — the Flows (parsed, not guessed), workflow field updates, and Apex classes/triggers that write a given field, each labelled confirmed or inferred, with open links — see Highlights |
Workspace tab
These run inside the standalone Workspace tab:
| Id | What it does |
|---|---|
apex-anonymous | Execute anonymous Apex with compile/runtime results, saved snippets, a DebugLevel picker for the captured log, and 📊 Run & analyze (runs the Apex, finds the log it produced, and opens it in the log Analyzer) |
debug-log-viewer | List recent ApexLog records and view full log bodies, with a 15s auto-refresh toggle, Delete all logs (bulk-clears the org’s logs behind a count-confirm), a per-log 📊 Analyze view (method timings, governor limits, SOQL/DML/callout inventories, and a Flame chart), 📂 Import log from disk (no org needed), and a ⚑ Trace flags header entry — see Highlights |
schema-browser | Two-pane object/field explorer with copy/insert/export-for-prompt actions — see Highlights |
field-impact | What writes this field? — Flows (parsed via @sfdt/flow-core), workflow field updates, and Apex text hits for one Object.Field, each badged confirmed or inferred — see Highlights |
trace-flags | Manage TraceFlags and debug sessions without a trip to Setup — list active flags with a live expiry countdown + one-click renew, start/stop a session for yourself or another user, and Basic/Full/Custom DebugLevel presets. Also a ⚑ Trace flags entry in the Debug Logs header |
saved-soql | Browse bookmarked and recent SOQL and load any query straight into the runner, plus a built-in read-only Templates group of ready-to-run admin/dev queries |
apex-test-runner | Run Apex tests (runTestsAsynchronous) and view pass/fail results inline (Tooling API) |
apex-coverage | Org-wide and per-class Apex code coverage with deploy-threshold colour bands (Tooling API) |
dependency-explorer | ”What references this / what does this reference” for Apex, Flows, fields, pages, and LWC via MetadataComponentDependency |
org-switcher | Switch the Workspace between logged-in orgs (discovered from session cookies) |
flow-quality | Scores a Flow’s quality — fetches its Metadata (Tooling) and runs @sfdt/flow-core in-browser; no bridge needed |
drift-check 🔌 | Metadata drift via the bridge — latest sfdt drift snapshot by default, or run live; filtered by component |
metadata-scan 🔌 | Live metadata inventory via the bridge (same logic as sfdt scan) |
org-compare 🔌 | Live org-vs-org / org-vs-local comparison via the bridge (same logic as sfdt compare) |
org-health | Five checks run live against the org with no setup — coverage, inactive users, license use, API-version spread, limits near cap — plus twelve more from the CLI’s audit/monitor snapshots when the bridge is running |
Adding a feature is a one-file change — see extension/features/ and the registry in
extension/lib/feature-registry.ts.