Skip to content

Overhaul documentation with Diataxis structure and VHS demos#120

Merged
jezdez merged 20 commits into
mainfrom
docs-overhaul
May 5, 2026
Merged

Overhaul documentation with Diataxis structure and VHS demos#120
jezdez merged 20 commits into
mainfrom
docs-overhaul

Conversation

@jezdez
Copy link
Copy Markdown
Member

@jezdez jezdez commented Apr 10, 2026

Protect base, install a plugin, reset

Summary

Documentation

  • Restructure documentation following the Diataxis framework (tutorials, how-to guides, reference, explanation), modeled after conda-workspaces and conda-global
  • Add motivation page with project history and design rationale
  • Add intersphinx cross-references to conda documentation
  • Simplify conf.py to use only essential Sphinx extensions (myst-parser, sphinx-design, sphinx-copybutton)
  • Trim unused doc dependencies from pyproject.toml (sphinx-reredirects, sphinx-sitemap, sphinxcontrib-programoutput, linkify-it-py)
  • Remove obsolete robots.txt

VHS demos

Code changes surfaced while recording demos

Several user-facing rough edges became obvious once the terminal output was being captured as a GIF. Fixed them here rather than in follow-up PRs:

  • conda_self/exceptions.pySpecsCanNotBeRemoved / SpecsAreNotPlugins now render package names as a comma-separated string (previously produced Packages '['conda']'). Singular/plural forms handled correctly.
  • conda_self/health_checks/base_protection.pyconda doctor --fix guards the non-conda-package warning behind --quiet, and the check message uses single quotes and correct indentation around the conda doctor --fix suggestion.
  • conda_self/cli/main_reset.py — split WHAT_TO_EXPECT into WHAT_TO_EXPECT_SNAPSHOT / WHAT_TO_EXPECT_ESSENTIALS and print the right one after snapshot resolution, so the preamble no longer contradicts the trailing installer-provided (with updates) snapshot success line introduced by Split --snapshot installer into installer-exact and installer-updated #122. Matching prose in docs/features.md and docs/quickstart.md updated.
  • Across messages: use single quotes instead of backticks (which render literally in a terminal), drop "SUCCESS!" from reset output to match conda's understated tone.

Documentation structure

docs/
  index.md              # Landing page with install, demo GIF, nav cards
  quickstart.md         # Quick start tutorial
  features.md           # Explanation: what conda-self provides
  motivation.md         # Explanation: why conda-self exists
  configuration.md      # Reference: settings, snapshots, constants
  changelog.md          # Changelog
  tutorials/
    index.md            # Tutorial hub
    protecting-base.md  # Tutorial: set up base protection
    managing-plugins.md # Tutorial: install/update/remove plugins
  guides/
    resetting-base.md   # How-to: restore base from snapshot
    custom-channels.md  # How-to: use custom channels
  reference/
    cli.md              # Reference: all subcommands and flags
demos/
  _settings.tape        # Shared VHS settings
  _setup.sh             # Fresh Miniforge setup for demo recordings
  quickstart.tape       # Check, install, reset lifecycle
  install-plugin.tape   # Install conda-index plugin
  base-protection.tape  # Doctor check and fix
  update.tape           # Update conda and all plugins
  remove.tape           # Remove protection for essential packages (with --force follow-up)
  reset.tape            # Reset base to installer snapshot

Test plan

@jezdez jezdez force-pushed the docs-overhaul branch 5 times, most recently from 469d016 to 2159d76 Compare April 13, 2026 13:12
@jezdez jezdez added this to the 0.2.0 milestone Apr 14, 2026
@jezdez jezdez marked this pull request as ready for review April 22, 2026 18:42
@jezdez jezdez requested a review from marcoesters April 22, 2026 21:57
jezdez added 13 commits April 23, 2026 08:07
Restructure docs following the Diataxis framework (tutorials,
how-to guides, reference, explanation) modeled after conda-workspaces
and conda-global. Add VHS terminal demos for quickstart, install,
update, remove, reset, and base-protection workflows. Simplify
conf.py and trim unused Sphinx extensions.

