Skip to content

Releases

v1.4.1: Setup Keeps a Working venv

Choose a tag to compare

@github-actions github-actions released this 06 Nov 13:24
v1.4.1
1505798

🐛 Fixes

PyPilot 1.4.1 fixes how pypilot setup treats an existing environment on Windows.

  • Setup keeps a venv that is already right. If .venv already runs the Python setup chooses, still has its interpreter and does not pull in the base Python's packages, setup keeps it and only syncs the packages. Before, it always rebuilt the venv.
  • A venv in use is never half-deleted. Rebuilding a venv while the editor runs its Python (a language server, a notebook kernel, an activated terminal) failed with Access is denied. (os error 5) on .venv\Scripts, but only after uv had already deleted every installed package. Now setup, doctor --fix and install check first, leave the venv untouched, and say what to close: python.exe in .venv is running, so PyPilot left the environment as it is.

🧭 Zed tasks

  • The task templates are now tasks/windows.json and tasks/macos-linux.json. They run the pypilot on your PATH, or else the copy the Zed extension downloaded, so they work on a machine where only the extension is installed. Copy the one for your OS again to get this.

The Zed extension picks up this engine the next time Zed starts. The VS Code extension and pypilot-cli still ship 1.4.0.


📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Verify a download:

sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify pypilot-linux-x64.tar.gz -R pypilot-dev/pypilot

Full Changelog: v1.4.0...v1.4.1

v1.4.0: Targeted Fixes & Known Breakages

Choose a tag to compare

@github-actions github-actions released this 04 Nov 17:28
v1.4.0
5f8ecf5

✨ What's New

PyPilot 1.4.0 fixes what is actually wrong. Before, Fix environment and doctor --fix rebuilt the environment for every problem, and could move a project to another Python on the way. Now every finding brings its own fix. A healthy project is left alone, the Python moves only when a dependency forces it, and every file PyPilot edits is named.

We tested it on 54 deliberately broken environments: corrupted venvs, Python mismatches, dependency conflicts, pixi, conda and Poetry projects, and breakages collected from Stack Overflow and GitHub issues. 45 now get the right targeted fix (13 before), none get a wrong one (9 before) and none are missed (21 before). The rest are reported with what you need to change.

📖 New guide: What doctor --fix fixes

🎯 A fix for each problem

  • Lock and environment drift: uv sync --locked for a missing or drifted package, uv lock for a stale lock, a reinstall of only the half-installed package.
  • Damaged venvs (a missing interpreter or pyvenv.cfg, system site-packages leaking in) are rebuilt on the Python they had, in place, even in venv/ or env/.
  • Python version: requires-python and .python-version are checked against the venv. An existing pin wins unless a dependency forces a change, the Python a fix picks is written to .python-version, and requires-python is raised when a dependency needs it. An impossible requires-python (>=3.16, >=3.10,<=3.9) is an error, and nothing is built.
  • Honest results: a fix with a failed step no longer says "Done", and --dry-run lists exactly what the real run does. Running the fix twice changes nothing the second time.

🧩 Conflicts resolved before anything changes

  • Unsatisfiable pins get a relaxed pin, checked with uv before it is offered. An edit that leaves the project unresolvable is rolled back.
  • Typos get "did you mean", versions that do not exist get the nearest releases, and packages with no build for this OS get an environment marker (uvloop on Windows).
  • Undeclared imports (notebooks included) are added with the right distribution: yaml becomes PyYAML and sklearn becomes scikit-learn. install and check accept import names too.

📚 Known breakages

A new data table, known_breakages.json, refreshed weekly like the others, covers breakages that package metadata does not show:

  • numpy 2 breaking old compiled packages (pandas before 2.2.2).
  • Uncapped dependencies that later removed an API: markupsafe and jinja2, werkzeug and flask, itsdangerous and flask, urllib3 and requests-toolbelt, sqlalchemy and flask-sqlalchemy, importlib-metadata and flake8, setuptools 82 and pkg_resources.
  • Shadowing packages (jwt and PyJWT, enum34, typing) and yanked pins.
  • Removed stdlib modules (distutils, imp, the 3.13 removals) and removed APIs in your own code (np.float, collections.Mapping, asyncio.coroutine, pydantic.BaseSettings, SQLAlchemy 2 engine.execute, pandas 2 DataFrame.append), reported by file and line with the replacement.
  • Releases that break on a newer Python: SQLAlchemy 2.0.0 to 2.0.30 on 3.13+, Flask before 2.3.3 on 3.14+.

