Make the local chat-host loop explicit and cheap so users can warm the machine once instead of rediscovering environment and guest setup on every session. Add cache-backed daily-loop manifests plus the new `pyro prepare` flow, extend `pyro doctor --environment` with warm/cold/stale readiness reporting, and add `make smoke-daily-loop` to prove the warmed repro-fix reset path end to end. Also fix `python -m pyro_mcp.cli` to invoke `main()` so the new smoke and `dist-check` actually exercise the CLI module, and update the docs/roadmap to present `doctor -> prepare -> connect host -> reset` as the recommended daily path. Validation: `uv lock`, `UV_OFFLINE=1 UV_CACHE_DIR=.uv-cache make check`, `UV_OFFLINE=1 UV_CACHE_DIR=.uv-cache make dist-check`, and `UV_OFFLINE=1 UV_CACHE_DIR=.uv-cache make smoke-daily-loop`.
328 lines
17 KiB
Markdown
328 lines
17 KiB
Markdown
# Changelog
|
|
|
|
All notable user-visible changes to `pyro-mcp` are documented here.
|
|
|
|
## 4.5.0
|
|
|
|
- Added `pyro prepare` as the machine-level warmup path for the daily local
|
|
loop, with cached reuse when the runtime, catalog, and environment state are
|
|
already warm.
|
|
- Extended `pyro doctor` with daily-loop readiness output so users can see
|
|
whether the machine is cold, warm, or stale for `debian:12` before they
|
|
reconnect a chat host.
|
|
- Added `make smoke-daily-loop` to prove the warmed repro/fix/reset path end
|
|
to end on a real guest-backed machine.
|
|
|
|
## 4.4.0
|
|
|
|
- Added explicit named MCP/server modes for the main workspace workflows:
|
|
`repro-fix`, `inspect`, `cold-start`, and `review-eval`.
|
|
- Kept the generic no-mode `workspace-core` path available as the escape hatch,
|
|
while making named modes the first user-facing story across help text, host
|
|
helpers, and the recipe docs.
|
|
- Aligned the shared use-case smoke runner with those modes so the repro/fix
|
|
and cold-start flows now prove a mode-backed happy path instead of only the
|
|
generic profile path.
|
|
|
|
## 4.3.0
|
|
|
|
- Added `pyro workspace summary`, `Pyro.summarize_workspace()`, and MCP
|
|
`workspace_summary` so users and chat hosts can review a concise view of the
|
|
current workspace session since the last reset.
|
|
- Added a lightweight review-event log for edits, syncs, exports, service
|
|
lifecycle, and snapshot activity without duplicating the command journal.
|
|
- Updated the main workspace walkthroughs and review/eval recipe so
|
|
`workspace summary` is the first review surface before dropping down to raw
|
|
diffs, logs, and exported files.
|
|
|
|
## 4.2.0
|
|
|
|
- Added host bootstrap and repair helpers with `pyro host connect`,
|
|
`pyro host print-config`, `pyro host doctor`, and `pyro host repair` for the
|
|
supported Claude Code, Codex, and OpenCode flows.
|
|
- Repositioned the docs and examples so supported hosts now start from the
|
|
helper flow first, while keeping raw `pyro mcp serve` commands as the
|
|
underlying MCP entrypoint and advanced fallback.
|
|
- Added deterministic host-helper coverage so the shipped helper commands and
|
|
OpenCode config snippet stay aligned with the canonical `pyro mcp serve`
|
|
command shape.
|
|
|
|
## 4.1.0
|
|
|
|
- Added project-aware MCP startup so bare `pyro mcp serve` from a repo root can
|
|
auto-detect the current Git checkout and let `workspace_create` omit
|
|
`seed_path` safely.
|
|
- Added explicit fallback startup flags for chat hosts that do not preserve the
|
|
server working directory: `--project-path`, `--repo-url`, `--repo-ref`, and
|
|
`--no-project-source`.
|
|
- Extended workspace seed metadata with startup origin fields so chat-facing
|
|
workspace creation can show whether a workspace came from a manual seed path,
|
|
the current project, or a clean cloned repo source.
|
|
|
|
## 4.0.0
|
|
|
|
- Flipped the default MCP/server profile from `workspace-full` to
|
|
`workspace-core`, so bare `pyro mcp serve`, `create_server()`, and
|
|
`Pyro.create_server()` now match the recommended narrow chat-host path.
|
|
- Rewrote MCP-facing docs and shipped host-specific examples so the normal
|
|
setup path no longer needs an explicit `--profile workspace-core` just to
|
|
get the default behavior.
|
|
- Added migration guidance for hosts that relied on the previous implicit full
|
|
surface: they now need `--profile workspace-full` or
|
|
`create_server(profile=\"workspace-full\")`.
|
|
## 3.11.0
|
|
|
|
- Added first-class host-specific MCP onramps for Claude Code, Codex, and
|
|
OpenCode so major chat-host users can copy one exact setup example instead of
|
|
translating the generic MCP config by hand.
|
|
- Reordered the main integration docs and examples so host-specific MCP setup
|
|
appears before the generic `mcpServers` fallback, while keeping
|
|
`workspace-core` as the recommended first profile everywhere user-facing.
|
|
- Kept Claude Desktop and Cursor as generic fallback examples instead of the
|
|
primary onramp path.
|
|
|
|
## 3.10.0
|
|
|
|
- Aligned the five guest-backed workspace smoke scenarios with the recipe docs
|
|
they advertise, so the smoke pack now follows the documented canonical user
|
|
paths instead of mixing in harness-only CLI formatting checks.
|
|
- Fixed the repro-plus-fix smoke to use the structured SDK patch flow directly,
|
|
removing its dependency on brittle human `[workspace-patch] ...` output.
|
|
- Promoted `make smoke-use-cases` in the docs as the trustworthy guest-backed
|
|
verification path for the advertised workspace workflows.
|
|
|
|
## 3.9.0
|
|
|
|
- Added `--content-only` to `pyro workspace file read` and
|
|
`pyro workspace disk read` so copy-paste flows and chat transcripts can emit
|
|
only file content without the human summary footer.
|
|
- Polished default human read output so content without a trailing newline is
|
|
still separated cleanly from the summary line in merged terminal logs.
|
|
- Updated the stable walkthroughs and contract docs to use content-only reads
|
|
where plain file content is the intended output.
|
|
|
|
## 3.8.0
|
|
|
|
- Repositioned the MCP/chat-host onramp so `workspace-core` is clearly the
|
|
recommended first profile across `pyro mcp serve --help`, the README, install
|
|
docs, first-run docs, and shipped MCP config examples.
|
|
- Kept `workspace-full` as the default for `3.x` compatibility, but rewrote the
|
|
public guidance to frame it as the advanced/compatibility surface instead of
|
|
the default recommendation.
|
|
- Promoted the `workspace-core` OpenAI example and added a minimal chat-host
|
|
quickstart near the top-level product docs so new integrators no longer need
|
|
to read deep integration docs before choosing the right profile.
|
|
|
|
## 3.7.0
|
|
|
|
- Added CLI handoff shortcuts with `pyro workspace create --id-only` and
|
|
`pyro workspace shell open --id-only` so shell scripts and walkthroughs can
|
|
capture identifiers without JSON parsing glue.
|
|
- Added file-backed text inputs for `pyro workspace file write --text-file` and
|
|
`pyro workspace patch apply --patch-file`, keeping the existing `--text` and
|
|
`--patch` behavior stable while removing `$(cat ...)` shell expansion from
|
|
the canonical flows.
|
|
- Rewrote the top workspace walkthroughs, CLI help examples, and roadmap/docs
|
|
around the new shortcut flags, and updated the real guest-backed repro/fix
|
|
smoke to exercise a file-backed patch input through the CLI.
|
|
|
|
## 3.6.0
|
|
|
|
- Added `docs/use-cases/` with five concrete workspace recipes for cold-start validation,
|
|
repro-plus-fix loops, parallel workspaces, untrusted inspection, and review/eval workflows.
|
|
- Added real guest-backed smoke packs for those stories with `make smoke-use-cases` plus one
|
|
`make smoke-...` target per scenario, all backed by the shared
|
|
`scripts/workspace_use_case_smoke.py` runner.
|
|
- Updated the main docs so the stable workspace walkthrough now points directly at the recipe set
|
|
and the smoke packs as the next step after first-run validation.
|
|
|
|
## 3.5.0
|
|
|
|
- Added chat-friendly shell reads with `--plain` and `--wait-for-idle-ms` across the CLI,
|
|
Python SDK, and MCP server so PTY sessions can be fed back into a chat model without
|
|
client-side ANSI cleanup.
|
|
- Kept raw cursor-based shell reads intact for advanced clients while adding manager-side
|
|
output rendering and idle batching on top of the existing guest/backend shell transport.
|
|
- Updated the stable shell examples and docs to recommend `workspace shell read --plain
|
|
--wait-for-idle-ms 300` for model-facing interactive loops.
|
|
|
|
## 3.4.0
|
|
|
|
- Added stable MCP/server tool profiles with `vm-run`, `workspace-core`, and
|
|
`workspace-full` so chat hosts can expose only the right model-facing surface.
|
|
- Added `--profile` to `pyro mcp serve` plus matching `profile=` support on
|
|
`Pyro.create_server()` and the package-level `create_server()` factory.
|
|
- Added canonical `workspace-core` integration examples for OpenAI Responses
|
|
and MCP client configuration, and narrowed the `workspace-core` schemas so
|
|
secrets, network policy, shells, services, snapshots, and disk tools stay out
|
|
of the default persistent chat profile.
|
|
|
|
## 3.3.0
|
|
|
|
- Added first-class workspace naming and discovery across the CLI, Python SDK, and MCP server
|
|
with `pyro workspace create --name/--label`, `pyro workspace list`, `pyro workspace update`,
|
|
`Pyro.list_workspaces()`, `Pyro.update_workspace()`, and the matching `workspace_list` /
|
|
`workspace_update` MCP tools.
|
|
- Added persisted `name`, key/value `labels`, and `last_activity_at` metadata to workspace create,
|
|
status, reset, and update payloads, and surfaced compact workspace summaries from
|
|
`workspace list`.
|
|
- Tracked `last_activity_at` on real workspace mutations so humans and chat-driven agents can
|
|
resume the most recently used workspace without managing opaque IDs out of band.
|
|
|
|
## 3.2.0
|
|
|
|
- Added model-native live workspace file operations across the CLI, Python SDK, and MCP server
|
|
with `workspace file list|read|write` so agents can inspect and edit text files without shell
|
|
quoting tricks or host-side temp-file glue.
|
|
- Added `workspace patch apply` for explicit unified text diff application under `/workspace`,
|
|
with supported add/modify/delete patch forms and clear recovery guidance via `workspace reset`.
|
|
- Kept file operations scoped to started workspaces and `/workspace`, while preserving the existing
|
|
diff/export/snapshot/service/shell model around the stable workspace product.
|
|
|
|
## 3.1.0
|
|
|
|
- Added explicit workspace lifecycle stop/start operations across the CLI, Python SDK, and MCP
|
|
server so a persistent workspace can be paused and resumed without resetting `/workspace`,
|
|
snapshots, or command history.
|
|
- Added secondary stopped-workspace disk tools with raw ext4 export plus offline `disk list` and
|
|
`disk read` inspection for guest-backed workspaces.
|
|
- Scrubbed guest runtime-only paths such as `/run/pyro-secrets`, `/run/pyro-shells`, and
|
|
`/run/pyro-services` before stopped-workspace disk export and offline inspection so those tools
|
|
stay secondary to the stable workspace product without leaking runtime-only state.
|
|
|
|
## 3.0.0
|
|
|
|
- Promoted the workspace-first product surface to stable across the CLI, Python SDK, and MCP
|
|
server, with `pyro run` retained as the stable one-shot entrypoint.
|
|
- Repositioned the main docs, help text, examples, and walkthrough assets around the stable
|
|
workspace path: create, sync, exec or shell, services, snapshots/reset, diff/export, and
|
|
delete.
|
|
- Froze the `3.x` public contract around the current workspace surface without introducing new
|
|
runtime capability in this release.
|
|
|
|
## 2.10.0
|
|
|
|
- Replaced the workspace-level boolean network toggle with explicit workspace network policies:
|
|
`off`, `egress`, and `egress+published-ports`.
|
|
- Added localhost-only published TCP ports for workspace services across the CLI, Python SDK, and
|
|
MCP server, including returned host/guest port metadata on service start, list, and status.
|
|
- Kept published ports attached to services rather than `/workspace` itself, so host probing works
|
|
without changing workspace diff, export, shell, or reset semantics.
|
|
|
|
## 2.9.0
|
|
|
|
- Added explicit workspace secrets across the CLI, Python SDK, and MCP server with
|
|
`pyro workspace create --secret/--secret-file`, `Pyro.create_workspace(..., secrets=...)`, and
|
|
the matching `workspace_create` MCP inputs.
|
|
- Added per-call secret-to-environment mapping for `workspace exec`, `workspace shell open`, and
|
|
`workspace service start`, with secret values redacted from command output, shell reads, service
|
|
logs, and persisted workspace logs.
|
|
- Kept secret-backed workspaces guest-only and fail-closed while re-materializing persisted secret
|
|
files outside `/workspace` across workspace creation and reset.
|
|
|
|
## 2.8.0
|
|
|
|
- Added explicit named workspace snapshots across the CLI, Python SDK, and MCP server with
|
|
`pyro workspace snapshot *`, `Pyro.create_snapshot()` / `list_snapshots()` /
|
|
`delete_snapshot()`, and the matching `snapshot_*` MCP tools.
|
|
- Added `pyro workspace reset` and `Pyro.reset_workspace()` so a workspace can recreate its full
|
|
sandbox from the immutable baseline or one named snapshot while keeping the same identity.
|
|
- Made reset a full-sandbox recovery path that clears command history, shells, and services while
|
|
preserving the workspace spec, named snapshots, and immutable baseline.
|
|
|
|
## 2.7.0
|
|
|
|
- Added first-class workspace services across the CLI, Python SDK, and MCP server with
|
|
`pyro workspace service *`, `Pyro.start_service()` / `list_services()` / `status_service()` /
|
|
`logs_service()` / `stop_service()`, and the matching `service_*` MCP tools.
|
|
- Added typed readiness probes for workspace services with file, TCP, HTTP, and command checks so
|
|
long-running processes can be started and inspected without relying on shell-fragile flows.
|
|
- Kept service state and logs outside `/workspace`, and surfaced aggregate service counts from
|
|
`workspace status` without polluting workspace diff or export semantics.
|
|
|
|
## 2.6.0
|
|
|
|
- Added explicit host-out workspace operations across the CLI, Python SDK, and MCP server with
|
|
`pyro workspace export`, `Pyro.export_workspace()`, `pyro workspace diff`,
|
|
`Pyro.diff_workspace()`, and the matching `workspace_export` / `workspace_diff` MCP tools.
|
|
- Captured an immutable create-time baseline for every new workspace so later `workspace diff`
|
|
compares the live `/workspace` tree against that original seed state.
|
|
- Kept export and diff separate from command execution and shell state so workspaces can mutate,
|
|
be inspected, and copy results back to the host without affecting command logs or shell sessions.
|
|
|
|
## 2.5.0
|
|
|
|
- Added persistent PTY shell sessions across the CLI, Python SDK, and MCP server with
|
|
`pyro workspace shell *`, `Pyro.open_shell()` / `read_shell()` / `write_shell()` /
|
|
`signal_shell()` / `close_shell()`, and `shell_*` MCP tools.
|
|
- Kept interactive shells separate from `workspace exec`, with cursor-based merged output reads
|
|
and explicit close/signal operations for long-lived workspace sessions.
|
|
- Updated the bundled guest agent and mock backend so shell sessions persist across separate
|
|
calls and are cleaned up automatically by `workspace delete`.
|
|
|
|
## 2.4.0
|
|
|
|
- Replaced the public persistent-workspace surface from `task_*` to `workspace_*` across the CLI,
|
|
Python SDK, and MCP server in one clean cut with no compatibility aliases.
|
|
- Renamed create-time seeding from `source_path` to `seed_path` for workspace creation while keeping
|
|
later `workspace sync push` imports on `source_path`.
|
|
- Switched persisted local records from `tasks/*/task.json` to `workspaces/*/workspace.json` and
|
|
updated the main docs/examples to the workspace-first language.
|
|
|
|
## 2.3.0
|
|
|
|
- Added `task sync push` across the CLI, Python SDK, and MCP server so started task workspaces can
|
|
import later host-side directory or archive content without being recreated.
|
|
- Reused the existing safe archive import path with an explicit destination under `/workspace`,
|
|
including host-side and guest-backed task support.
|
|
- Documented sync as a non-atomic update path in `2.3.0`, with delete-and-recreate as the recovery
|
|
path if a sync fails partway through.
|
|
|
|
## 2.2.0
|
|
|
|
- Added seeded task creation across the CLI, Python SDK, and MCP server with an optional
|
|
`source_path` for host directories and `.tar` / `.tar.gz` / `.tgz` archives.
|
|
- Seeded task workspaces now persist `workspace_seed` metadata so later status calls report how
|
|
`/workspace` was initialized.
|
|
- Reused the task workspace model from `2.1.0` while adding the first explicit host-to-task
|
|
content import path for repeated command workflows.
|
|
|
|
## 2.1.0
|
|
|
|
- Added the first persistent task workspace alpha across the CLI, Python SDK, and MCP server.
|
|
- Shipped `task create`, `task exec`, `task status`, `task logs`, and `task delete` as an additive
|
|
surface alongside the existing one-shot VM contract.
|
|
- Made task workspaces persistent across separate CLI/SDK/MCP processes by storing task records on
|
|
disk under the runtime base directory.
|
|
- Added per-task command journaling so repeated workspace commands can be inspected through
|
|
`pyro task logs` or the matching SDK/MCP methods.
|
|
|
|
## 2.0.1
|
|
|
|
- Fixed the default `pyro env pull` path so empty local profile directories no longer produce
|
|
broken cached installs or contradictory "Pulled" / "not installed" states.
|
|
- Hardened cache inspection and repair so broken environment symlinks are treated as uninstalled
|
|
and repaired on the next pull.
|
|
- Added human-mode phase markers for `pyro env pull` and `pyro run` to make longer guest flows
|
|
easier to follow from the CLI.
|
|
- Corrected the Python lifecycle example and docs to match the current `exec_vm` / `vm_exec`
|
|
auto-clean semantics.
|
|
|
|
## 2.0.0
|
|
|
|
- Made guest execution fail closed by default; host compatibility execution now requires
|
|
explicit opt-in with `--allow-host-compat` or `allow_host_compat=True`.
|
|
- Switched the main CLI commands to human-readable output by default and kept `--json`
|
|
for structured output.
|
|
- Added default sizing of `1 vCPU / 1024 MiB` across the CLI, Python SDK, and MCP tools.
|
|
- Unified environment cache resolution across `pyro`, `Pyro`, and `pyro doctor`.
|
|
- Kept the stable environment-first contract centered on `vm_run`, `pyro run`, and
|
|
curated OCI-published environments.
|
|
|
|
## 1.0.0
|
|
|
|
- Shipped the first stable public `pyro` CLI, `Pyro` SDK, and MCP server contract.
|
|
- Replaced the old bundled-profile model with curated named environments.
|
|
- Switched distribution to a thin Python package plus official OCI environment artifacts.
|
|
- Published the initial official environment catalog on public Docker Hub.
|
|
- Added first-party environment pull, inspect, prune, and one-shot run flows.
|