Skip to content

Releases: conda-incubator/conda-workspaces

0.7.0

Choose a tag to compare

@github-actions github-actions released this 14 Jun 20:04
Immutable release. Only release title and notes can be modified.
7ed8f06

What's Changed

  • Run docs workflow for changelog updates by @jezdez in #82
  • Resolve target dependencies per platform during lock by @jezdez in #89
  • Support Pixi rich platform system requirements by @jezdez in #90
  • Bump codecov/codecov-action from 6.0.1 to 7.0.0 in the actions group by @dependabot[bot] in #85
  • Preserve manifest channels when merging lock fragments by @jezdez in #91
  • Add workspace archive receipts by @jezdez in #84
  • Document and fix archive receipt workflows by @jezdez in #92
  • Verify lockfile package integrity during install by @jezdez in #93
  • Restrict workspace environment names to local prefixes by @jezdez in #95
  • Validate archive output paths by @jezdez in #96
  • Validate imported conda-project environment files by @jezdez in #97
  • Reject unsafe unarchive targets by @jezdez in #98
  • Exclude sensitive files from non-git archives by @jezdez in #99
  • Require archive verification before cache priming by @jezdez in #100
  • Preserve task command argument boundaries by @jezdez in #101
  • Quote imported anaconda-project task values by @jezdez in #102
  • Compare cache digests before reusing outputs by @jezdez in #103
  • Validate lockfile merge package metadata by @jezdez in #104
  • Add WorkspaceArchive public API by @jezdez in #107
  • Support Pixi named rich platforms by @jezdez in #106
  • Prepare changelog for 0.7.0 by @jezdez in #105
  • Update release metadata by @jezdez in #108
  • Fix conda-forge README badge by @jezdez in #109
  • Refresh conda integration docs by @jezdez in #110
  • Make release workflow immutable-release compatible by @jezdez in #111

Full Changelog: 0.6.0...0.7.0

0.6.0

Choose a tag to compare

@jezdez jezdez released this 05 Jun 12:54
81c5ef7

0.6.0 — 2026-06-05

Added

  • conda workspace unarchive --install can install a selected environment to an explicit final prefix with -e/--environment and --prefix. --dest stages files below a filesystem root while preserving the requested runtime prefix inside the installed environment, and warns if installed files still reference the staging prefix. (#77, #78)
  • Added [workspace.dependencies] inheritance for conda, pixi, and pyproject manifests, matching the workspace dependency feature added in pixi 0.70.0. (#80, #79)

0.5.0

Choose a tag to compare

@jezdez jezdez released this 02 Jun 10:09
1fd37c7

0.5.0 — 2026-06-02

Added

  • User-level task definitions: tasks defined in ~/.conda/tasks.toml are now available across all projects without repeating them in every manifest. Project tasks override user tasks on name collision. conda task list annotates user-sourced tasks with (user) in text output and "source": "user" in JSON output. XDG paths are also supported ($XDG_CONFIG_HOME/conda/tasks.toml). (#53, #54)
  • conda workspace archive packages a workspace into a portable archive. Git repositories include tracked files by default, while non-git projects include workspace files filtered by built-in exclusions, [workspace.archive] settings, and --exclude. .tar.zst is the default output format; .tar.gz and .tar.bz2 are also supported. (#57, #63)
  • conda workspace archive --lock refreshes conda.lock before writing the archive, and --bundle includes package archives from the local conda package cache for offline or air-gapped installs. Bundled package archives are checked against lockfile SHA-256 hashes when hashes are available. (#57, #63, #71)
  • conda workspace unarchive restores an archived workspace, and conda workspace unarchive --install extracts the workspace and installs its environments from the bundled or local package cache in one step. (#57, #63)
  • conda workspace install now checks whether conda.lock satisfies the manifest before deciding whether to solve. In local use it prefers the lockfile when it is still valid and solves when it is not. In CI (CI=true) the default behaves like a locked install and fails fast when the lockfile is missing or unsatisfiable. (#61, #67)
  • conda workspace install --no-lock forces a solve even when the existing lockfile satisfies the manifest. (#61, #67)
  • conda workspace info now reports lockfile status (up-to-date, out-of-date, or missing) in text output and as lockfile_status in JSON output. (#61, #67)
  • conda ws is now a short alias for conda workspace, with the same subcommands, flags, arguments, and help text. (#68, #69)
  • Added tutorials and reference material for workspace archives, PyPI dependencies, multi-platform locking, and the conda.toml specification. (#51, #56, #65, #66)

Changed

  • The minimum supported conda dependency is now conda >=26.3, and the minimum conda-pypi dependency is now conda-pypi >=0.9.0. conda-workspaces also uses the current conda environment specifier and exporter plugin metadata APIs. (#65)
  • Projects that declare PyPI dependencies now receive a clearer runtime warning when conda-rattler-solver is not installed. conda-rattler-solver remains an explicit dependency in the pixi development environments. (#65)

Fixed

  • .tar.zst archive creation and extraction now work on every supported Python version. Python 3.10 through 3.13 use backports.zstd; Python 3.14+ uses the standard library zstd support. (#72)
  • Workspace archive file collection uses POSIX archive paths on Windows, so archives are portable across platforms. (#57, #63)
  • Lockfile loading now raises the project-specific platform mismatch error for missing-platform cases instead of a generic ValueError. (#65)

Security

  • Task templates now render with Jinja2's sandboxed environment, which blocks template attribute traversal attacks from malicious task definitions. Task argument names can no longer shadow the reserved conda and pixi template context keys. (#55)
  • Archive extraction validates every tar member before extraction, rejecting absolute paths, .. path traversal, symlink escapes, and special file types such as device nodes and FIFOs. On Python 3.12+ extraction also uses the standard library filter="data" defense. (#57, #63)
  • Bundled archive package cache priming verifies package SHA-256 hashes against conda.lock before copying archives into the local conda package cache. (#57, #63, #71)

0.4.0

Choose a tag to compare

@jezdez jezdez released this 29 Apr 14:24
3ad5e59

Highlights

  • One-step workspace bootstrap with conda workspace quickstart
  • Multi-platform lockfiles by default, with matrix-CI-friendly --platform, --output, and --merge flags
  • Three new manifest exporters: conda-toml, pixi-toml, pyproject-toml
  • add / remove install and refresh the lockfile by default, matching pixi add / pixi remove
  • --json is now accepted on every subcommand

Added

Quickstart

  • conda workspace quickstart [specs...] composes init, add, install, and shell into one command (#39, closes #22)
  • --copy (alias --clone) copies an existing workspace's manifest from a directory or file (#39)
  • --no-shell skips the final shell step, implied by --json (#39)

Multi-platform locking

  • conda workspace lock solves every platform declared by each environment by default, not just the host platform (#31, closes #4, #33)
  • --platform <subdir> (repeatable) restricts to a subset of declared platforms; unknown platforms raise PlatformError before any solve (#31)
  • --skip-unsolvable keeps locking remaining (environment, platform) pairs when one solve fails; aborts with AllTargetsUnsolvableError only if every pair fails (#31)
  • --output <path> writes the lockfile anywhere, e.g. conda.lock.linux-64 for per-platform CI fragments (#38, closes #34)
  • --merge <glob> (repeatable) stitches fragments back into a single conda.lock without re-solving; output is byte-identical to a single-run lock (#38)
  • SolveError names the target platform when known, so per-platform CI failures stand out (#36, closes #32)
  • conda workspace info --json exposes the reachable platform set as known_platforms (with a matching Known Platforms row in text output) (#36)

Export

  • New conda-toml, pixi-toml, and pyproject-toml exporters for conda workspace export (#44, closes #41)
  • pyproject-toml splices its content under [tool.conda] and preserves peer tables ([project], [build-system], [tool.ruff], [tool.pixi], ...) when the target file already exists (#44)

Other

  • --json is now accepted by every conda workspace and conda task subcommand; side-effect-only commands (init, activate, run, shell) no longer crash when CI wrappers pass the flag globally (#46)
  • Inside conda workspace shell, add / remove / install print a hint to re-spawn the shell when a new package drops activation scripts into \$PREFIX/etc/conda/activate.d/ (#28, closes #21)
  • New demos/multi-platform.{tape,gif,mp4} recording; demos/lockfile refreshed to show multi-platform default output (#45)

Changed

  • conda workspace add and conda workspace remove install into affected environments and refresh conda.lock by default, matching pixi add / pixi remove; opt out with --no-install, --no-lockfile-update, --force-reinstall, or --dry-run (#28, closes #21)
  • add, remove, and install share a single solve/install/lock pipeline (#28)
  • conda task run <task> (and ct run) falls back to the workspace's default environment when a task doesn't declare default_environment, instead of inheriting the active conda env (#27)
  • conda_workspaces.parsers renamed to conda_workspaces.manifests (named after the subject, not the verb); class names and public re-exports unchanged (#29, closes #4)
  • conda_workspaces.env_spec shrunk to the conda.toml env-spec plugin; CondaLockSpec replaced by conda_workspaces.lockfile.CondaLockLoader (#35)
  • Canonical lockfile FORMAT renamed to conda-workspaces-lock-v1; conda-workspaces-lock and workspace-lock remain as aliases (#37, closes #14)
  • conda workspace lock and conda export now produce byte-identical output via a shared multiplatform_export hook (#35, #38)
  • conda.lock is documented as a derivative of rattler-lock v6 (pixi.lock): same schema family, distinct filename and on-disk version byte (#29, #35)
  • conda-spawn minimum version raised from >=0.0.5 to >=0.1.0, picking up fish/csh/tcsh/xonsh support and several shell-integration fixes (#49)

Fixed

  • conda workspace quickstart crashed with AttributeError: 'Namespace' object has no attribute 'verbose' after conda renamed the argparse dest to verbosity (#46)
  • conda workspace quickstart --json no longer leaks Rich status lines into stdout; the JSON payload is the only thing emitted on stdout (#46)

Full Changelog: 0.3.0...0.4.0

0.3.0

Choose a tag to compare

@jezdez jezdez released this 31 Mar 11:35
cd661fc

Added

  • conda workspace import command to convert environment.yml, anaconda-project.yml, conda-project.yml, pixi.toml, and pyproject.toml manifests to conda.toml
  • Progress output during import (reading, format detection, write status)
  • Syntax-highlighted TOML preview in --dry-run mode
  • conda task add and conda task remove support for pixi.toml and pyproject.toml manifests
  • Codecov integration and coverage badge
  • CI, docs, PyPI, and conda-forge badges to README
  • Documentation for CONDA_PKGS_DIRS hardlink optimization in CI/Docker
  • Diataxis-organized documentation sidebar

Changed

  • Import format detection uses human-readable labels instead of class names
  • Importers use packaging.Requirement for robust pip dependency parsing
  • Simplified importer registry to a single find_importer function
  • Unified installation docs (conda install and pixi global install)

Fixed

  • --dry-run output no longer strips TOML section headers in non-terminal environments
  • Trailing dot suppressed in import status when output is in the current directory

0.2.0

Choose a tag to compare

@jezdez jezdez released this 30 Mar 12:18
2afbe49

Added

  • conda task subcommand with run, list, add, remove, and export
  • conda workspace run command for one-shot execution in environments
  • Task dependencies with topological ordering (depends-on)
  • Jinja2 template support in task commands ({{ conda.platform }}, conditionals)
  • Task output caching with input/output file declarations
  • Per-platform task overrides via [target.<platform>.tasks]
  • Task arguments with default values
  • Rich terminal output for all CLI commands (tables, status, errors)
  • Structured error rendering with actionable hints
  • Integration tests for CLI workflows
  • Demo recordings for terminal screencasts

Changed

  • Verb-based status messages (Installing, Installed, etc.) replace symbol-based markers
  • All CLI output routed through Rich console for consistent formatting
  • Documentation standardized to use conda workspace / conda task as primary CLI forms (cw / ct noted as aliases)
  • Aligned parsers with pixi workspace semantics for broader manifest compatibility
  • Exception hierarchy expanded with type annotations and actionable hints

Fixed

  • JSON output in conda task list --json no longer includes ANSI escapes
  • Activation script handling on Windows uses correct path validation
  • Solver output noise suppressed during lockfile generation
  • Stdout flushed after conda solver and transaction API calls

0.1.1

Choose a tag to compare

@jezdez jezdez released this 05 Mar 13:36
428a362

Changed

  • Transferred repository to conda-incubator organization
  • Added PyPI release workflow with trusted publishing
  • Moved changelog to repository root

0.1.0

Choose a tag to compare

@jezdez jezdez released this 05 Mar 13:31
Immutable release. Only release title and notes can be modified.
804bde6

Added

  • Initial implementation of conda-workspaces plugin
  • conda workspace subcommand with init, install, list, info,
    add, remove, clean, run, and activate subcommands
  • cw standalone CLI shortcut
  • Parser support for pixi.toml, conda.toml, and pyproject.toml
    manifests
  • Multi-environment workspace model with composable features
  • Solve-group support for version coordination across environments
  • Per-platform dependency overrides via [target.<platform>]
  • PyPI dependency parsing (requires conda-pypi for installation)
  • Project-local environments under .conda/envs/
  • Sphinx documentation with conda-sphinx-theme
  • PyPI release workflow with trusted publishing