pyro-mcp/CHANGELOG.md
Thales Maciel 663241d5d2 Add daily-loop prepare and readiness checks
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`.
2026-03-13 21:17:59 -03:00

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.