Changelog#
All notable changes to conda-workspaces will be documented here.
The format follows Keep a Changelog.
Unreleased#
Added#
User-level task definitions: tasks defined in
~/.conda/tasks.tomlare now available across all projects without repeating them in every manifest. Project tasks override user tasks on name collision.conda task listannotates 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)
0.4.0 — 2026-04-29#
Added#
conda workspace quickstartbootstraps a workspace in one step, composinginit,add,install, andshell. Run it in an empty directory to scaffold a manifest, add the specs passed on the command line (conda workspace quickstart python=3.14 numpy), install the environment, and drop into an activated shell.conda workspace quickstart --copy(alias--clone) copies an existing workspace’s manifest from a directory or file instead of runninginit.--no-shellskips the final shell step (implied by--json).New manifest-format exporter plugins for
conda workspace export:conda-toml,pixi-toml, andpyproject-toml. Registered via the sameconda_environment_exportershook asenvironment-yamlandconda-workspaces-lock-v1, so per-platform projection,--fileinference, and--outputstreaming carry over. Together withconda workspace import,conda workspacenow translates in both directions across every supported manifest dialect.The
pyproject-tomlexporter splices its content under[tool.conda]and preserves peer tables ([project],[build-system],[tool.ruff],[tool.pixi], …) when the target file already exists.conda workspace lock --output <path>writes the lockfile to an arbitrary path (e.g.conda.lock.linux-64) so matrix CI runners can each emit a per-platform fragment.conda workspace lock --merge <glob>(repeatable) stitches lockfile fragments back into a singleconda.lockwithout re-solving. Validates schema version and per-environment channel agreement, rejects overlapping(environment, platform)pairs (raisingLockfileMergeError), and produces output byte-identical to a single-runlockover the same inputs. Mutually exclusive with--environment,--platform,--skip-unsolvable, and--output.conda workspace locknow writes a singleconda.lockcovering every platform declared by each environment, not just the host platform. Solves run withcontext._subdiroverridden so conda’s virtual package plugins (__linux,__osx,__win) and solversubdirsresolution target the correct subdir.CONDA_OVERRIDE_*and[system-requirements]continue to pin constraints like__glibc,__cuda, or__osx.conda workspace lock --platform <subdir>(repeatable) restricts the lock run to a subset of declared platforms. Unknown platforms raisePlatformErrorbefore any solve runs.conda workspace lock --skip-unsolvablekeeps locking the remaining(environment, platform)pairs when one solve fails, printing a yellowSkipping ...line for each. RaisesAllTargetsUnsolvableErrorif every pair fails, so CI never writes an empty lockfile. Non-solver errors still abort regardless.--jsonis now accepted across everyconda workspaceandconda tasksubcommand. Side-effect-only commands (init,activate,run,shell) used to crash withunrecognized arguments: --jsonwhen CI wrappers passed the flag globally; they now accept it silently and rely on the exit code. See the--json contractsection inAGENTS.md.conda workspace info --jsonexposes the reachable set of platforms asknown_platforms(and aKnown Platformsrow in text output when features broaden the workspace-level set), via the newconda_workspaces.resolver.known_platforms()helper.SolveErrornames the target platform when known, so per-platform failures stand out in CI logs.Inside
conda workspace shell,add/remove/installprint a hint to re-spawn the shell when a newly installed package drops activation scripts into$PREFIX/etc/conda/activate.d/.New
demos/multi-platform.{tape,gif,mp4}recording for cross-platform locking and the--platformflag. Thedemos/lockfilerecording was refreshed to show multi-platform default output.
Changed#
conda workspace addandconda workspace removenow install into the affected environment(s) and refreshconda.lockby default, matchingpixi add/pixi remove. Use--no-install,--no-lockfile-update,--force-reinstall, or--dry-runto opt out.conda workspace installshares a single solve/install/lock pipeline withaddandremove(conda_workspaces/cli/workspace/sync.py).conda_workspaces.parsersrenamed toconda_workspaces.manifests(named after the subject, not the verb). Class names likeCondaTomlParserare unchanged; public re-exports preserved.conda_workspaces.env_specshrunk to theconda.tomlenv-spec plugin (CondaWorkspaceSpec).CondaLockSpecwas replaced byconda_workspaces.lockfile.CondaLockLoader.Plugin metadata moved to module-level
FORMAT/ALIASES/DEFAULT_FILENAMESconstants. The canonical lockfileFORMATis nowconda-workspaces-lock-v1;conda-workspaces-lockandworkspace-lockremain as aliases. Seedocs/reference/format-aliases.md.generate_lockfilenow buildsconda.models.environment.Environmentobjects and delegates YAML serialisation to the samemultiplatform_exporthook asconda export --format=conda-workspaces-lock-v1.conda workspace lockandconda exportnow produce byte-identical output.conda_workspaces.lockfileowns both the write path and theCondaEnvironmentSpecifierplugin (CondaLockLoader), and delegates YAML→Environmentconversion toconda_lockfiles.rattler_lock.v6.conda.lockis documented as a derivative of rattler-lock v6 (pixi.lock): same schema family, distinct filename and on-disk version byte.Bumped the optional
conda-spawndependency floor from>=0.0.5to>=0.1.0to pick up the new fish/csh/tcsh/xonsh shell support and the double-prompt / PowerShell-NoExit/$CONDA_ROOT/condabinfixes. The integration incli/workspace/shell.pyis unchanged (conda_spawn.main.spawnis still the entry point).conda task run <task>(and thect runalias) now falls back to the workspace’sdefaultenvironment when the task doesn’t declare adefault_environment, instead of inheriting whichever conda env happened to be active at the call site. Pass-eexplicitly to override.
Fixed#
conda workspace quickstartcrashed every invocation withAttributeError: 'Namespace' object has no attribute 'verbose'after conda renamed the namespace dest toverbosity.conda workspace quickstart --jsonno longer leaks Rich status lines from the sub-handlers (init,add,install) into stdout; the JSON payload is the only thing emitted on stdout, matching the documented--json contract.
0.3.0 — 2026-03-31#
Added#
conda workspace importcommand to convertenvironment.yml,anaconda-project.yml,conda-project.yml,pixi.toml, andpyproject.tomlmanifests toconda.tomlProgress output during import (reading, format detection, write status)
Syntax-highlighted TOML preview in
--dry-runmodeconda task addandconda task removesupport forpixi.tomlandpyproject.tomlmanifestsCodecov integration and coverage badge
CI, docs, PyPI, and conda-forge badges to README
Documentation for
CONDA_PKGS_DIRShardlink optimization in CI/DockerDiataxis-organized documentation sidebar
Changed#
Import format detection uses human-readable labels instead of class names
Importers use
packaging.Requirementfor robust pip dependency parsingSimplified importer registry to a single
find_importerfunctionUnified installation docs (conda install and pixi global install)
Fixed#
--dry-runoutput no longer strips TOML section headers in non-terminal environmentsTrailing dot suppressed in import status when output is in the current directory
0.2.0 — 2026-03-30#
Added#
conda tasksubcommand withrun,list,add,remove, andexportconda workspace runcommand for one-shot execution in environmentsTask 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 taskas primary CLI forms (cw/ctnoted 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 --jsonno longer includes ANSI escapesActivation 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 — 2026-03-05#
Changed#
Transferred repository to conda-incubator organization
Added PyPI release workflow with trusted publishing
Moved changelog to repository root
0.1.0 — 2026-03-05#
Added#
Initial implementation of conda-workspaces plugin
conda workspacesubcommand withinit,install,list,info,add,remove,clean,run, andactivatesubcommandsconda workspacestandalone CLI (also available ascw)Parser support for
pixi.toml,conda.toml, andpyproject.tomlmanifestsMulti-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