VS Code extension · 0.5.1 · Docs

The extension,
every command and setting.

The complete reference for the CyberXYZ Supply Chain Scanner: sign-in, the lockfiles it reads, how findings are ranked and fixed, what your organization sees, every command and setting from package.json, privacy and troubleshooting.

  • 28// commands
  • 16// settings
  • 4// ecosystems
// install from a terminal
$code --install-extension cyberxyz.cyberxyz-vulnerability-scanner
// then, from the command palette
>CyberXYZ: Sign In
>CyberXYZ: Fix All

VS Code 1.80 or newer · npm · PyPI · Go · NuGet

01 · setup

Install

Install CyberXYZ Supply Chain Scanner from the Visual Studio Marketplace, or search for it in the Extensions view (Ctrl+Shift+X, Cmd+Shift+X on macOS). From a terminal:

shell
code --install-extension cyberxyz.cyberxyz-vulnerability-scanner

VS Code 1.80 or newer. Run CyberXYZ: Get Started from the Command Palette for a four-step walkthrough: sign in, open a project, review the issues, Fix All.

02 · setup

Sign in

Run CyberXYZ: Sign In. VS Code shows a one-time code and opens the CyberXYZ dashboard. Check the code matches and approve with your usual sign-in: password and MFA, SSO, or a passkey. There is no key to copy. No account yet? Create one at app.cyberxyz.io.

  • The session is stored in VS Code's secret storage (your OS keychain), never in settings.json.
  • It lasts 90 days without use. Every scan extends it. You can revoke it from the dashboard at any time; it is named after the machine's hostname.
  • CyberXYZ: Sign Out revokes the session on the server and forgets it locally.
  • For a shared build machine, CyberXYZ: Set API Key stores an sk_xyz_ key in the same secret storage.

Until you sign in, dependency trees are read locally and no package is checked.

03 · coverage

Supported ecosystems

EcosystemManifestsLockfiles read for the exact tree
npmpackage.jsonpackage-lock.json, npm-shrinkwrap.json (v1 to v3, workspaces), yarn.lock (classic and berry), pnpm-lock.yaml (v5, v6, v9)
PyPIrequirements*.txt, pyproject.toml (PEP 621, dependency groups, Poetry), Pipfilepoetry.lock, uv.lock, Pipfile.lock, pip-compile output
Gogo.modgo.sum
NuGet*.csproj (PackageReference)packages.lock.json

Each package in each tree, direct and transitive, is checked at the version the lockfile installs. Lockfiles are parsed on your machine; only package names and versions are sent.

Limits to know about

  • Maven and Gradle are not parsed by the extension (nor Cargo, RubyGems or Composer). A single Maven package can be checked with the CLI: xyz check PACKAGE VERSION -e maven.
  • Without a lockfile, the tree comes from the CyberXYZ registry graph, which follows each package's latest release, so it is marked Approximate. CyberXYZ: Generate Lockfile gives exact versions.
  • Pipfile.lock and go.sum record versions but not who requires whom, so indirect packages are listed flat.
  • Dependencies with no version (requests alone, *, git URLs) are not checked, because every advisory would match.
  • Virtual workspaces (a repository opened in the browser) are not supported: the extension reads the local file system.
04 · using it

Where to find it

The CyberXYZ shield in the Activity Bar holds three views:

  • 01
    Dependenciesevery manifest with its package, issue and KEV counts, then its direct dependencies, then the full tree. Only Packages with Issues keeps just the paths that lead to a problem.
  • 02
    Issuesevery package version with something to act on, worst first. Known-malicious and blocked releases come first, then actively exploited (CISA KEV) advisories, then the rest by severity. Each entry shows the fix version and every path that pulls it in.
  • 03
    Fix Historyevery fix applied from this machine.

In the manifest itself you get diagnostics on the dependency line, a hover card, CodeLens and quick fixes. Hovering an import in JavaScript, TypeScript, Python or Go shows the same package card, from the last scan and with no network call. The status bar (CyberXYZ: 3 issues (1 KEV)) opens the Issues view.

Direct and flagged packages also get the CyberXYZ proxy decision (block, quarantine, alert) and its reason in words: "Published very recently", "New dependency injected in this release". These are lookups: the platform does not record them as installs in your organization's proxy log.

05 · fixing

How fixing works

For each flagged package, CyberXYZ's per-version data gives the nearest version free of the advisories that affect the one you have, preferring one within your current major version. When that data holds no clean release, the fix is the highest fixed version across the package's advisories. A version that leaves one of the advisories open is never offered as the fix.

Fix one finding