🧪 pixi, conda and Poetry

  • pixi: doctor's pixi add python=X.Y is applied, and a broken prefix is repaired.
  • A conda environment.yml moves to pixi and keeps its Python.
  • Poetry projects are read (^ and ~ constraints, groups) and installed with Poetry.
  • requirements.txt no longer overwrites pyproject.toml pins, lines with an obvious mistake are fixed, and the rest are reported by line number.

🛠️ Also

  • New command: pypilot fix requirements. <mode> --help prints that mode's help.
  • New fix.kind values in the JSON output; older kinds serialize as before. See the output reference.
  • The Zed "fix environment" task now runs doctor --fix; a separate task keeps the full setup.
  • Release builds moved off the retired macOS 14 runners.

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via VS Code: PyPilot for VS Code

Via pip:

pip install --upgrade pypilot-cli

Verify a download:

sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify pypilot-linux-x64.tar.gz -R pypilot-dev/pypilot

Full Changelog: v1.3.0...v1.4.0

v1.3.0: pixi Advisory & Migration, Explain, JSON Output, Release Integrity

Choose a tag to compare

@github-actions github-actions released this 29 Oct 16:16
v1.3.0
9c3d6b2

✨ What's New

PyPilot 1.3.0 recommends pixi when pip and uv hit a wall they cannot climb, moves a project to pixi on request, explains every verdict in detail, and makes every command scriptable. Releases are now verifiable end to end.

📖 New documentation site: https://pypilot-dev.github.io/pypilot/

🧪 pixi: from supported to recommended

  • "pixi can help here": in a pip or uv project, PyPilot recognises problems conda-forge solves and pip cannot: a package with no wheel for your platform that needs native libraries (GDAL, PROJ, GEOS…), a build that failed on a missing header such as gdal.h, CUDA sources without nvcc, a repo mixing Python with R, Rust or C++. It suggests pixi; it never converts on its own.
  • pypilot migrate-to-pixi: previews a separate pixi.toml (conda-forge where available, PyPI otherwise, the Python your dependencies need), writes it with --write, installs with --install. It never touches pyproject.toml, requirements.txt or environment.yml. Also migrate-conda --to pixi, install-pixi and package_manager = "pixi"; in Zed and VS Code, "Initialize pixi project" asks before writing anything.
  • pixi doctor: every environment with its Python and drift between them, a chosen environment (pixi_environment, --pixi-env), a read-only stale-pixi.lock check, and PyPI dependencies with no wheel for a platform the manifest declares.

🔍 Explanations

  • pypilot explain [package]: the resolution table behind a verdict, requires_python against the wheels per platform and which one limits the range; for a project, what blocks each Python ("3.13 is blocked by mediapipe 0.10.14, wheels end at cp312").
  • pypilot check names the project dependency a package conflicts with and suggests a conda-forge build when it fails.

🤖 Scriptable and previewable

  • --json on every command ({ "pypilot", "command", "ok", … }), --markdown on doctor and check.
  • --dry-run on setup, install, fix python, fix cuda and the new doctor --fix: the exact commands and files, generated by the code path that runs for real.
  • pypilot logs (a local, rotating, redacted log), pypilot completions for bash, zsh, fish and PowerShell, update-data --check, pypilot version.

🧭 Editors

  • Workspace diagnostics: diagnostics_scope = "workspace" checks every Python file and notebook, not only open ones.
  • Editor settings now reach the engine; before, VS Code's pypilot.* settings had no effect on the server. Precedence: global file < editor < project file.
  • Other editors: a documented protocol with Neovim, Helix and Emacs setups (helper/src/lsp/PROTOCOL.md).

🐛 Fixes

  • Wheel resolution: a patch-level requires-python such as >=3.8.1 no longer drops the whole 3.8 line; 64-bit Windows no longer counts 32-bit win32 wheels; free-threaded cp3XXt wheels no longer count for the regular build; manylinux and musllinux wheels are kept apart. Now tested on Windows, macOS and Linux (glibc and musl, x64 and arm64).
  • Offline: PyPilot no longer calls every package it could not look up a typo. The editor stays quiet for those imports, and doctor lists them as "not checked".
  • After a migration, doctor no longer warns that conda-forge packages will compile from source.

🔐 Release integrity

  • Every release ships SHA256SUMS, build-provenance attestations (gh attestation verify) and a CycloneDX SBOM; builds use --locked, and cargo-deny runs in CI. Dependencies were updated for advisories in rustls, tokio and zip.

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via VS Code: PyPilot for VS Code

Via pip:

pip install --upgrade pypilot-cli

Verify a download:

sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify pypilot-linux-x64.tar.gz -R pypilot-dev/pypilot

Full Changelog: v1.2.2...v1.3.0

v1.2.2: Python 3.15 Support

Choose a tag to compare

@github-actions github-actions released this 14 Oct 13:18
v1.2.2
b7d31f1

✨ What's New

PyPilot 1.2.2 adds support for Python 3.15, released on October 9.

🐍 Python 3.15

PyPilot only knew Python versions up to 3.14, so on a 3.15 project every package looked unsupported. That included pure-Python packages such as six and packages that already ship cp315 wheels such as numpy, and doctor told you to rebuild the environment on 3.14:

[ERROR] Python 3.15 is not supported by this project
        numpy (supports 3.12–3.14), six (supports 3.7–3.14) do not support Python 3.15.

Python 3.15 is now recognised everywhere PyPilot reasons about versions:

  • Wheels: pure-Python (py3), stable-ABI (abi3) and cp315 wheels count as supporting 3.15
  • Interpreter discovery finds python3.15 and py -3.15
  • Recommendations: a project whose dependencies all run on 3.15 can be set up on it, while packages without 3.15 wheels (for example mediapipe==0.10.14) are still reported correctly

The same project now reports:

  supported Python: 3.12–3.15
  ✓ Everything looks good.

🛠 Maintenance

  • The data check run before every change now flags a CPython release newer than the engine knows about, so the next Python version is picked up on release day

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via VS Code: PyPilot for VS Code offers this update automatically

Via pip:

pip install --upgrade pypilot-cli

Full Changelog: v1.2.1...v1.2.2

v1.2.1: Keep the Chosen Python & Check Pinned Versions

Choose a tag to compare

@github-actions github-actions released this 14 Oct 13:10
v1.2.1
6a63880

✨ What's New

PyPilot 1.2.1 makes sure the Python version PyPilot picks for a project is the one the project actually ends up running, and lets pypilot check answer questions about a specific version of a package.

🐍 Your environment stays on the Python PyPilot chose

uv rebuilds a project's .venv on whatever .python-version, or a global uv python pin, asks for. PyPilot built .venv on the version your dependencies need, but the next uv add or uv sync could quietly move it to another one while the report still said otherwise. For example, Fix Python reported "Environment now runs Python 3.12" while .venv was still on 3.14, so a dependency such as numpy==1.26.4 was installed on a Python it does not support.

  • New projects get requires-python and .python-version set to the chosen Python
  • Setup on an existing uv project and Fix Python run uv python pin <version> before syncing, so the rebuild sticks
  • If pinning fails, the step is shown in the report and the run continues

📁 Cleaner project setup

Projects without a pyproject.toml are now initialised with uv init --bare. Only pyproject.toml (and .python-version) is written. PyPilot no longer adds a git repository, README, sample code or build system to your folder. Older uv releases without --bare keep working.

🔎 check takes a version

pypilot check and the editor's Check package report accept anything you would write in requirements.txt, and judge the release it selects instead of the newest one:

$ pypilot check mediapipe==0.10.14
  requirement       : mediapipe==0.10.14
  supported Python  : 3.9–3.12

Before, check mediapipe==0.10.14 sent the whole string to PyPI as a package name and failed.

🐛 Clearer errors

  • A misspelled package reads "x is not on PyPI; check the spelling" instead of "PyPI has no usable metadata… PyPI returned 404 Not Found…"
  • A version that does not exist reads "x has no release 1.2 on PyPI"

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via VS Code: PyPilot for VS Code offers this update automatically

From source:

cargo install --git https://github.com/pypilot-dev/pypilot --tag v1.2.1 pypilot-helper --locked

Full Changelog: v1.2.0...v1.2.1

v1.2.0: pixi Support & Pinned-Version Fixes

Choose a tag to compare

@github-actions github-actions released this 13 Oct 17:47
v1.2.0
8ac42a3

✨ What's New

PyPilot 1.2.0 adds first-class support for pixi projects and fixes two analysis bugs that could recommend the wrong Python for pinned dependencies.

🧪 pixi projects

  • Detected automatically: a pixi.toml, or [tool.pixi.workspace] in pyproject.toml, whatever package_manager is set to
  • Managed through pixi, never around it: setup runs pixi install, installs run pixi add --pypi, moving Python runs pixi add python=X.Y. PyPilot never creates a .venv, runs uv or touches pixi.lock in a pixi project, and if pixi is not installed it says so and changes nothing
  • The pixi environment is the environment: import diagnostics, installed packages (conda ones included), GPU checks and the Python version all come from .pixi/envs/default
  • Install failures explained: when a PyPI dependency has no wheel for the environment's Python, PyPilot names the package and the fix, and turns pixi's own errors into plain language, e.g. "tensorflow 2.15.0 has no wheel for Python 3.12 (cp312) on win-64; it only ships wheels for Python 3.9–3.11. Run pixi add python=3.11…"
  • Doctor speaks pixi: the recommended Python respects the manifest's python spec, conda and PyPI dependencies are listed separately, and quick fixes read "Add rich with pixi"

