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.
VS Code 1.80 or newer · npm · PyPI · Go · NuGet
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:
code --install-extension cyberxyz.cyberxyz-vulnerability-scannerVS 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.
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.
Supported ecosystems
| Ecosystem | Manifests | Lockfiles read for the exact tree |
|---|---|---|
| npm | package.json | package-lock.json, npm-shrinkwrap.json (v1 to v3, workspaces), yarn.lock (classic and berry), pnpm-lock.yaml (v5, v6, v9) |
| PyPI | requirements*.txt, pyproject.toml (PEP 621, dependency groups, Poetry), Pipfile | poetry.lock, uv.lock, Pipfile.lock, pip-compile output |
| Go | go.mod | go.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.lockandgo.sumrecord versions but not who requires whom, so indirect packages are listed flat.- Dependencies with no version (
requestsalone,*, 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.
Where to find it
The CyberXYZ shield in the Activity Bar holds three views:
- 01Dependenciesevery 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.
- 02Issuesevery 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.
- 03Fix 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.
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.
| Finding | Fix |
|---|---|
| Direct dependency | The version is rewritten. An in-major fix is recommended; a new major is an opt-in alternative |
| The manifest already allows the fix | A 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, pnpm | An 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-compile | The pin rewritten, plus a minimum in requirements.in or the constraints file |
| Transitive, Poetry, uv, PEP 621, Pipfile | An explicit dependency, [tool.uv] constraint-dependencies or a [packages] entry |
| Transitive, Go | go get module@vX, then go mod tidy |
| Transitive, NuGet | A direct PackageReference, or Central Package Management pinning |
| Can't be rewritten | A manual step with the exact line and command |
| Known malicious, no clean version | Remove the dependency (unticked, confirmed twice) |
| No version fixes every advisory, one fixes some | A 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 advisory | Nothing 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.
| Tool | Installer, in order of preference |
|---|---|
| poetry | pipx install, uv tool install, brew install, python3 -m pip install --user |
| pipenv, uv, pip-tools | uv tool install, pipx install, brew install (macOS), winget or scoop (Windows), python3 -m pip install --user |
| yarn, pnpm | corepack enable, npm install -g |
| go, dotnet, node | Homebrew (macOS), winget or scoop (Windows), apt (Linux); otherwise the download page |
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.
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.
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.
{
"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.
Your organization's fleet
Right-click a package in either view:
- 01Machines in My Org That Installed Thisfrom the proxy and agent install log (last 90 days).
- 02Proxy Decisions for This Packageyour organization's install log for it.
- 03Blast Radiuspublic packages that depend on it, and whether their ranges admit the affected version.
- 04Open in CyberXYZ Dashboardthe package page, its dependency graph, the proxy monitor or environments.
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 dashboard | What appears | Setting |
|---|---|---|
| XYZ Scan page, VS Code group | A 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 changed | uploadScans |
| Machines page | Which machines run the extension, the extension and editor version, and the machine's open IDE findings, from a heartbeat on start and once a day | uploadScans |
| Fixes | Every fix you apply: package, from and to version, advisories cleared, the lock command's result and the machine | reportFixes |
| Fix requests | Your 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.
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.
| Command | What it does |
|---|---|
CyberXYZ: Get Started | Open the getting-started walkthrough |
CyberXYZ: Sign In | Sign in with your browser (device flow: approve a one-time code in the dashboard) |
CyberXYZ: Sign Out | Revoke the browser session and forget it on this machine; offers to remove a stored API key |
CyberXYZ: Set API Key | Store an API key in VS Code's secret storage instead of signing in |
CyberXYZ: Scan This File | Check the manifest in the active editor (also in the Explorer and editor title menus) |
CyberXYZ: Scan All Files in Workspace | Find every manifest in the workspace and check every package in every tree |
CyberXYZ: Show Dependency Tree | Reveal the current manifest in the Dependencies view |
CyberXYZ: Clear Cache | Forget cached results (otherwise reused for an hour) |
CyberXYZ: Only Packages with Issues | Dependencies view: show only the paths that lead to an issue |
CyberXYZ: Show All Packages | Dependencies view: show every package again |
CyberXYZ: Show Ignored Findings | Show findings ignored in .cyberxyz/ignore.json, with the reason |
CyberXYZ: Hide Ignored Findings | Hide ignored findings again |
CyberXYZ: Fix All | Plan a fix for every fixable finding in the workspace, or in one manifest, and apply the ones you tick |
CyberXYZ: Generate Lockfile | Show or run the command that creates the lockfile for this manifest |
CyberXYZ: Machines in My Org That Installed This | Machines in your organization that installed this package through the CyberXYZ proxy or agent |
CyberXYZ: Proxy Decisions for This Package | Your organization's proxy install log for this package |
CyberXYZ: Blast Radius | Public packages that depend on this one, and whether their ranges admit the affected version |
CyberXYZ: Open in CyberXYZ Dashboard | Open 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 Requests | Look for fix requests from your organization now |
CyberXYZ: Clear Fix History | Delete 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 |
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.
| Setting | Default | What 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.scanWorkspaceOnStartup | true | Scan 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.enableAutoScan | true | Scan a dependency manifest (package.json, requirements*.txt, pyproject.toml, Pipfile, go.mod, *.csproj) while you edit it. |
xyz-scanner.scanOnSave | true | Scan a dependency manifest when it is saved. |
xyz-scanner.scanTransitiveDependencies | true | Check 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.maxDependencyDepth | 10 | How 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.codeLens | true | Show CodeLens in manifests: a summary line, and status, upgrade, machines and blast radius above each dependency with an issue. |
xyz-scanner.importHovers | true | Show 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.uploadScans | true | Share 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.reportFixes | true | Report 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.acceptFixRequests | true | Show 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.enableTransitiveScan | true | Deprecated. Use xyz-scanner.scanTransitiveDependencies (on by default; reads the lockfile). |
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.
| Sent | When |
|---|---|
| Package names, versions and ecosystems | Every scan, deduplicated and cached for an hour |
| Workspace name, manifest paths relative to the workspace, and each flagged package with its advisories and fix version | A 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 folders | A heartbeat on start and daily (uploadScans) |
| Package, versions, relative manifest path, advisories cleared, lock result, hostname | After you apply a fix (reportFixes) |
| Hostname | The 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.
Troubleshooting
| Message | What to do |
|---|---|
| Sign in to check your dependencies | Run CyberXYZ: Sign In, or CyberXYZ: Set API Key |
| Your CyberXYZ session expired | The 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 reached | Wait a minute and scan again. If it keeps happening, ask your organization admin about the plan's limits |
| Approximate: registry graph | The 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 missing | Check 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 |
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.
Support and security
- 01MarketplaceCyberXYZ Supply Chain Scanner
- 02Dashboardapp.cyberxyz.io
- 03Support and bug reportssupport@cyberxyz.io
- 04Security vulnerabilitiessecurity@cyberxyz.io (security.txt). Please report privately; we acknowledge within 72 hours.
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.
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.