Use the light bulb on the dependency line (Ctrl+., Cmd+.), the CodeLens above it, or Fix in either view. The quick fix says what it fixes, for example Upgrade pkg 1.2.3 → 1.2.9 (fixes 3 advisories, 1 KEV). The version is rewritten the way it was written (^1.2.3 becomes ^1.2.9, ==2.0.1 becomes ==2.3.3).

Fix All

The wrench in the Issues and Dependencies toolbars, CyberXYZ: Fix All, or right-click a manifest for just that file. It plans a fix for every finding, then shows one confirmation: every change grouped by file, the advisories it clears and the command that follows. Major-version bumps, removals, alternatives and partial fixes are unticked: nothing crosses a major version unless you tick it. The ticked changes are applied, then each manifest's lock command runs once. The confirmation and the summary group the findings: 12 fixable now / 3 partially fixable / 2 no upstream fix.

FindingFix
Direct dependencyThe version is rewritten. An in-major fix is recommended; a new major is an opt-in alternative
The manifest already allows the fixA targeted lock update: npm update x, pnpm update x, yarn up -R x, uv lock --upgrade-package x, poetry update x, pipenv update x, pip-compile --upgrade-package x, go get x@vY, dotnet add package x --version Y
Transitive, npm, yarn, pnpmAn override within the installed major; if only a new major fixes it, upgrade the parent to the lowest version that pulls in a fixed child
Transitive, pip and pip-compileThe pin rewritten, plus a minimum in requirements.in or the constraints file
Transitive, Poetry, uv, PEP 621, PipfileAn explicit dependency, [tool.uv] constraint-dependencies or a [packages] entry
Transitive, Gogo get module@vX, then go mod tidy
Transitive, NuGetA direct PackageReference, or Central Package Management pinning
Can't be rewrittenA manual step with the exact line and command
Known malicious, no clean versionRemove the dependency (unticked, confirmed twice)
No version fixes every advisory, one fixes someA PARTIAL upgrade to the version that leaves the fewest advisories, for example Upgrade pkg to 1.3.0 (clears 1 of 2), with the open ones named (unticked)
No version fixes any advisoryNothing is changed; the finding is listed under no upstream fix with its options

No fixed version upstream

From 0.5.1: when no release fixes an advisory yet, Fix on the finding, the no complete fix, see the options quick fix, and Options for N unfixed after Fix All offer what you can do instead:

  • Upgrade to X (clears N of M), marked PARTIAL, when a newer version fixes some of the advisories. Fix History records it as an upgrade, with the advisories still open in its reasons.
  • Remove the dependency (direct dependencies). The extension looks for imports of it in the JavaScript, TypeScript, Python or Go files next to the manifest and says looks unused or where it is imported. Removal always asks to confirm. For a transitive package, Show what pulls it in.
  • Ignore with a reason and expiry, pre-filled with the advisory and no fix available upstream, expiring in 30 days so the finding comes back for a re-check.
  • Open the advisory (GitHub, NVD or OSV) and the package's page on packages.cyberxyz.io.

A finding flagged only by a proxy signal (a new maintainer, a version jump, no advisory) has nothing to upgrade to; it is counted separately. There is no "replace with" option: CyberXYZ has no data on maintained alternatives, so it does not suggest one.

Lockfile regeneration

The extension edits manifests, never lockfiles. After a fix it runs the lock command (npm install, uv lock, poetry lock, go mod tidy, dotnet restore, ...) as a visible task in the manifest's folder and records its exit code. When the lockfile changes, the tree is read again and re-checked. A manifest without a lockfile gets Generate lockfiles, then plan first.

One-click tool install

If the tool a command needs is missing, the extension uses a fallback when there is one (uv pip compile, corepack yarn, python3 -m pip). Otherwise it offers one Install button with the best installer on the machine: uv tool install, pipx, Homebrew, winget, scoop, apt, corepack enable or npm install -g. The install runs as a visible task, is recorded in Fix History, and the fix continues when it finishes. Nothing is installed without your click.

ToolInstaller, in order of preference
poetrypipx install, uv tool install, brew install, python3 -m pip install --user
pipenv, uv, pip-toolsuv tool install, pipx install, brew install (macOS), winget or scoop (Windows), python3 -m pip install --user
yarn, pnpmcorepack enable, npm install -g
go, dotnet, nodeHomebrew (macOS), winget or scoop (Windows), apt (Linux); otherwise the download page
06 · fixing

Fix history

Every fix (single, quick fix, Fix All, tool install) is recorded with the time, workspace, file, package, versions, the advisories it cleared and the lock command's result. The history stays on this machine (the last 1,000, not synced). Export Fix History (JSON) saves it to a file. With xyz-scanner.reportFixes on, fixes are also reported to your organization in the background.