Demos use real operations (not dry-run) with conda-index as the
example plugin. Quickstart shows the full lifecycle: check
protection, install, update, reset.
Ground the motivation in conda-self's actual history: the evolution
from protect to migrate to doctor health checks, the naming decision
(self vs base), and the design choices informed by issues #15, #89,
and community feedback. Frame conda-self as a plugin that manages
conda installations, not just environments.
Link to conda's docs for conda doctor, conda install, conda config,
conda info, .condarc configuration, and the plugins developer guide
throughout all documentation pages.
Downgrade conda to 26.1.1 in hidden setup so the update demo shows
a real 26.1.1 -> 26.3.1 upgrade with package plan output.
Replace the pixi shell-hook approach with a dedicated _setup.sh script
that installs a fresh Miniforge + conda-self for each demo recording.
This produces cleaner output with realistic paths, avoids pixi env
leakage, and enables demos that work correctly (real plugin removal,
real base protection fix, etc.).
SpecsCanNotBeRemoved and SpecsAreNotPlugins were passing a raw Python
list into the f-string, producing output like "Packages '['conda']'".
Join the list into a comma-separated string instead.
Backticks render as literal characters in terminal output. Use single
quotes for consistency with conda's own messaging style.
Use --quiet for the base-protection --fix step to avoid dumping the
full clone package list. Re-record reset, quickstart, and remove demos
to pick up the single-quote and dashlist formatting changes.
The fresh Miniforge ships conda 26.1.1 while conda-forge has 26.3.x,
so conda self install would also update conda alongside the plugin.
Update conda in the hidden setup so the visible install step only
shows the plugin being added.
- Exception messages now handle singular/plural correctly and use
  comma-separated lists instead of dashlist for readability
- Remove "SUCCESS!" from reset messages to match conda's understated tone
- Guard non-conda package warning with --quiet flag in base-protection fix
Remove leading spaces and use single quotes instead of backticks
for the 'conda doctor --fix' suggestion message.
Picks up: exception renames (PluginRemoveError, NotAPluginError),
installer snapshot preservation (no mamba/pip removal), removed
SUCCESS! from reset, fixed indentation in base-protection message,
single quotes in user-facing messages.
- Drop update step from quickstart (dedicated demo covers it)
- Use raw conda install for older conda-index in update demo
  to avoid version pinning in history
- Re-record both demos
jezdez added 3 commits April 23, 2026 08:27
- reset, quickstart: now show `installer-provided (with updates)` snapshot message
- base-protection: uses the new installer-updated strategy in the fix step; tighten comment to drop "to essentials" (installer-provided packages are preserved)
- remove: add a `--force --dry-run` follow-up to showcase the override, and reword the comment since permanent packages are now protected rather than unremovable
The WHAT_TO_EXPECT preamble on `conda self reset` claimed the command would
reset base to only conda, its plugins, and their dependencies -- but since
the installer-updated snapshot became the default (#122), the reset also
preserves installer-provided packages. The demos surfaced the contradiction
between this preamble and the trailing "installer-provided (with updates)
snapshot" success line.

- Split WHAT_TO_EXPECT into snapshot/essentials variants and print the
  right one after snapshot resolution
- Update the matching prose in docs/features.md and docs/quickstart.md
- Reword the reset/quickstart tape comments to "installer-provided snapshot"
- Re-record reset, quickstart, and base-protection demos
@jezdez jezdez requested a review from travishathaway April 23, 2026 11:04
Comment thread docs/tutorials/managing-plugins.md Outdated
conda-self is not bundled with conda. Replace the "included by
default" prerequisite lines with an explicit install instruction.
@jezdez jezdez requested a review from marcoesters May 4, 2026 21:09
Copy link
Copy Markdown
Contributor

@marcoesters marcoesters left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know much about the .tape format, so I can't judge those files. However, the GIFs look good to me, so any optimization can be done in follow-up PRs.

jezdez added 3 commits May 5, 2026 00:00
The pybind11-abi==11 variant of libmambapy 2.6.0 on win-64 fails to
load its native bindings extension, breaking all Windows conda-forge
test jobs. Pin to <2.6 until the upstream build is fixed.

See conda-forge/mamba-feedstock#384.
The install spec constraint is only used during env creation. Without
a conda-meta/pinned file, `conda self update --yes` freely upgrades
libmambapy to 2.6.0 which breaks on Windows (DLL load failure).

See conda-forge/mamba-feedstock#384.
This test creates its own environment via tmp_env (not the session
fixture), so the session-level pin has no effect. Add both the install
spec and conda-meta/pinned to prevent the solver upgrading libmambapy
to 2.6.0 during `conda self update`.

See conda-forge/mamba-feedstock#384.
@jezdez jezdez merged commit 02d4c3e into main May 5, 2026
25 checks passed
@jezdez jezdez deleted the docs-overhaul branch May 5, 2026 23:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants