Promote stable workspace product for 3.0.0

Freeze the current workspace-first surface as the stable 3.0 contract and reposition the
landing docs, CLI help, and public contract around the stable workspace path after the
one-shot proof.

Bump the package and catalog compatibility to 3.0.0, add a dedicated workspace walkthrough
tape/GIF, and mark the 3.0.0 roadmap milestone done while keeping runtime capability
unchanged in this release.

Validation: uv lock; UV_CACHE_DIR=.uv-cache make check; UV_CACHE_DIR=.uv-cache make dist-check;
UV_CACHE_DIR=.uv-cache uv build; UV_CACHE_DIR=.uv-cache uvx --from twine twine check dist/*;
built-wheel CLI smoke for pyro --help and pyro workspace --help; vhs validate plus rendered
workspace-first-run.gif outside the sandbox because vhs crashes when sandboxed.
This commit is contained in:
Thales Maciel 2026-03-12 18:59:09 -03:00
parent c82f4629b2
commit f2d20ef30a
15 changed files with 255 additions and 42 deletions

View file

@ -458,7 +458,7 @@ class _HelpFormatter(
def _build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
description=(
"Run ephemeral Firecracker microVM workflows from the CLI on supported "
"Run stable one-shot and persistent workspace workflows on supported "
"Linux x86_64 KVM hosts."
),
epilog=dedent(
@ -469,14 +469,17 @@ def _build_parser() -> argparse.ArgumentParser:
pyro env pull debian:12
pyro run debian:12 -- git --version
Need repeated commands in one workspace after that?
Continue into the stable workspace path after that:
pyro workspace create debian:12 --seed-path ./repo
pyro workspace sync push WORKSPACE_ID ./changes
pyro workspace exec WORKSPACE_ID -- cat note.txt
pyro workspace diff WORKSPACE_ID
pyro workspace export WORKSPACE_ID note.txt --output ./note.txt
pyro workspace snapshot create WORKSPACE_ID checkpoint
pyro workspace reset WORKSPACE_ID --snapshot checkpoint
pyro workspace shell open WORKSPACE_ID
pyro workspace service start WORKSPACE_ID app --ready-file .ready -- \
sh -lc 'touch .ready && while true; do sleep 60; done'
pyro workspace export WORKSPACE_ID note.txt --output ./note.txt
Use `pyro mcp serve` only after the CLI validation path works.
"""
@ -675,8 +678,8 @@ def _build_parser() -> argparse.ArgumentParser:
"workspace",
help="Manage persistent workspaces.",
description=(
"Create a persistent workspace when you need repeated commands in one "
"sandbox instead of one-shot `pyro run`."
"Use the stable workspace contract when you need one sandbox to stay alive "
"across repeated exec, shell, service, diff, export, snapshot, and reset calls."
),
epilog=dedent(
"""
@ -692,6 +695,9 @@ def _build_parser() -> argparse.ArgumentParser:
pyro workspace service start WORKSPACE_ID app --ready-file .ready -- \
sh -lc 'touch .ready && while true; do sleep 60; done'
pyro workspace logs WORKSPACE_ID
`pyro run` remains the fastest one-shot proof. `pyro workspace ...` is the
stable path when an agent needs to inhabit one sandbox over time.
"""
),
formatter_class=_HelpFormatter,
@ -704,7 +710,10 @@ def _build_parser() -> argparse.ArgumentParser:
workspace_create_parser = workspace_subparsers.add_parser(
"create",
help="Create and start a persistent workspace.",
description="Create a persistent workspace that stays alive across repeated exec calls.",
description=(
"Create and start a stable persistent workspace that stays alive across repeated "
"exec, shell, service, diff, export, snapshot, and reset calls."
),
epilog=dedent(
"""
Examples: