Skip to Content
SupportChangelog

Changelog

SFDT follows Keep a Changelog  and Semantic Versioning . Each workspace maintains its own changelog in the repository; this page summarizes recent highlights.

@sfdt/cli — 0.26.1

A maintenance release: a week of dependency updates, a CI gap closed, and one security fix the pre-release gate turned up.

  • The Compare page can no longer be made to read files outside your project. The dashboard’s local-component read followed symlinks off disk. Clone a hostile SFDX repo where AccountService.cls is a symlink to ~/.sfdx/<user>.json, run sfdt ui, open Compare, and that file came back in the browser. The read is now containment-checked like every other project read. Same class as 0.26.0’s symlink work — a missed call site, not a new bug shape.
  • CI now builds and typechecks the web workspace. It ran unit tests but never the build, so a framework major could land green on unit tests alone.
  • Dependency maintenance: nodemailer 9 → 10, @oclif/core and oclif 4 → 5 (both need Node ≥ 22, already required), plus grouped runtime and dev updates.

@sfdt/extension — 0.16.0

  • Quality Results in the Workspace. The last sfdt quality run, rendered as a per-file issue list — severity, line, rule id, and engine attribution (pmd, eslint, …), grouped worst-first and filterable. Files that map to a Setup component get “Open in Setup”. A skipped scan is never shown as a pass.
  • Bridge protocol 1.3 → 1.4 — one additive read-only request kind, quality.results.
  • Settings validation migrated to zod 4. Internal, with one externally visible consequence avoided: the new .default() semantics would have loaded bridge, telemetry, and activity-log settings as empty objects on a fresh profile — no SMTP port, no shortcut, no highlight colour.

@sfdt/cli — 0.26.0

A security release, four days after 0.25.0 — because 0.25.0 shipped this vulnerability’s mitigation as opt-in only and left the default open.

One change needs action when you upgrade.

An MCP server launched inside a project now serves only that project. projectRoot is chosen by an AI model, and this CLI feeds that model untrusted org content — so a call the operator read as “query the current project” could name a different checkout and run against its authenticated org.

Multi-project routing still works, two ways: start the server outside any project (a neutral server routes every call, unrestricted), or list the roots in SFDT_MCP_PROJECT_ROOTS (colon-separated). Subdirectories of the launch root are accepted — they name the same project. Only the implicit case is refused: launched in project A, asked for project B, with no allowlist. See MCP.

  • Secrets are redacted in JSON and XML, not just prose. Every AI path redacts the assembled prompt string, and the pattern required a name followed by : or =. In JSON the next character is a quote; in XML it is >. Both reached the configured provider verbatim — as did SF_PASSWORD=…, the shape most likely to appear in a log.
  • sfdt release no longer grants the model write access while it reasons over git log output — commit bodies, which in a cloned repo are authored by whoever wrote the history.
  • Project file reads and writes refuse symlinks. An in-project logs/deploy.log pointing at ~/.sfdx/<user>.json was read and, on the dashboard’s explain route, sent to the AI provider. Paths handed to sf itself are checked the same way.
  • Parked MCP results return a redacted preview — the spilled file was redacted, the copy returned to the model was not.

Every finding above came from the pre-release review, including two found in the fixes for the first two. Full detail in the CLI CHANGELOG.md.

@sfdt/cli — 0.25.0

A security release. Everything left open from the 0.24.0 review, plus eight more found by reviewing those fixes. None of it is a regression from 0.24.0 — these paths had shipped for several releases.

Three changes need action when you upgrade.

  1. Notification webhooks no longer follow redirects. A 3xx from your endpoint used to re-send the message body and any headersEnv token to wherever it pointed. A redirect is now an error naming the destination — configure the final URL directly. See Notifications.
  2. sfdt retrofit requires confirmation even without --execute. Without it, retrofit still retrieved over your checkout and committed the result. See Retrofit.
  3. .sfdt/config.json rejects unknown keys under mcp.salesforce. Only transport, command and args are accepted; a fourth key now fails config load instead of being silently ignored. See Configuration.

Also regenerate any CI pipeline created before this release — sfdt ci init --provider azure or --provider github.

  • Salesforce API names are validated everywhere they reach a path. sfdt events publish and sfdt record get/edit/clone interpolated a name into a REST path with no validation. This matters most through MCP, where the value is chosen by an AI model and the CLI feeds that model untrusted org content: a name like ../tooling/sobjects/ApexClass reached the Tooling API, and sfdt_record_get is read-only with no confirmation prompt at all. One shared guard now covers every call site.
  • Parked MCP results are redacted correctly and written 0600. Large tool results spill to .sfdt/cache/parked/. Add that directory to .gitignoresfdt init now says so.
  • The dashboard’s manifest viewer only serves manifests. It could read any file under the project, including .env. It is now restricted to .xml under your manifest and log directories and refuses symlinks. See Dashboard.
  • New SFDT_MCP_PROJECT_ROOTS — an optional allowlist pinning which projects an MCP server will serve. Every tool accepts a projectRoot and that value is model-chosen, so a call presented as “the current project” can name a different checkout. Cross-project routing is a real feature, so this is opt-in — set it on any machine holding more than one customer’s checkout. See MCP.
  • The sfdt GitHub Action writes its JWT key with mktemp, not a fixed path left group-readable on persistent runners. See CI/CD.