07 · your organization

Fix requests from your organization

An organization admin can click Request fix on an open finding in the dashboard. While you are signed in, the extension checks for requests when it starts and every 15 minutes, and shows a notification with Review & apply and Decline.

The developer always confirms. A request names only a package and two versions. Review & apply plans the change locally, from your own manifest and lockfile, and opens the Fix All confirmation with it ticked. No command, script or edit from the server is ever run. If the local plan disagrees (a major-version jump, the package is no longer in the workspace, no fixed version is known), you see why and the request is declined with that reason. Turn requests off with xyz-scanner.acceptFixRequests.

08 · using it

Ignoring findings

Ignore… asks what to ignore (one advisory, this version, or every version), why, and an optional expiry date. It writes .cyberxyz/ignore.json at the workspace root with your git name; commit it so your team shares the decision.

json
{
  "version": 1,
  "ignores": [
    { "package": "lodash", "ecosystem": "npm", "version": "4.17.20",
      "advisory": "CVE-2021-23337", "reason": "not reachable: we never call template()",
      "expires": "2026-12-31" }
  ]
}

Ignoring a blocked or known-malicious package needs a second confirmation. A malicious package should be removed, not ignored.

09 · your organization

Your organization's fleet

Right-click a package in either view:

  • 01
    Machines in My Org That Installed Thisfrom the proxy and agent install log (last 90 days).
  • 02
    Proxy Decisions for This Packageyour organization's install log for it.
  • 03
    Blast Radiuspublic packages that depend on it, and whether their ranges admit the affected version.
  • 04
    Open in CyberXYZ Dashboardthe package page, its dependency graph, the proxy monitor or environments.
10 · your organization

What your organization sees

While you are signed in, the extension reports to your CyberXYZ organization. Each of these can be turned off in settings.

In the dashboardWhat appearsSetting
XYZ Scan page, VS Code groupA summary after each whole-workspace scan: workspace name, ecosystems, counts, and each flagged package with its version, manifest path relative to the workspace, decision, advisories and fix version. At most once per workspace every 12 hours unless the findings changeduploadScans
Machines pageWhich machines run the extension, the extension and editor version, and the machine's open IDE findings, from a heartbeat on start and once a dayuploadScans
FixesEvery fix you apply: package, from and to version, advisories cleared, the lock command's result and the machinereportFixes
Fix requestsYour answer to a request (applied, declined with the reason, or failed)acceptFixRequests

Lookups from the extension identify themselves as editor lookups, so they are never counted as installs in your organization's proxy log.

11 · reference

Commands

From the Command Palette (Ctrl+Shift+P, Cmd+Shift+P). The last seven appear only on the views' toolbars and right-click menus, or the status bar. This table is generated from the extension's package.json.

CommandWhat it does
CyberXYZ: Get StartedOpen the getting-started walkthrough
CyberXYZ: Sign InSign in with your browser (device flow: approve a one-time code in the dashboard)
CyberXYZ: Sign OutRevoke the browser session and forget it on this machine; offers to remove a stored API key
CyberXYZ: Set API KeyStore an API key in VS Code's secret storage instead of signing in
CyberXYZ: Scan This FileCheck the manifest in the active editor (also in the Explorer and editor title menus)
CyberXYZ: Scan All Files in WorkspaceFind every manifest in the workspace and check every package in every tree
CyberXYZ: Show Dependency TreeReveal the current manifest in the Dependencies view
CyberXYZ: Clear CacheForget cached results (otherwise reused for an hour)
CyberXYZ: Only Packages with IssuesDependencies view: show only the paths that lead to an issue
CyberXYZ: Show All PackagesDependencies view: show every package again
CyberXYZ: Show Ignored FindingsShow findings ignored in .cyberxyz/ignore.json, with the reason
CyberXYZ: Hide Ignored FindingsHide ignored findings again
CyberXYZ: Fix AllPlan a fix for every fixable finding in the workspace, or in one manifest, and apply the ones you tick
CyberXYZ: Generate LockfileShow or run the command that creates the lockfile for this manifest
CyberXYZ: Machines in My Org That Installed ThisMachines in your organization that installed this package through the CyberXYZ proxy or agent
CyberXYZ: Proxy Decisions for This PackageYour organization's proxy install log for this package
CyberXYZ: Blast RadiusPublic packages that depend on this one, and whether their ranges admit the affected version
CyberXYZ: Open in CyberXYZ DashboardOpen the package, its dependency graph, the proxy monitor or environments in the dashboard
CyberXYZ: Export Fix History (JSON)Save the local fix history as JSON
CyberXYZ: Check Fix RequestsLook for fix requests from your organization now
CyberXYZ: Clear Fix HistoryDelete the local fix history (records already reported stay with your organization)
Refresh (views only)Re-check the workspace (Dependencies view toolbar)
Go to Manifest Line (views only)Jump to the line that declares a direct dependency
Show Dependency Path (views only)Show how a transitive package gets into the tree
Fix (views only)Fix one finding: the recommended upgrade, override or parent upgrade, with the alternatives
Ignore… (views only)Ignore an advisory, a version or a package, with a reason and an expiry date
Remove Ignore (views only)Remove an ignore entry (Issues view, with ignored findings shown)
Open Issues (status bar)Open the Issues view
12 · reference