🐛 Fixes for every project

  • PEP 440 version matching: ==2.15.0 no longer matches 2.15.0.post1, so pinned releases are analysed against their own wheels (a pinned tensorflow==2.15.0 now correctly reports Python 3.9–3.11 instead of 3.9–3.14)
  • Releases with no files for your platform (for example Linux-only wheels on Windows) are reported as cannot be installed here instead of being treated as supporting every Python, and no longer get contradictory GPU advice

🛠 Maintenance

  • Tests run on cargo nextest; a pre-release run covered uv, pip, notebook, broken-venv, pinned-version and pixi projects end to end

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via VS Code: PyPilot for VS Code

Via pip:

pip install --upgrade pypilot-cli

Full Changelog: v1.1.2...v1.2.0

v1.1.2: Moved to the pypilot-dev Organization

Choose a tag to compare

@github-actions github-actions released this 11 Oct 09:33
v1.1.2
1dd33a5

What's New

PyPilot now lives in the pypilot-dev GitHub organization, and this release updates every download address to match. There are no changes to how PyPilot behaves.

🏠 Moved to the pypilot-dev organization

  • The Zed extension downloads the helper from pypilot-dev/pypilot, and its download permission names that path
  • Installed engines refresh the bundled GPU/CUDA data tables from the new location
  • Repository links in the manifests and the data checker point at the new home

🤝 Community files

  • Added CONTRIBUTING.md (including how the AGPL-3.0 engine and the Apache-2.0 Zed extension fit together), a Contributor Covenant 2.1 CODE_OF_CONDUCT.md, issue templates and a CHANGELOG.md

Older versions keep working: GitHub redirects the old addresses. Zed extensions older than this version can only download from the old path, so until Zed updates them they keep using the helper they already have.


📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via pip:

pip install --upgrade pypilot-cli

Full Changelog: v1.1.0...v1.1.2

v1.1.0: GPU Architecture, CUDA Extensions & Environment Health

Choose a tag to compare

@github-actions github-actions released this 10 Oct 13:18
9aef0d0

✨ What's New

PyPilot 1.1.0 is built from the most common environment problems reported on Stack Overflow, GitHub and the Hugging Face forums: GPU builds that don't match the card, CUDA packages that won't install, broken venvs and binary mismatches. All of them are caught before they turn into a crash.

🎮 GPU & CUDA

  • RTX 50-series (Blackwell) support: PyPilot now reads the GPU's compute capability, not just the driver. Blackwell cards (sm_120) need a CUDA 12.8+ build and torch 2.7+; older builds fail with "no kernel image is available". If no build fits both the driver and the card, PyPilot says exactly what to do (update the driver, or torch==X --index-url cuY)
  • Installed torch checked against the GPU: a torch build that's too old for the card, or a CPU-only torch on an NVIDIA machine (e.g. after another install swapped it), gets a warning with the exact reinstall command
  • GPU self-test after install: right after PyPilot installs torch, it checks torch.cuda.is_available() and the supported architectures, and explains any mismatch
  • uv projects keep the CUDA build: the driver-matched PyTorch index is now recorded in pyproject.toml ([[tool.uv.index]] + [tool.uv.sources], Linux/Windows only), so uv sync and uv run no longer reinstall CPU torch. pypilot fix cuda sticks in uv projects too
  • TensorFlow on native Windows: TF 2.11+ has no GPU support on native Windows. PyPilot now says so instead of implying a GPU build, and suggests WSL2 with tensorflow[and-cuda]
  • Current CUDA data: torch 2.13–2.14.1 and CUDA 13.0–13.4 driver minimums. New drivers now get the newest matching build (e.g. cu132 instead of cu126)

🧩 CUDA extension packages

  • flash-attn, xformers, bitsandbytes, mamba-ssm, causal-conv1d are checked before install: source-only packages that need nvcc and --no-build-isolation, missing Windows/macOS wheels, and xformers releases pinned to a different torch than yours. Each warning suggests an alternative such as PyTorch SDPA or WSL2
  • Import quick fixes for these packages explain the problem instead of offering an install that will fail