@sfdt/cli — 0.24.0

A feature release that also closes four high-severity findings from the pre-release security review. Two new workspaces land, both private to the repository and not published to npm.

Upgrading from 0.23.x: an absolute path in a project-path config key (logDir, manifestDir, and siblings) is now refused even when it resolves inside the project root, and the rule applies at config load rather than only in the dashboard. A committed "logDir": "/abs/path/inside/project" is replaced with the default, which changes where logs are written. Use a project-relative path ("logs"), or set SFDT_ALLOW_UNSAFE_CONFIG=1 if you trust the project. See Configuration.

  • The Chrome extension can read sfdt quality output. A new read-only quality.results bridge kind returns the latest recorded Code Analyzer run through the same parser that backs the dashboard, so every surface reports the same result — including a SKIPPED verdict when the scanner never ran. It never starts a scan: a Code Analyzer sweep is minutes of work and should not be triggered by a browser click. Bridge PROTOCOL_VERSION moves 1.3 → 1.4; the change is additive, so an older client and server still talk.
  • New Installed Packages page in the dashboard, listing managed and unmanaged packages in the target org with per-package notes.
  • Notifications redact every channel, email included. Redaction previously ran per webhook shape and missed the email branch, so an email channel relayed run output through your own SMTP server unredacted. It now runs once for every channel, and a recipient list fixed by a committed .sfdt/config.json is refused the same way a hardcoded webhook URL already was. See Notifications.
  • sfdt pr comment is scoped and gated. It accepted a full PR URL, which names a repository as well as a pull request — so a value chosen by an AI model could post an org snapshot to a repo you don’t own, under your GitHub identity. It now takes a PR number in the current repository, redacts the body, and the matching MCP tool requires explicit confirmation instead of presenting as read-only.
  • Session ids are redacted in full. A Salesforce session id is <entityId>!<secret>; redaction stopped at the !, masking the public id and leaving the credential in log excerpts and notification bodies. Refresh-token detection also no longer assumes a fixed character position that only matched some orgs.
  • Azure CI pipelines no longer interpolate a git ref into a script body. Generated Azure pipelines passed the PR target branch through Azure macro syntax, which the agent substitutes into the script text before the shell parses it. Branch names may legally contain shell metacharacters. The value now goes through an env: mapping, matching the GitHub templates. Regenerate any Azure pipeline with sfdt ci init --provider azure. See CI/CD.
  • Config settings are classified by capability rather than by key name, so a newly added setting in an existing class — process spawn, exfiltration destination, filesystem path, privilege, code execution — is covered without a separate rule.

@sfdt/cli — 0.23.1

A security patch. Both fixes close a path where input chosen by someone other than the operator reached a sink that trusted it.

  • MCP path arguments are now contained to the project. sfdt_apex_run’s file and the manifest of sfdt_validate / sfdt_deploy were resolved with a bare path.resolve(), which returns an absolute input verbatim and honours ../. The data-set name of the four sfdt_data_* tools had no validation at all. All of them now reject absolute paths, .. segments, and anything resolving outside the project.
  • Why that matters more on MCP than elsewhere: tool arguments are chosen by a model, and the CLI’s AI surfaces feed that model untrusted org content — Apex compile errors, flow metadata, deploy failure text. A path argument is untrusted input, and confirmExecution is not a mitigation: it authorises the operation while the model still supplies the argument.
  • A local-only ai.baseURL could point offsite. The loopback exemption that lets Ollama, LM Studio, llama.cpp and vLLM work with no opt-in anchored the host but not the authority, so http://127.0.0.1:80@example.invalid/v1 read as loopback while the real host was example.invalid — and the exemption is exactly what keeps the ai.apiKeyEnv Authorization header attached. Now parsed rather than pattern-matched, rejecting userinfo and non-http schemes. Local inference servers are unaffected. See Configuration.

If you run sfdt mcp, upgrade. Both gaps are reachable in 0.23.0 and earlier, and .sfdt/config.json is committed — it arrives with whatever repository was cloned.

@sfdt/extension — 0.15.0

  • Deployment Status — watch org deploys without a trip to Setup. A Workspace tool listing recent deployments with status, who ran them, timings, and component and test counts, distinguishing a validation from a real deploy. Click a failed or partially-failed row and the component errors come back with it.
  • Read-only by design. It never starts, cancels, or retries a deploy, and needs no new permission. Default on.
  • Auto-refresh is data-driven, not a toggle. A 15-second interval runs only while a loaded row is still in flight, and stops when the view closes — nothing polls in the background once the deploys have settled.