Settings

Open Settings and search for CyberXYZ. apiUrl and dashboardUrl are machine settings: a workspace cannot override them, so a cloned repository cannot redirect your credential.

SettingDefaultWhat it does
xyz-scanner.apiUrl"https://api.cyberxyz.io"CyberXYZ API URL. Change it only for a self-hosted or dedicated CyberXYZ API. Machine setting: a workspace cannot override it, so a cloned repository cannot redirect your credentials.
xyz-scanner.dashboardUrl(empty)CyberXYZ dashboard URL for deep links. Empty: derived from the API URL (api.cyberxyz.io becomes app.cyberxyz.io). Machine setting.
xyz-scanner.scanWorkspaceOnStartuptrueScan every manifest in the workspace when VS Code opens it (package names and versions are sent to CyberXYZ). Off: only manifests you open are scanned, until you run CyberXYZ: Scan All Files in Workspace.
xyz-scanner.enableAutoScantrueScan a dependency manifest (package.json, requirements*.txt, pyproject.toml, Pipfile, go.mod, *.csproj) while you edit it.
xyz-scanner.scanOnSavetrueScan a dependency manifest when it is saved.
xyz-scanner.scanTransitiveDependenciestrueCheck every package in each dependency tree (direct and transitive) at the exact version your lockfile installs. Without a lockfile, the tree comes from CyberXYZ's registry graph (latest versions) and is marked approximate. Turn off to check direct dependencies only.
xyz-scanner.behaviourSignals"directAndFlagged"Which packages get a CyberXYZ proxy decision (block / quarantine / alert) and its behaviour signals (new dependency injected, published very recently, unusual version jump, …). Known-malicious releases are checked for every package regardless. One of directAndFlagged, all, off.
xyz-scanner.minSeverity"low"Minimum advisory severity to show. Advisories in CISA KEV (actively exploited) are always shown. One of low, medium, high, critical.
xyz-scanner.maxDependencyDepth10How many levels the Dependencies view expands (1-50). Every package in the tree is checked whatever this is; deeper levels are marked (… deeper levels hidden).
xyz-scanner.codeLenstrueShow CodeLens in manifests: a summary line, and status, upgrade, machines and blast radius above each dependency with an issue.
xyz-scanner.importHoverstrueShow the package card when hovering an import in JavaScript/TypeScript, Python and Go files (from the last scan; no network call on hover).
xyz-scanner.uploadScanstrueShare your IDE activity with your CyberXYZ organization: after a scan of the whole workspace, a summary (workspace name, ecosystems, number of manifests / lockfiles / packages checked, and each flagged package with its version, manifest path relative to the workspace, decision, advisory ids and fix version) goes to your organization's scan history, at most once per workspace every 12 hours unless the findings changed; and a daily heartbeat (extension and editor version, OS, this machine's hostname, number of workspace folders) so admins can see which version runs where. Only while signed in; never delays a scan. No source code or file contents are sent.
xyz-scanner.reportFixestrueReport fixes you apply (package, from → to version, manifest path relative to the workspace, advisories cleared, lock command result, this machine's hostname) to your CyberXYZ organization, so it sees what was fixed where. Best effort: never delays a fix. Sent only when the platform supports it; the local Fix History is kept either way.
xyz-scanner.acceptFixRequeststrueShow fix requests from your CyberXYZ organization: an admin (or you, from the dashboard) can ask this editor to upgrade a package your last workspace scan reported, e.g. lodash 4.17.20 → 4.17.21. The extension checks for them when it starts and every 15 minutes while you are signed in, and shows a notification with Review & apply and Decline. A request names only a package and two versions: the change is planned here from your own manifest and lockfile, shown in the Fix all confirmation, and applied only when you confirm. When the local plan disagrees (a major version, the package is not here) the request is declined with the reason. Your answer (applied / declined / failed, and the fix-history record of the fix) is sent back.
xyz-scanner.apiKey(empty)Deprecated. API keys are stored in VS Code's secret storage. Use "CyberXYZ: Sign In" or "CyberXYZ: Set API Key".
xyz-scanner.enableTransitiveScantrueDeprecated. Use xyz-scanner.scanTransitiveDependencies (on by default; reads the lockfile).
13 · privacy

Privacy

The extension sends CyberXYZ only what it needs to check your dependencies, and only while you are signed in. The full list of requests, with every field, is in PRIVACY.md, shipped inside the extension.

SentWhen
Package names, versions and ecosystemsEvery scan, deduplicated and cached for an hour
Workspace name, manifest paths relative to the workspace, and each flagged package with its advisories and fix versionA summary after a whole-workspace scan, at most every 12 hours unless the findings changed (uploadScans)
Extension and editor version, OS, hostname, number of workspace foldersA heartbeat on start and daily (uploadScans)
Package, versions, relative manifest path, advisories cleared, lock result, hostnameAfter you apply a fix (reportFixes)
HostnameThe fix-request check, every 15 minutes (acceptFixRequests), and browser sign-in

Never sent: source code, file contents (lockfiles are parsed locally), absolute file paths, .env files or secrets, your ignore file, your settings, or telemetry. Turn uploads off with xyz-scanner.uploadScans, xyz-scanner.reportFixes and xyz-scanner.acceptFixRequests. To stop all network calls, sign out and remove any API key.

14 · help

Troubleshooting

MessageWhat to do
Sign in to check your dependenciesRun CyberXYZ: Sign In, or CyberXYZ: Set API Key
Your CyberXYZ session expiredThe session was unused for 90 days or revoked. Sign in again
Cannot reach CyberXYZ at ...Check your connection or proxy, then Try Again. For a self-hosted API, check xyz-scanner.apiUrl in your user settings
CyberXYZ rate limit reachedWait a minute and scan again. If it keeps happening, ask your organization admin about the plan's limits
Approximate: registry graphThe manifest has no lockfile. Run CyberXYZ: Generate Lockfile
command not found: pip-compile (or poetry, uv, pnpm, yarn)Use the Install button, or install the tool and restart VS Code so it picks up the new PATH
Packages show "not checked"You are signed out, or the scan has not run: run CyberXYZ: Scan All Files in Workspace
A finding you expected is missingCheck Min Severity, Show Ignored Findings, and whether the installed version is already fixed
N no upstream fix (before 0.5.1: N findings have no fixed version)No release fixes those advisories yet. Click Options for N unfixed, or Fix on the finding, for a partial upgrade when one exists, removal, an ignore with a reason and expiry, and links to the advisory and the package page (details). Before 0.5.1, findings were also listed here when the fix was known only from the advisories' fixed versions: update the extension and run Fix All again
15 · beyond the editor

CI and the command line

The extension checks what you have open. To gate every pull request on the same verdicts, add the CyberXYZSecurity/depalert-action@v1 GitHub Action or the gitlab.com/cyberxyz/depalert GitLab CI/CD component: the CI/CD gate guide has the templates, thresholds and exit codes. For the terminal, the xyz CLI gives the same verdicts, routes installs on the machine through the CyberXYZ proxy, and covers what the extension does not parse: single Maven packages with xyz check PACKAGE VERSION -e maven, installed IDE and browser extensions, and system packages.

16 · help

Support and security

VS CODE FAQ

Questions, answered.

Does the extension send my source code anywhere?

No. It sends package names and versions read from your manifests and lockfiles. Lockfiles are parsed on your machine; source code, file contents and absolute paths never leave it.

Can a fix request from the dashboard change my code without me?

No. A request names a package and two versions. The change is planned locally and applied only when you confirm it in the Fix All dialog. Nothing from the server is run.

Will Fix All upgrade to a new major version?

Only if you tick it. Major-version bumps are listed but unticked, and the planner prefers a fixed version within your current major.

Does it support Maven or Gradle?

Not yet. The extension reads npm, PyPI, Go and NuGet manifests. A single Maven package can be checked from the terminal with xyz check PACKAGE VERSION -e maven.

// the ask

Catch it in the editor,
not in production.

See the extension, the CLI and the dashboard in a 15-minute walkthrough. The extension is included in every plan, from $25 per developer per month, with a 30-day proof of value.

  • ✓ In every plan, from $25/dev/month
  • ✓ npm · PyPI · Go · NuGet
  • ✓ 30-day proof of value
✓

Thanks! We'll be in touch.

Check your inbox. We'll reach out within 24 hours.

Get a demo

We'll respond within 24 hours. No spam, ever.