🩺 Environment health

  • Broken .venv detection: if the Python a venv was built on has been moved or removed, you get one clear error and a working Rebuild fix, instead of confusing "not installed" squiggles
  • NumPy 1 vs 2 mismatches: packages built for NumPy 1.x next to NumPy 2 are named before they crash with "numpy.dtype size changed". A light pip check covers other installed dependency conflicts
  • Source builds explained: PyPilot tells apart packages that definitely need a compiler from ones that may not, gives the fix for your OS (Microsoft C++ Build Tools, xcode-select --install, build-essential, rustup), skips advice for tools you already have, and names a Python version that has ready-made wheels

📓 Notebooks

  • ipykernel pinned to >=6.31.0,<7. This avoids both ipykernel 7.0.0 (cannot connect on Python 3.14) and the 7.x notebook hangs reported in VS Code. An ipykernel you installed yourself is left alone

🟦 Zed

  • Nested projects: when the opened folder has no Python project but a single subfolder does, PyPilot works on that subfolder
  • Optional pyright pin: after setup, Zed users can choose to point pyright/basedpyright at .venv. PyPilot never does this without asking and never overwrites existing config

🛠 Maintenance

  • scripts/check_data.py reports when the bundled GPU/framework tables fall behind PyPI and PyTorch, and checks that table changes stay compatible with released engines. A weekly CI job runs it
  • AGENTS.md documents the data-first workflow and commit rules for contributors and AI agents

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via VS Code: PyPilot for VS Code

Via pip:

pip install --upgrade pypilot-cli

Full Changelog: v1.0.5...v1.1.0

v1.0.5: Jupyter Notebooks & Install-All Quick Fix

Choose a tag to compare

@github-actions github-actions released this 07 Oct 06:18
1b2e5b2

✨ What's New

📓 Jupyter notebooks

  • Diagnostics and quick fixes inside .ipynb cells (VS Code). Each Python cell is analyzed like a .py file; markdown cells are skipped
  • IPython magics and shell escapes (%pip install, !ls, %%time, x = !pwd) are ignored, and cells whose body isn't Python (%%bash, %%writefile) are skipped
  • Notebook projects get a usable kernel: whenever PyPilot sets up the environment or installs a package in a project with notebooks, it ensures ipykernel>=7.0.1 is in .venv (as a dev dependency in uv projects). Older ipykernel releases fail to connect on Python 3.14
  • New warning "Notebooks can't use .venv yet" when the environment lacks ipykernel, and a folder of notebooks now counts as a Python project

📦 Install several packages at once

  • Select several unresolved imports → one quick fix installs them all (Install 3 packages: numpy, pandas, requests), listed first and preferred
  • "Install all N missing packages in this file / notebook" covers the whole document, since a notebook selection can't span cells
  • Same for creating or rebuilding the environment. Packages share one installer run; GPU-matched torch/tensorflow builds get their own so their index URL can't affect anything else

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via pip:

pip install --upgrade pypilot-cli

Full Changelog: v1.0.4...v1.0.5

v1.0.4: Windows Fixes, Offline Resilience & Command Results

Choose a tag to compare

@github-actions github-actions released this 27 Sep 12:50
979e314

✨ What's New

🪟 Windows fixes

  • No more console windows flashing while the language server runs python, uv or nvidia-smi
  • Colored CLI output works in older consoles (cmd.exe, Windows PowerShell) instead of printing raw escape codes
  • Every installed Python is found, including versions only reachable through the py launcher, so pip mode no longer reports installed versions as missing
  • requirements.txt saved as UTF-16 or with a BOM (what pip freeze > requirements.txt produces in Windows PowerShell 5) is now read correctly

📡 Offline resilience

  • When PyPI can't be reached, PyPilot uses its expired cache instead of reporting every dependency as unresolvable
  • The Zed extension starts the helper it downloaded earlier when GitHub can't be reached

🧩 Editor integration

  • Environment-changing commands (fixEverything, installPackage, recreateWithPython, installUvGlobally) now return {"ok": bool}, so the VS Code extension no longer reports success after a failed setup. Zed ignores the result, so nothing changes there.
  • showDetails accepts a package argument and adds a pypilot check section to the report
  • The onboarding scan runs in the background, and out-of-order edits can no longer leave the language server with stale buffer text
  • pypilot fix python / fix cuda now refresh the editor afterwards, as setup and install already did

🐛 Fixes

  • Inline comments no longer leak into version specifiers (numpy==1.26 # note)
  • An = inside a name @ url reference is no longer read as a version pin
  • A failed copy of the managed uv binary is reported instead of ignored

📦 Installation

Via Zed (recommended): Install the PyPilot extension from the Zed extension registry

Via pip:

pip install pypilot-cli

Full Changelog: v1.0.3...v1.0.4