@sfdt/cli — 0.23.0

  • The first commands that change a live org. Everything before this read an org, deployed metadata from a reviewed repo, or wrote a file. New: sfdt automation (one on/off grid over five automation types, stating which cost a metadata deploy rather than a record write), sfdt permissions (object and field access, with a repo-vs-org drift gate; profiles are refused by name because Salesforce does not permit direct DML on profile-owned entries), and sfdt record, sfdt field, sfdt events, sfdt packages, plus sfdt data load over Bulk API v2.
  • sfdt ledger — an append-only, hash-chained record of every org change, and how to reverse one. Each entry’s hash covers the previous one, so an edited or deleted line breaks the chain and ledger verify names the first break. Every write records the state it is about to replace before the org is touched, so ledger undo can put it back. It is a record, not a gate: writes apply immediately, and the recorded before-state is what makes them reversible afterwards — which is when you usually find out a change was wrong.
  • Every org-mutating command carries the same brakes. --dry-run, a production guard that fails safe (an org whose sandbox status cannot be read is treated as production), and a confirmation that refuses rather than auto-confirms when non-interactive — because a prompt in CI is either a hang or a silent yes.
  • @sfdt/flow-core 0.13.0 ships the shared automation, permissions, packages and field-usage models the CLI and the Chrome extension both read, so neither can drift from the other. Consumer ranges move to ^0.13.0.

These commands change a live org. Start with --dry-run, and note that a production org needs an explicit --production before any of them will write.

@sfdt/extension — 0.14.0

  • Edit a record in the inspector with the control each field deserves. Picklists become a <select> built from the describe’s own values, dates and times get typed inputs that keep their seconds, and numbers carry the field’s scale — replacing one plain text box for everything, which used to make untouched numbers read as unsaved changes.
  • A field you cannot edit now says why. Formula fields, auto-numbers, audit fields and fields your permissions do not cover all still appear, each with a short reason — nothing is filtered out of the view, only out of the payload.
  • Saving claims one of exactly three things. Saved, no changes were saved, or save outcome unknown — the third is new, and it is the honest answer when a request times out and the write may well have committed.
  • Clone a record into a form you review before anything is created, and delete a record from the inspector — off by default, behind its own switch.

sfdt.sfdt-devtools (VS Code) — 0.7.0

  • Five new command groups in the picker, tracking the CLI commands above: Permissions, Packages, Platform Events, Field Usage and Record — plus Data → Load (Bulk API).
  • Destructive actions are marked as such (publish, record edit/clone, data load), mirroring the CLI’s own gating rather than adding a second opinion about it.

@sfdt/cli — 0.22.0

  • .sfdt/config.json is no longer trusted. That file is meant to be committed, so it arrives with whatever repository you cloned. The settings in it that execute code or choose where secrets are sent — plugins[], pluginOptions.autoDiscover, mcp.salesforce.command, a non-loopback ai.baseURL, and a channel’s headersEnv beside a literal remote URL — are now refused at load time unless you export SFDT_ALLOW_UNSAFE_CONFIG=1. If you use plugins or a remote AI endpoint, this affects you — see Configuration and Plugins. Loopback ai.baseURL (Ollama, LM Studio, llama.cpp, vLLM), ai.apiKeyEnv, webhookUrlEnv channels, and defaultOrg are unaffected.
  • AI provider sandboxes are no longer disabled by an empty tool list. allowedTools: [] means “no tools at all”, but the gate tested for a non-empty list — so the most restrictive request a caller could make silently dropped the read-only sandbox.
  • @sfdt/flow-core 0.11.0 adds extractFieldWrites / filterFieldWrites — “what writes this field?” from a Flow metadata payload, with confirmed/inferred status matching the dependency gaps report. Consumer ranges move to ^0.11.0 in lockstep.

@sfdt/extension — 0.13.0

  • Describe a query in plain English and the SOQL lands in the editor — never in the org. The SOQL Runner’s new Generate query panel writes its answer into the editor and tells you to review it, then Run. The prompt carries your description plus a field table for the objects involved and no record data — a check refuses the send outright if any value from the results on screen appears in the assembled text. It goes through the local bridge to the provider you configured under your own API key; the extension gains no new permission and no new host. See Generate query.
  • Bulk delete from a SOQL result set, built as guard rails rather than a delete button. The order is the feature: the affected rows are serialised to a backup CSV and handed to your browser first, then a dialog asks you to type DELETE 12 Account exactly, and only then does anything reach the org. Deletes run in waves of 25 with progress and a Cancel; rows that fail stay in the table listed by Id with a reason, and a timed-out row is called out separately as may still have committed. See Bulk delete from a SOQL result set.
  • These are the first two features that ship switched off. Neither is built at all until you tick its row — the controls are absent, not hidden — because one deletes records irreversibly and the other moves org schema out of the browser. Both carry their own kill-switch id, so the destructive half can be taken away without taking the query runner with it. See Settings.
  • A Salesforce error now renders the org’s own text and our guidance as separate lines, everywhere. One helper builds the error block and nothing else may, so a failure can no longer lose the org’s real message or run the two together into one paragraph — and every one of them is announced to screen readers, which fifteen hand-rolled panels previously were not.

@sfdt/extension — 0.12.0

  • A Workspace Overview home. The empty “pick a tool to get started” pane is now a dashboard: org-health tiles, quick actions, and a recent-activity table. The header also shows the org’s API version alongside the release (Summer '26 · v67.0), which decides what every tool calls and was previously only visible on hover. See Workspace.
  • A line-numbered, syntax-highlighting editor for SOQL and Apex, so “Malformed query at line 3” from the org points at a line you can see. Used by the SOQL Query Runner and Execute Anonymous.
  • One Org Health tool instead of two. “Org Health” and “Org Health (Live)” were two near-identical entries with nothing on screen explaining the difference. Org Health now always runs five checks with no setup and adds twelve more when the CLI bridge answers. See Features.
  • Feature kill switches now apply to the Workspace and side panel. Turning a tool off in Settings removed it from the ⚡ menu on Salesforce pages but left it visible and usable in the Workspace. See Kill switch.
  • An extension update no longer floods open Salesforce tabs with errors. Chrome updates an extension underneath tabs that are already open, orphaning the content script; every storage touch was throwing uncaught. Storage now fails quietly — the tab still needs a reload, but a routine Web Store update no longer fills the console.

@sfdt/extension — 0.11.0

  • Salesforce’s real error is no longer replaced by “Session expired or invalid.” A query the org rejected (say, a quoted value against a numeric field) reported a dead session on a perfectly healthy one, discarding the org’s actual MALFORMED_QUERY answer. Errors now lead with the org’s own message plus its error code, the fields it named, and a short “what to do” line. See Troubleshooting.
  • SOAP was broken on every path. The service URL was built with a v-prefixed API version, which Salesforce refuses — so Metadata Retrieve and Deploy, the SOAP API Explorer, and Data Import’s batches all failed. Fixed and pinned per service by tests.
  • Writes no longer time out after 5 seconds and blame your session. Reads now get 30s and writes 120s; a blown budget on a write says the result is unknown and the change may already have saved, rather than reporting a failure for something that landed.
  • Field Impact Analysis — “what writes this field?”, answered from Flows (parsed, not guessed), workflow field updates, and Apex, each row badged confirmed or inferred.
  • SOSL mode in the SOQL Runner, with results grouped per returned object and per-object copy and export. History and bookmarks record and restore the query language.
  • The extension is called “SFDT for Salesforce” everywhere now — the manifest name and toolbar tooltip still said “SFDT SF Helper”. Display text only; nothing needs migrating.

@sfdt/cli — 0.21.0

  • Apex observability and a bounded SOQL/SOSL toolkit. New sfdt apex commands manage trace flags and debug logs, execute Anonymous Apex, and expose the same capabilities to MCP and VS Code. The new sfdt soql family searches schema, validates queries, inspects query plans, and runs bounded SOQL/SOSL queries; the dashboard adds a matching SOQL Console.
  • Manifest builder bridge. The bridge protocol is now 1.3 and adds read-only manifest.discover and manifest.render kinds, so the Chrome extension and dashboard use the CLI’s single manifest writer. Existing 1.2 clients receive a compatibility warning and keep working.
  • Salesforce Code Analyzer v5 is now required. The legacy v4 fallback and its opt-in flag, config key, and environment variable are removed. A machine without v5 reports a skipped scan with install guidance rather than a fabricated clean result.

@sfdt/extension — 0.10.0

  • Metadata Retrieve & Deploy is now bridge-aware. When connected to CLI 0.21.0 or later, it browses metadata and renders additive or destructive manifests through the CLI; the existing Salesforce SOAP path remains the offline fallback. Selections persist per org.
  • Chrome Web Store release. The extension is now available as SFDT for Salesforce .

@sfdt/cli — 0.20.0

A security fix, and secrets kept out of config on two more surfaces:

  • Security — plugins now accepts package names only. Plugins load before argument parsing, and the resolver accepted file paths as well as package names — so a project’s .sfdt/config.json listing "plugins": ["./tools/helper.js"] executed that file’s top-level code on any sfdt command, sfdt --version included, without logging it. Since sfdt is built to run inside other people’s Salesforce projects, cloning a repo and running one command was enough. Entries that look like paths are now refused with a warning. Scoped names (@org/sfdt-plugin-thing) and package subpaths are unaffected — the guard rejects paths, not slashes. If you load a plugin by relative path today, install it as a package instead.
  • Security — redaction now catches secrets written as free text. PEM private-key blocks, force:// sfdx auth URLs, Authorization: Bearer headers, and secret-ish key=value assignments are redacted before anything reaches an AI provider, a webhook, or the audit log. Variable names like apiKeyEnv: "MY_VAR" are deliberately left intact.
  • headersEnv on notification channels, and ai.headersEnv for the http AI provider. Reference a bearer token or gateway secret by env-var name instead of writing it into .sfdt/config.json. A named-but-unset variable fails that one channel with an error naming it, rather than silently sending an unauthenticated request. Enables n8n Header Auth, Cloudflare Access service tokens, and any gateway expecting a shared-secret header.
  • New harness-escalation notification event — for automation that needs to hand a decision back to a person instead of encoding a fix.
  • agent-fix runs are recorded in run history, so auto-fix attempts trend alongside deploys and tests.

@sfdt/extension — 0.9.1

  • Removed the “Login as user…” Setup tab. The Setup tab strip now injects three base tabs rather than four, and the deep link no longer appears in the ⚡ command palette. It was only ever a link to Setup’s standard user list — the page where Salesforce itself renders the per-user Login action — so nothing is lost. No permission changes.

sfdt.sfdt-devtools (VS Code) — 0.5.2

  • “Send Notification (event)” in SFDT: Run Command… now lists harness-escalation among the accepted lifecycle events, matching the CLI. Description text only.

@sfdt/cli — 0.19.0

Org-side API-version coverage now matches the local scan:

  • sfdt versions and sfdt audit api-versions now cover LWC and Aura on the org side. The local source scan always inventoried Apex/Trigger/Flow/LWC/Aura, but the org half stopped at Apex and Flows — so an org-side bundle stuck on an old API version was invisible and the two columns weren’t comparing the same set. Both now query LightningComponentBundle and AuraDefinitionBundle via the Tooling API, keyed to match the local scan.
  • Independent degradation in audit api-versions — Flow/LWC/Aura are optional types; any that a given org can’t query leaves the check at warn/ok with the type named in the summary rather than failing the run. Apex remains the required core. Output order is deterministic.

@sfdt/cli — 0.18.2

Maintenance and dependency-security release — no CLI behaviour change:

  • Security — cleared all outstanding high-severity dependency advisories: npm-audit fixes for fast-uri, brace-expansion, and body-parser; an adm-zip ^0.6.0 override (GHSA-xcpc-8h2w-3j85 / CVE-2026-39244); a shell-quote ^1.9.0 override floor; and an express-rate-limit bump.
  • From 0.18.1 — shell scripts resolve bash via /usr/bin/env (works where bash isn’t at /bin/bash), and sfdt skills export emits a stable, deterministic order.

@sfdt/cli — 0.18.0

A platform-integrity release plus a new API-version audit across every surface:

  • sfdt versions — audit the Salesforce API versions of local source (Apex, Flow, LWC, Aura) and the org against the org’s max API version; --local-only works offline, --json for scripting.
  • sfdt versions --advise — an AI upgrade advisor (value / risks / breaking changes / effort per component), grounded by a curated per-version registry so it never invents version facts; read-only.
  • Surface catalog framework — the command reference, feature counts, and dashboard page list are now generated from the code’s own catalogs, with CI that fails on drift.
  • GitHub Action args-json — a shell-injection-proof way to pass arguments; the legacy command string is deprecated and hardened.
  • Hardeningtest --logic zero-test guard + --wait validation, and quality --allow-legacy-analyzer (Code Analyzer v4 is opt-in legacy only; v5 required for authoritative scans).

@sfdt/extension — 0.9.0 — 2026-07-24

The API Version Audit gets specific, and a contrast-guard sweep:

  • API Version Audit now names the components that are behind, and covers LWC + Aura. The audit used to say “12 things are on v41” but never which twelve — its queries selected the version alone. It now selects each type’s name field and renders below-floor buckets as keyboard-accessible disclosures that expand to the component list. LightningComponentBundle and AuraDefinitionBundle are queried too, so it covers five types where it covered three. See Features.
  • Widened the fill-token contrast guard to every design-token fill with a foreground variant (it previously checked only three, and only inline literals), and fixed three pre-existing dark-mode contrast defects it surfaced.

@sfdt/extension — 0.8.0 — 2026-07-20

The full Phase 0–3 build-out: a security-hardened worker-side session model, dark mode, a global command palette, a Schema Browser, a docked side panel, and a complete debug-log analysis suite. See Features.

  • Security posture — the session id never leaves the background worker. Every REST/Tooling/SOAP call (and the Event Monitor’s live streaming) now runs inside the service worker, so page and content-script code hold no sid. Injected UI mounts in a closed shadow root, isolating it from Salesforce’s own CSS/DOM in both directions.

  • Dark mode + session-layer hardening — a light/dark/auto Theme setting, plus support for US GovCloud (.mil), Salesforce China (.sfcrmapps.cn), and Microsoft Defender (.mcas.ms)-proxied orgs with per-org session resolution and org-id cross-matching. See Privacy & Permissions.

  • Command palette (command-palette) — a global, keyboard-first ⚡ overlay (Ctrl/Cmd+Shift+K) on any Salesforce page: fuzzy-search features, Setup deep-links, objects, a pasted record Id, and your own custom shortcuts (managed on the options page). Opening it makes zero org API calls. See Features → Command palette.

  • Schema Browser (schema-browser) — a 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. A Workspace tool and a record-page ⚡ entry.

  • Docked side panel — the tools now also run in a docked Chrome side panel (Firefox: native sidebar_action), opened from the toolbar popup. It follows the active org across tab switches, and an Appearance setting can make it the default tool surface. Adds the Chrome-only sidePanel permission — see Privacy & Permissions.

  • Debug Logs — Analyze view + Flame chart — a per-log 📊 Analyze action renders a sortable method-timing table (total / self / count), per-namespace governor-limit snapshots, and SOQL/DML/callout inventories with jump-to-line, plus a canvas Flame chart of the invocation tree (zoom, hover, click-to-select synced with the table). Backed by a pure Apex-log parser.

  • Import log from disk & Run & analyze — 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.

  • Trace Flags & debug-session manager (trace-flags) — list active TraceFlags with a live expiry countdown + one-click renew, start/stop a debug session for yourself or another user, and Basic/Full/Custom DebugLevel presets. A Workspace tool and a ⚑ Trace flags entry in the Debug Logs header.

  • SOQL Runner power-ups — a 🔎 Explain action shows Salesforce’s query plan (cost, cardinality, leading operation, notes) without executing; Copy JSON and Copy for Excel (TSV) on the result toolbar; and Export all as CSV that follows queryMore pagination to download every row, with a live progress indicator and Cancel (memory-safe by construction).

  • Query template pack — the Saved SOQL panel gains a read-only Templates group of 8 built-in admin/dev queries (Apex test coverage, validation rules, login history, setup audit trail, limits snapshot, deploy requests, active TraceFlags, record types) that load straight into the runner.

  • Execute Anonymous — DebugLevel picker — choose which org DebugLevel a captured log uses from a native Log level select (persists per user), no trip to Setup.

  • Debug Logs — auto-refresh + bulk delete — a 15-second Auto-refresh toggle (off by default, no orphan timers) and a Delete all logs action that clears every org ApexLog behind a count-confirm dialog.

  • Inspect Record — raw-JSON toggle + right-click open — a Fields / JSON view toggle renders the raw REST payload (copyable), and a right-click “Inspect this record” context menu opens the inspector for a record Id on the page or link (new contextMenus permission — see Privacy & Permissions).

  • Login as user — the Setup tabs feature adds a Login as user… deep link to Setup’s user list (deep link only; Salesforce enforces the Login-As permission server-side).

@sfdt/extension — 0.7.0

  • api-version-audit (the 40th feature) — an org-side Setup pill showing the org’s max API version and how many components lag, expanding to per-type API-version histograms.

sfdt.sfdt-devtools (VS Code) — 0.5.1

  • sfdt.orgColor is now opt-in. Per-org window theming defaults to false; the extension no longer silently writes workbench.colorCustomizations into a version-controlled .vscode/settings.json on activation. Disabling the setting now removes the colour keys it wrote instead of leaving a stale block behind.

sfdt.sfdt-devtools (VS Code) — 0.5.0

  • API Versions Report and Run History command-tree entries (running sfdt versions / sfdt history), plus a surface-parity fix exposing twelve more commands in the tree.

@sfdt/cli — 0.17.0

A CI/CD and diagnostics batch:

  • GitHub Action — run any sfdt command as a single step (uses: scoobydrew83/sfdt@v0) with built-in sfdx-url/JWT auth and version pinning (cli-version: auto).
  • ci init expansion — new release (approval-gated real deploys) and scratch (create → deploy → test → always-delete) pipeline types; JWT auth (--auth jwt); Docker (--runner docker, GitLab/Bitbucket) and Action (--runner action, GitHub) runners.
  • Quality gate in PR pipelines — generated deploy workflows run an advisory sfdt quality scan; GitHub uploads SARIF to code scanning (quality --output-file).
  • test --lwc — run LWC (Jest) unit tests via the CLI, locally and in scratch-org CI.
  • deploy --smart --notify — smart deploys now push success/failure notifications through your configured channels.
  • sfdt doctor core group — new environment diagnostics (sf, Node, git, .sfdt config validity, AI provider, and a warn-only, timeout-bounded org-connectivity probe) alongside the extension-stack checks. Flags --core, --extension, --org, --json; CI-safe (the org check never fails the run).
  • Node 22 floor — @sfdt/cli requires Node ≥ 22.15; all generated pipelines and the action default to Node 22.

@sfdt/cli — 0.16.0

A Salesforce-release-readiness and Agentforce batch:

  • sfdt agent-test — run an Agentforce agent test (sf agent test run) as an exit-code CI gate, with --notify and --pr-comment. Smart deploy and sfdt manifest now also recognise Agentforce metadata (Bot, GenAiPlanner/Plugin, AiEvaluationDefinition, and more) in git deltas — see Smart Deploy.
  • sfdt test --logic — run Apex and Flow tests together via Salesforce’s Spring ‘26 sf logic run test, with AI failure analysis.
  • sfdt quality upgradesCode Analyzer v5 (sf code-analyzer run) with --include-fixes, an API v67 user-mode readiness scan (--api67), and a --test-hints check for missing @IsTest(testFor=…) annotations.
  • sfdt deploy automations as flags--tag, --create-pr, and --notify (previously GUI-only), plus any-.xml manifest auto-detection.
  • New org-health checksaudit mfa-readiness and audit soap-logins; monitor limits/org-info gain elastic-async and release-version reporting.
  • Google Chat notifications and dashboard run-now / create-delete-generate actions for Audit, Monitor, Scratch, Data, and Docs (plus new Agent Test and Retrofit pages).
  • MCP surface now covers the full CLI lifecycle — on top of the read-only sfdt_coverage / sfdt_scan / sfdt_dependencies / sfdt_flow_scan, the server gained the mutating (confirmExecution-gated) sfdt_release, sfdt_scratch_*, and sfdt_data_* tools plus sfdt_test and read-only sfdt_history — 30 tools in total.
  • Run historysfdt history (with --type / --limit / --json) surfaces a durable local index of every audit/monitor/quality/test/deploy/agent-test run, so outcomes can be trended over time; audit/monitor also archive full timestamped snapshots.
  • sfdt test --class-names runs a specific subset of Apex test classes (powers the VS Code “Run test class” CodeLens), and sfdt skills export --target pack emits an npx skills add-compatible pack. The Chrome extension’s native-messaging host now also answers the read-only bridge kinds (quality/scan/compare/drift/org-health) when the HTTP bridge isn’t running.
  • Dependency coverage expanded + graph rebuilt — the CLI and the dashboard graph share one METADATA_TYPE_REGISTRY in @sfdt/flow-core (no more drift) and cover Visualforce components and Aura alongside Apex, triggers, VF pages, Flows, and LWC, with Custom Object / Custom Field reachable too. The dashboard graph is now seed + expand-on-click: pick a component by name and type, then click nodes to expand their dependencies (both directions, capped per click with a “+more” badge on high-degree nodes) — so it scales to any org instead of bulk-loading the whole thing.
  • Dependency gap reportsfdt dependencies <name> --gaps parses local source to surface references the Tooling API misses (dynamic Apex, LWC @salesforce/apex, formula and Flow references). Offline by default; --org diffs against the API to mark each MISSING vs confirmed. Also available as a Gaps panel on the dashboard Dependencies page, and a Show inferred toggle overlays those missing edges onto the graph itself as dashed lines.

@sfdt/cli — 0.15.2

  • Fewer false-positive trigger conflicts@sfdt/flow-core 0.9.4 now reads a record-triggered flow’s event from recordTriggerType, so Create-only and Update-only flows no longer collapse into a single “Unknown” conflict bucket in sfdt audit / Flow Intelligence. The fix reaches every flow-core consumer: CLI, dashboard, Chrome extension, and VS Code extension.
  • VS Code dashboard embed fixed — the dashboard server now sends Content-Security-Policy: frame-ancestors 'self' vscode-webview: instead of X-Frame-Options: SAMEORIGIN, so the VS Code extension’s webview can embed the dashboard again (it previously rendered blank). Arbitrary web origins are still refused.

@sfdt/cli — 0.15.1

  • Deploy picker & Release Hub cleanup — under subpath manifest layout, the deploy menu and dashboard Release Hub no longer list in-flight (manifest/release/deploy/) or already-deployed (deployed/) artifacts, which previously clogged the picker. A project path containing a space no longer breaks the interactive selection either.
  • Editable preflight settingsdeployment.preflight.* flags can now be changed from the dashboard (Settings → Config) with an inline safety caution, instead of being file-only. See Configuration.

@sfdt/cli — 0.15.0

Org-monitoring, CI/CD, and AI-agent additions on top of the org-health suite:

  • Expanded org healthsfdt audit / sfdt monitor grew to ~25 native checks (inactive validation/workflow rules, field-level access lint, connected apps, unused permission sets, legacy API usage, deployment history, paused flows, and more). License/Beta-gated checks degrade to a warn instead of failing CI. See Org Health & Operations.
  • Multi-channel notifications — Slack, Microsoft Teams, email, generic webhook, and Grafana Loki, with per-channel event filters and severity routing, plus optional AI executive-summary digests.
  • CI/CD templatessfdt ci init generates ready-to-run GitHub/GitLab/Azure/Bitbucket pipelines.
  • Smart Deploysfdt deploy --smart delta-deploys with smart test selection and overwrite protection; optional AI deploy-error analysis and a bounded coding-agent auto-fix loop (default-off).
  • Retrofit & PR commentssfdt retrofit (retrieve → commit → smart-deploy) and sfdt pr comment PR decoration.
  • AI — a new text-only http provider, a non-interactive --agent convention across AI commands, and per-metadata-type documentation prompts. See AI Providers.

@sfdt/cli — 0.13.1

Adds a native org health & operations suite — clean-room reimplementations of org diagnose/audit, monitoring/backup, documentation generation, data-set management, and scratch-org pooling — surfaced across four consumers: the CLI, the web dashboard, the built-in MCP server, and a brand-new VS Code extension. No AGPL dependency.

  • sfdt audit / sfdt monitor — native org diagnostics and monitoring (audit trail, licenses, MFA coverage, unused Apex, inactive users, deprecated API versions; org limits, errors, health, plus metadata backup), each writing a JSON snapshot every surface can read.
  • sfdt docs / sfdt data / sfdt scratch — generate MkDocs docs (objects, Apex, Flows, LWC) with optional AI overviews and per-role Developer/Admin/User/DevOps guides; manage data sets via sf data tree; and create/delete/list scratch orgs with a pre-created pool.
  • VS Code extension (@sfdt/vscode) — a new fourth surface: command-palette integration, an Org Health sidebar (audit + monitor snapshots), a status-bar item, and an embedded dashboard webview.
  • 0.13.1 hardeningsfdt data delete no longer reports partial or failed deletes as clean (--json returns status: "partial" with skippedCount/errorCount); audit, monitor, and data now surface Salesforce CLI’s real error text instead of the opaque execa message.

@sfdt/extension — 0.6.0

  • Flow Scanner — the flow-quality feature now renders the full @sfdt/flow-core report (issue families by score impact, affected elements, recommended fixes, dependencies) on real Salesforce pages, with Explore cross-links into the org-wide Dependency Explorer.
  • Org release badge & Field Access quick link — the Workspace and Setup tab strip show the org’s Salesforce release (and flag preview instances); Object Manager pages gain a Field Access tab.
  • Org Health (bridge) is now registered on real Salesforce pages and works via the native host.

@sfdt/extension — 0.5.0

  • show-api-names — annotate Lightning record detail pages with each field’s API name next to its label, plus the object API name and 18-char record id in the header. Copy helpers generate the record’s Id, an Apex insert statement, or a SOQL SELECT. See Features.
  • ai-assistant now shows the AI’s answer — “Run via sfdt” renders the response in the panel (with provider and a copy button) instead of confirming with a toast and discarding it, and uses the 60-second bridge timeout real AI runs need.
  • Safer bulk deleteflow-version-manager no longer blanket-overrides confirm(); the bypass is bounded to the selected versions and restored immediately.
  • missing-descriptions surfaces fetch failures with an error toast instead of silently rendering nothing.

@sfdt/extension — 0.4.0

A WXT/Chrome MV3 extension with a growing set of opt-in features.

  • 0.4.0 — Live-org Workspace — new tools that read the org directly (no sfdt ui server needed): code-coverage (org-wide + per-class Apex coverage), org-health-live (checks run against the org, not a snapshot), dependency-explorer (MetadataComponentDependency lookups), and an apex-test-runner. The Workspace is now tabbed — tools open as persistent tabs that keep their state when you switch away, so a stray click can’t discard a half-written query. flow-quality runs the shared @sfdt/flow-core rulebook in-browser for byte-identical scores to the CLI.
  • 0.3.3 — fixed the org-health bridge-token error hints to point at the real pairing flow (paste the token from ~/.sfdt/bridge-token, created when you run sfdt ui) and corrected the stale token-rotation comment.
  • 0.3.2 — added the Org Health panel (surfaces the CLI’s audit + monitor snapshots via the local bridge), richer anonymous-Apex log capture, and standardised the internal namespace to sfdt.
  • 0.3.0 — Workspace & Apex — added the standalone Workspace tab plus apex-anonymous, debug-log-viewer, org-switcher, and saved-soql; the Salesforce API client now works from the chrome-extension:// origin.

sfdt.sfdt-devtools (VS Code) — 0.4.1

  • Commands-tree catalog now surfaces the new CLI actions — test --lwc, deploy --smart --notify, and quality --output-file — keeping the extension in step with CLI 0.17.0.

sfdt.sfdt-devtools (VS Code) — 0.4.0

  • Run-test-class & agent-test CodeLenses — a ▶ Run test class lens on Apex test classes and a ▶ Run agent test lens on *.aiEvaluationDefinition-meta.xml specs, plus palette commands.
  • Test Runs in the Status view, coverage highlights, Problems-pane diagnostics — recent runs, gutter coverage bands, and quality violations surfaced as native VS Code diagnostics.
  • Smart Deploy — Validate & Review / Quick Deploy and a “Get started with SFDT” walkthrough; the two CLI spawn paths were consolidated into one.

sfdt.sfdt-devtools (VS Code) — 0.3.1

  • Embedded dashboard no longer renders blank — fixed server-side in @sfdt/cli 0.15.2 (frame-ancestors CSP replaces X-Frame-Options); update the CLI to 0.15.2+ alongside the extension. Also ships a refreshed extension icon.

@sfdt/vscode — 0.1.0

Initial release of the VS Code extension: command palette integration, the Org Health sidebar (audit + monitor snapshots), a status bar item, and an embedded dashboard webview.

Last updated on