Clarify workspace-core as the chat-host onramp
Make the recommended MCP profile visible from the first help and docs pass without changing 3.x behavior. Rework help, top-level docs, public-contract wording, and shipped MCP/OpenAI examples so is the recommended first profile while stays the compatibility default for full-surface hosts. Bump the package and catalog to 3.8.0, mark the roadmap milestone done, and add regression coverage for the new MCP help and docs alignment. Validation included uv lock, targeted profile/help tests, make check, make dist-check, and a real guest-backed server smoke.
This commit is contained in:
parent
7a0620fc0c
commit
407c805ce2
17 changed files with 150 additions and 50 deletions
12
CHANGELOG.md
12
CHANGELOG.md
|
|
@ -2,6 +2,18 @@
|
||||||
|
|
||||||
All notable user-visible changes to `pyro-mcp` are documented here.
|
All notable user-visible changes to `pyro-mcp` are documented here.
|
||||||
|
|
||||||
|
## 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
|
## 3.7.0
|
||||||
|
|
||||||
- Added CLI handoff shortcuts with `pyro workspace create --id-only` and
|
- Added CLI handoff shortcuts with `pyro workspace create --id-only` and
|
||||||
|
|
|
||||||
47
README.md
47
README.md
|
|
@ -23,7 +23,7 @@ It exposes the same runtime in three public forms:
|
||||||
- Stable workspace walkthrough GIF: [docs/assets/workspace-first-run.gif](docs/assets/workspace-first-run.gif)
|
- Stable workspace walkthrough GIF: [docs/assets/workspace-first-run.gif](docs/assets/workspace-first-run.gif)
|
||||||
- Terminal walkthrough GIF: [docs/assets/first-run.gif](docs/assets/first-run.gif)
|
- Terminal walkthrough GIF: [docs/assets/first-run.gif](docs/assets/first-run.gif)
|
||||||
- PyPI package: [pypi.org/project/pyro-mcp](https://pypi.org/project/pyro-mcp/)
|
- PyPI package: [pypi.org/project/pyro-mcp](https://pypi.org/project/pyro-mcp/)
|
||||||
- What's new in 3.7.0: [CHANGELOG.md#370](CHANGELOG.md#370)
|
- What's new in 3.8.0: [CHANGELOG.md#380](CHANGELOG.md#380)
|
||||||
- Host requirements: [docs/host-requirements.md](docs/host-requirements.md)
|
- Host requirements: [docs/host-requirements.md](docs/host-requirements.md)
|
||||||
- Integration targets: [docs/integrations.md](docs/integrations.md)
|
- Integration targets: [docs/integrations.md](docs/integrations.md)
|
||||||
- Public contract: [docs/public-contract.md](docs/public-contract.md)
|
- Public contract: [docs/public-contract.md](docs/public-contract.md)
|
||||||
|
|
@ -60,7 +60,7 @@ What success looks like:
|
||||||
```bash
|
```bash
|
||||||
Platform: linux-x86_64
|
Platform: linux-x86_64
|
||||||
Runtime: PASS
|
Runtime: PASS
|
||||||
Catalog version: 3.7.0
|
Catalog version: 3.8.0
|
||||||
...
|
...
|
||||||
[pull] phase=install environment=debian:12
|
[pull] phase=install environment=debian:12
|
||||||
[pull] phase=ready environment=debian:12
|
[pull] phase=ready environment=debian:12
|
||||||
|
|
@ -125,6 +125,7 @@ That stable workspace path gives you:
|
||||||
After the quickstart works:
|
After the quickstart works:
|
||||||
|
|
||||||
- prove the full one-shot lifecycle with `uvx --from pyro-mcp pyro demo`
|
- prove the full one-shot lifecycle with `uvx --from pyro-mcp pyro demo`
|
||||||
|
- start most chat hosts with `uvx --from pyro-mcp pyro mcp serve --profile workspace-core`
|
||||||
- create a persistent workspace with `uvx --from pyro-mcp pyro workspace create debian:12 --seed-path ./repo`
|
- create a persistent workspace with `uvx --from pyro-mcp pyro workspace create debian:12 --seed-path ./repo`
|
||||||
- add a human-friendly workspace name with `uvx --from pyro-mcp pyro workspace create debian:12 --name repro-fix --label issue=123`
|
- add a human-friendly workspace name with `uvx --from pyro-mcp pyro workspace create debian:12 --name repro-fix --label issue=123`
|
||||||
- rediscover or retag workspaces with `uvx --from pyro-mcp pyro workspace list` and `uvx --from pyro-mcp pyro workspace update WORKSPACE_ID --label owner=codex`
|
- rediscover or retag workspaces with `uvx --from pyro-mcp pyro workspace list` and `uvx --from pyro-mcp pyro workspace update WORKSPACE_ID --label owner=codex`
|
||||||
|
|
@ -144,6 +145,35 @@ After the quickstart works:
|
||||||
- inspect or export one stopped guest rootfs with `uvx --from pyro-mcp pyro workspace disk list WORKSPACE_ID`, `uvx --from pyro-mcp pyro workspace disk read WORKSPACE_ID note.txt`, and `uvx --from pyro-mcp pyro workspace disk export WORKSPACE_ID --output ./workspace.ext4`
|
- inspect or export one stopped guest rootfs with `uvx --from pyro-mcp pyro workspace disk list WORKSPACE_ID`, `uvx --from pyro-mcp pyro workspace disk read WORKSPACE_ID note.txt`, and `uvx --from pyro-mcp pyro workspace disk export WORKSPACE_ID --output ./workspace.ext4`
|
||||||
- move to Python or MCP via [docs/integrations.md](docs/integrations.md)
|
- move to Python or MCP via [docs/integrations.md](docs/integrations.md)
|
||||||
|
|
||||||
|
## Chat Host Quickstart
|
||||||
|
|
||||||
|
For most MCP chat hosts, start with `workspace-core`. It exposes the practical
|
||||||
|
persistent editing loop without shells, services, snapshots, secrets, network
|
||||||
|
policy, or disk tools.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uvx --from pyro-mcp pyro mcp serve --profile workspace-core
|
||||||
|
```
|
||||||
|
|
||||||
|
Minimal MCP config:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"pyro": {
|
||||||
|
"command": "uvx",
|
||||||
|
"args": ["--from", "pyro-mcp", "pyro", "mcp", "serve", "--profile", "workspace-core"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Profile progression:
|
||||||
|
|
||||||
|
- `workspace-core`: recommended first profile for normal persistent chat editing
|
||||||
|
- `vm-run`: smallest one-shot-only surface
|
||||||
|
- `workspace-full`: advanced 3.x compatibility surface when the chat truly needs shells, services, snapshots, secrets, network policy, or disk tools
|
||||||
|
|
||||||
## Supported Hosts
|
## Supported Hosts
|
||||||
|
|
||||||
Supported today:
|
Supported today:
|
||||||
|
|
@ -195,7 +225,7 @@ uvx --from pyro-mcp pyro env list
|
||||||
Expected output:
|
Expected output:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
Catalog version: 3.7.0
|
Catalog version: 3.8.0
|
||||||
debian:12 [installed|not installed] Debian 12 environment with Git preinstalled for common agent workflows.
|
debian:12 [installed|not installed] Debian 12 environment with Git preinstalled for common agent workflows.
|
||||||
debian:12-base [installed|not installed] Minimal Debian 12 environment for shell and core Unix tooling.
|
debian:12-base [installed|not installed] Minimal Debian 12 environment for shell and core Unix tooling.
|
||||||
debian:12-build [installed|not installed] Debian 12 environment with Git and common build tools preinstalled.
|
debian:12-build [installed|not installed] Debian 12 environment with Git and common build tools preinstalled.
|
||||||
|
|
@ -312,7 +342,7 @@ machine consumption, use `--id-only` for only the identifier or `--json` for the
|
||||||
workspace payload. Use `--seed-path` when
|
workspace payload. Use `--seed-path` when
|
||||||
you want the workspace to start from a host directory or a local `.tar` / `.tar.gz` / `.tgz`
|
you want the workspace to start from a host directory or a local `.tar` / `.tar.gz` / `.tgz`
|
||||||
archive instead of an empty workspace. Use `pyro workspace sync push` when you want to import
|
archive instead of an empty workspace. Use `pyro workspace sync push` when you want to import
|
||||||
later host-side changes into a started workspace. Sync is non-atomic in `3.7.0`; if it fails
|
later host-side changes into a started workspace. Sync is non-atomic in `3.8.0`; if it fails
|
||||||
partway through, prefer `pyro workspace reset` to recover from `baseline` or one named snapshot.
|
partway through, prefer `pyro workspace reset` to recover from `baseline` or one named snapshot.
|
||||||
Use `pyro workspace diff` to compare the live `/workspace` tree to its immutable create-time
|
Use `pyro workspace diff` to compare the live `/workspace` tree to its immutable create-time
|
||||||
baseline, and `pyro workspace export` to copy one changed file or directory back to the host. Use
|
baseline, and `pyro workspace export` to copy one changed file or directory back to the host. Use
|
||||||
|
|
@ -404,7 +434,8 @@ pyro doctor --json
|
||||||
It fails closed when guest boot or guest exec is unavailable.
|
It fails closed when guest boot or guest exec is unavailable.
|
||||||
Use `--allow-host-compat` only if you explicitly want host execution.
|
Use `--allow-host-compat` only if you explicitly want host execution.
|
||||||
|
|
||||||
Run the MCP server after the CLI path above works:
|
Run the MCP server after the CLI path above works. Start most chat hosts with
|
||||||
|
`workspace-core`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pyro mcp serve --profile workspace-core
|
pyro mcp serve --profile workspace-core
|
||||||
|
|
@ -412,9 +443,9 @@ pyro mcp serve --profile workspace-core
|
||||||
|
|
||||||
Profile progression for chat hosts:
|
Profile progression for chat hosts:
|
||||||
|
|
||||||
- `vm-run`: expose only `vm_run`
|
- `workspace-core`: recommended first profile for normal persistent chat editing
|
||||||
- `workspace-core`: expose the practical persistent chat loop
|
- `vm-run`: expose only `vm_run` for one-shot-only hosts
|
||||||
- `workspace-full`: expose shells, services, snapshots, secrets, network policy, and disk tools
|
- `workspace-full`: expose shells, services, snapshots, secrets, network policy, and disk tools when the chat truly needs the full stable surface
|
||||||
|
|
||||||
Run the deterministic demo:
|
Run the deterministic demo:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ Networking: tun=yes ip_forward=yes
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ uvx --from pyro-mcp pyro env list
|
$ uvx --from pyro-mcp pyro env list
|
||||||
Catalog version: 3.7.0
|
Catalog version: 3.8.0
|
||||||
debian:12 [installed|not installed] Debian 12 environment with Git preinstalled for common agent workflows.
|
debian:12 [installed|not installed] Debian 12 environment with Git preinstalled for common agent workflows.
|
||||||
debian:12-base [installed|not installed] Minimal Debian 12 environment for shell and core Unix tooling.
|
debian:12-base [installed|not installed] Minimal Debian 12 environment for shell and core Unix tooling.
|
||||||
debian:12-build [installed|not installed] Debian 12 environment with Git and common build tools preinstalled.
|
debian:12-build [installed|not installed] Debian 12 environment with Git and common build tools preinstalled.
|
||||||
|
|
@ -118,6 +118,10 @@ $ uvx --from pyro-mcp pyro workspace service start WORKSPACE_ID app --ready-http
|
||||||
$ uvx --from pyro-mcp pyro mcp serve --profile workspace-core
|
$ uvx --from pyro-mcp pyro mcp serve --profile workspace-core
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For most chat hosts, `workspace-core` is the recommended first MCP profile.
|
||||||
|
Move to `workspace-full` only when the host truly needs shells, services,
|
||||||
|
snapshots, secrets, network policy, or disk tools.
|
||||||
|
|
||||||
`pyro demo` proves the one-shot create/start/exec/delete VM lifecycle works end to end.
|
`pyro demo` proves the one-shot create/start/exec/delete VM lifecycle works end to end.
|
||||||
|
|
||||||
Once that stable workspace flow works, continue with the five recipe docs in
|
Once that stable workspace flow works, continue with the five recipe docs in
|
||||||
|
|
@ -255,7 +259,7 @@ State: started
|
||||||
Use `--seed-path` when the workspace should start from a host directory or a local
|
Use `--seed-path` when the workspace should start from a host directory or a local
|
||||||
`.tar` / `.tar.gz` / `.tgz` archive instead of an empty `/workspace`. Use
|
`.tar` / `.tar.gz` / `.tgz` archive instead of an empty `/workspace`. Use
|
||||||
`pyro workspace sync push` when you need to import later host-side changes into a started
|
`pyro workspace sync push` when you need to import later host-side changes into a started
|
||||||
workspace. Sync is non-atomic in `3.7.0`; if it fails partway through, prefer `pyro workspace reset`
|
workspace. Sync is non-atomic in `3.8.0`; if it fails partway through, prefer `pyro workspace reset`
|
||||||
to recover from `baseline` or one named snapshot. Use `pyro workspace diff` to compare the current
|
to recover from `baseline` or one named snapshot. Use `pyro workspace diff` to compare the current
|
||||||
`/workspace` tree to its immutable create-time baseline, `pyro workspace snapshot *` to create
|
`/workspace` tree to its immutable create-time baseline, `pyro workspace snapshot *` to create
|
||||||
named checkpoints, and `pyro workspace export` to copy one changed file or directory back to the
|
named checkpoints, and `pyro workspace export` to copy one changed file or directory back to the
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ uvx --from pyro-mcp pyro env list
|
||||||
Expected output:
|
Expected output:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
Catalog version: 3.7.0
|
Catalog version: 3.8.0
|
||||||
debian:12 [installed|not installed] Debian 12 environment with Git preinstalled for common agent workflows.
|
debian:12 [installed|not installed] Debian 12 environment with Git preinstalled for common agent workflows.
|
||||||
debian:12-base [installed|not installed] Minimal Debian 12 environment for shell and core Unix tooling.
|
debian:12-base [installed|not installed] Minimal Debian 12 environment for shell and core Unix tooling.
|
||||||
debian:12-build [installed|not installed] Debian 12 environment with Git and common build tools preinstalled.
|
debian:12-build [installed|not installed] Debian 12 environment with Git and common build tools preinstalled.
|
||||||
|
|
@ -233,6 +233,20 @@ After the CLI path works, you can move on to:
|
||||||
- Python SDK: `from pyro_mcp import Pyro`
|
- Python SDK: `from pyro_mcp import Pyro`
|
||||||
- Demos: `pyro demo` or `pyro demo --network`
|
- Demos: `pyro demo` or `pyro demo --network`
|
||||||
|
|
||||||
|
## Chat Host Quickstart
|
||||||
|
|
||||||
|
For most chat-host integrations, start with `workspace-core`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uvx --from pyro-mcp pyro mcp serve --profile workspace-core
|
||||||
|
```
|
||||||
|
|
||||||
|
Use profile progression like this:
|
||||||
|
|
||||||
|
- `workspace-core`: recommended first profile for normal persistent chat editing
|
||||||
|
- `vm-run`: one-shot-only integrations
|
||||||
|
- `workspace-full`: advanced 3.x compatibility surface when the host truly needs shells, services, snapshots, secrets, network policy, or disk tools
|
||||||
|
|
||||||
## Stable Workspace
|
## Stable Workspace
|
||||||
|
|
||||||
Use `pyro workspace ...` when you need repeated commands in one sandbox instead of one-shot `pyro run`.
|
Use `pyro workspace ...` when you need repeated commands in one sandbox instead of one-shot `pyro run`.
|
||||||
|
|
@ -280,7 +294,7 @@ the identifier programmatically, use `--id-only` for only the identifier or `--j
|
||||||
workspace payload. Use `--seed-path`
|
workspace payload. Use `--seed-path`
|
||||||
when the workspace should start from a host directory or a local `.tar` / `.tar.gz` / `.tgz`
|
when the workspace should start from a host directory or a local `.tar` / `.tar.gz` / `.tgz`
|
||||||
archive. Use `pyro workspace sync push` for later host-side changes to a started workspace. Sync
|
archive. Use `pyro workspace sync push` for later host-side changes to a started workspace. Sync
|
||||||
is non-atomic in `3.7.0`; if it fails partway through, prefer `pyro workspace reset` to recover
|
is non-atomic in `3.8.0`; if it fails partway through, prefer `pyro workspace reset` to recover
|
||||||
from `baseline` or one named snapshot. Use `pyro workspace diff` to compare the current workspace
|
from `baseline` or one named snapshot. Use `pyro workspace diff` to compare the current workspace
|
||||||
tree to its immutable create-time baseline, `pyro workspace snapshot *` to capture named
|
tree to its immutable create-time baseline, `pyro workspace snapshot *` to capture named
|
||||||
checkpoints, and `pyro workspace export` to copy one changed file or directory back to the host. Use
|
checkpoints, and `pyro workspace export` to copy one changed file or directory back to the host. Use
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,10 @@ CLI path in [install.md](install.md) or [first-run.md](first-run.md).
|
||||||
|
|
||||||
## Recommended Default
|
## Recommended Default
|
||||||
|
|
||||||
Use `vm_run` first for one-shot commands, then move to `workspace-core` when the
|
Start most chat hosts with `workspace-core`. Use `vm_run` only for one-shot
|
||||||
agent needs to inhabit one sandbox across multiple calls. Only promote the chat
|
integrations, and promote the chat surface to `workspace-full` only when it
|
||||||
surface to `workspace-full` when it truly needs shells, services, snapshots,
|
truly needs shells, services, snapshots, secrets, network policy, or disk
|
||||||
secrets, network policy, or disk tools.
|
tools.
|
||||||
|
|
||||||
That keeps the model-facing contract small:
|
That keeps the model-facing contract small:
|
||||||
|
|
||||||
|
|
@ -21,8 +21,8 @@ That keeps the model-facing contract small:
|
||||||
|
|
||||||
Profile progression:
|
Profile progression:
|
||||||
|
|
||||||
|
- `workspace-core`: recommended first profile for persistent chat editing
|
||||||
- `vm-run`: one-shot only
|
- `vm-run`: one-shot only
|
||||||
- `workspace-core`: persistent workspace create/list/update/status/sync/exec/logs/file ops/diff/export/reset/delete
|
|
||||||
- `workspace-full`: the full stable workspace surface, including shells, services, snapshots, secrets, network policy, and disk tools
|
- `workspace-full`: the full stable workspace surface, including shells, services, snapshots, secrets, network policy, and disk tools
|
||||||
|
|
||||||
## OpenAI Responses API
|
## OpenAI Responses API
|
||||||
|
|
@ -81,6 +81,7 @@ Best when:
|
||||||
Recommended default:
|
Recommended default:
|
||||||
|
|
||||||
- `Pyro.run_in_vm(...)`
|
- `Pyro.run_in_vm(...)`
|
||||||
|
- `Pyro.create_server(profile="workspace-core")` for most chat hosts
|
||||||
- `Pyro.create_workspace(name=..., labels=...)` + `Pyro.list_workspaces()` + `Pyro.update_workspace(...)` when repeated workspaces need human-friendly discovery metadata
|
- `Pyro.create_workspace(name=..., labels=...)` + `Pyro.list_workspaces()` + `Pyro.update_workspace(...)` when repeated workspaces need human-friendly discovery metadata
|
||||||
- `Pyro.create_workspace(seed_path=...)` + `Pyro.push_workspace_sync(...)` + `Pyro.exec_workspace(...)` when repeated workspace commands are required
|
- `Pyro.create_workspace(seed_path=...)` + `Pyro.push_workspace_sync(...)` + `Pyro.exec_workspace(...)` when repeated workspace commands are required
|
||||||
- `Pyro.list_workspace_files(...)` / `Pyro.read_workspace_file(...)` / `Pyro.write_workspace_file(...)` / `Pyro.apply_workspace_patch(...)` when the agent needs model-native file inspection and text edits inside one live workspace
|
- `Pyro.list_workspace_files(...)` / `Pyro.read_workspace_file(...)` / `Pyro.write_workspace_file(...)` / `Pyro.apply_workspace_patch(...)` when the agent needs model-native file inspection and text edits inside one live workspace
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ Behavioral guarantees:
|
||||||
- `pyro workspace create --id-only` prints only the new `workspace_id` plus a trailing newline.
|
- `pyro workspace create --id-only` prints only the new `workspace_id` plus a trailing newline.
|
||||||
- `pyro workspace create --name NAME --label KEY=VALUE` attaches human-oriented discovery metadata without changing the stable `workspace_id`.
|
- `pyro workspace create --name NAME --label KEY=VALUE` attaches human-oriented discovery metadata without changing the stable `workspace_id`.
|
||||||
- `pyro workspace create --network-policy {off,egress,egress+published-ports}` controls workspace guest networking and whether services may publish localhost ports.
|
- `pyro workspace create --network-policy {off,egress,egress+published-ports}` controls workspace guest networking and whether services may publish localhost ports.
|
||||||
- `pyro mcp serve --profile {vm-run,workspace-core,workspace-full}` narrows the model-facing MCP surface without changing runtime behavior.
|
- `pyro mcp serve --profile {vm-run,workspace-core,workspace-full}` narrows the model-facing MCP surface without changing runtime behavior; `workspace-core` is the recommended first profile for most chat hosts.
|
||||||
- `pyro workspace create --secret NAME=VALUE` and `--secret-file NAME=PATH` persist guest-only UTF-8 secrets outside `/workspace`.
|
- `pyro workspace create --secret NAME=VALUE` and `--secret-file NAME=PATH` persist guest-only UTF-8 secrets outside `/workspace`.
|
||||||
- `pyro workspace list` returns persisted workspaces sorted by most recent `last_activity_at`.
|
- `pyro workspace list` returns persisted workspaces sorted by most recent `last_activity_at`.
|
||||||
- `pyro workspace sync push WORKSPACE_ID SOURCE_PATH [--dest WORKSPACE_PATH]` imports later host-side directory or archive content into a started workspace.
|
- `pyro workspace sync push WORKSPACE_ID SOURCE_PATH [--dest WORKSPACE_PATH]` imports later host-side directory or archive content into a started workspace.
|
||||||
|
|
@ -277,7 +277,9 @@ Stable MCP profiles:
|
||||||
|
|
||||||
Behavioral defaults:
|
Behavioral defaults:
|
||||||
|
|
||||||
- `pyro mcp serve` and `create_server()` default to `workspace-full`.
|
- `pyro mcp serve` and `create_server()` default to `workspace-full` for 3.x compatibility.
|
||||||
|
- `workspace-core` is the recommended first profile for most new chat-host integrations.
|
||||||
|
- `create_server(profile="workspace-core")` and `Pyro.create_server(profile="workspace-core")` are the recommended entrypoints for most new chat-host integrations.
|
||||||
- `workspace-core` narrows `workspace_create` by omitting `network_policy` and `secrets`.
|
- `workspace-core` narrows `workspace_create` by omitting `network_policy` and `secrets`.
|
||||||
- `workspace-core` narrows `workspace_exec` by omitting `secret_env`.
|
- `workspace-core` narrows `workspace_exec` by omitting `secret_env`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ goal:
|
||||||
make the core agent-workspace use cases feel trivial from a chat-driven LLM
|
make the core agent-workspace use cases feel trivial from a chat-driven LLM
|
||||||
interface.
|
interface.
|
||||||
|
|
||||||
Current baseline is `3.7.0`:
|
Current baseline is `3.8.0`:
|
||||||
|
|
||||||
- the stable workspace contract exists across CLI, SDK, and MCP
|
- the stable workspace contract exists across CLI, SDK, and MCP
|
||||||
- one-shot `pyro run` still exists as the narrow entrypoint
|
- one-shot `pyro run` still exists as the narrow entrypoint
|
||||||
|
|
@ -35,12 +35,8 @@ More concretely, the model should not need to:
|
||||||
|
|
||||||
The remaining UX friction for a technically strong new user is now narrower:
|
The remaining UX friction for a technically strong new user is now narrower:
|
||||||
|
|
||||||
- the best chat-host profile is recommended in docs, but not yet obvious enough
|
- the recommended chat-host onramp is now explicit, but human-mode file reads
|
||||||
from the default live `mcp serve` path
|
still need final transcript polish for copy-paste and chat logs
|
||||||
- canonical CLI walkthroughs are cleaner now, but the recommended chat-host
|
|
||||||
entrypoint still needs to be more obvious from the default docs and help
|
|
||||||
- human-mode file reads are functional, but still need final transcript polish
|
|
||||||
for copy-paste and chat logs
|
|
||||||
|
|
||||||
## Locked Decisions
|
## Locked Decisions
|
||||||
|
|
||||||
|
|
@ -62,7 +58,7 @@ The remaining UX friction for a technically strong new user is now narrower:
|
||||||
4. [`3.5.0` Chat-Friendly Shell Output](llm-chat-ergonomics/3.5.0-chat-friendly-shell-output.md) - Done
|
4. [`3.5.0` Chat-Friendly Shell Output](llm-chat-ergonomics/3.5.0-chat-friendly-shell-output.md) - Done
|
||||||
5. [`3.6.0` Use-Case Recipes And Smoke Packs](llm-chat-ergonomics/3.6.0-use-case-recipes-and-smoke-packs.md) - Done
|
5. [`3.6.0` Use-Case Recipes And Smoke Packs](llm-chat-ergonomics/3.6.0-use-case-recipes-and-smoke-packs.md) - Done
|
||||||
6. [`3.7.0` Handoff Shortcuts And File Input Sources](llm-chat-ergonomics/3.7.0-handoff-shortcuts-and-file-input-sources.md) - Done
|
6. [`3.7.0` Handoff Shortcuts And File Input Sources](llm-chat-ergonomics/3.7.0-handoff-shortcuts-and-file-input-sources.md) - Done
|
||||||
7. [`3.8.0` Chat-Host Onramp And Recommended Defaults](llm-chat-ergonomics/3.8.0-chat-host-onramp-and-recommended-defaults.md) - Planned
|
7. [`3.8.0` Chat-Host Onramp And Recommended Defaults](llm-chat-ergonomics/3.8.0-chat-host-onramp-and-recommended-defaults.md) - Done
|
||||||
8. [`3.9.0` Content-Only Reads And Human Output Polish](llm-chat-ergonomics/3.9.0-content-only-reads-and-human-output-polish.md) - Planned
|
8. [`3.9.0` Content-Only Reads And Human Output Polish](llm-chat-ergonomics/3.9.0-content-only-reads-and-human-output-polish.md) - Planned
|
||||||
|
|
||||||
Completed so far:
|
Completed so far:
|
||||||
|
|
@ -83,11 +79,11 @@ Completed so far:
|
||||||
- `3.7.0` removed the remaining shell glue from canonical CLI workspace flows with `--id-only`,
|
- `3.7.0` removed the remaining shell glue from canonical CLI workspace flows with `--id-only`,
|
||||||
`--text-file`, and `--patch-file`, so the shortest handoff path no longer depends on `python -c`
|
`--text-file`, and `--patch-file`, so the shortest handoff path no longer depends on `python -c`
|
||||||
extraction or `$(cat ...)` expansion.
|
extraction or `$(cat ...)` expansion.
|
||||||
|
- `3.8.0` made `workspace-core` the obvious first MCP/chat-host profile from the first help and
|
||||||
|
docs pass while keeping `workspace-full` as the 3.x compatibility default.
|
||||||
|
|
||||||
Planned next:
|
Planned next:
|
||||||
|
|
||||||
- `3.8.0` makes the recommended chat-host entrypoint obvious from the top-level docs, help text,
|
|
||||||
and shipped MCP examples without changing the `3.x` compatibility default.
|
|
||||||
- `3.9.0` makes human-mode file reads cleaner in terminals and chat logs, with explicit
|
- `3.9.0` makes human-mode file reads cleaner in terminals and chat logs, with explicit
|
||||||
content-only reads where summaries would otherwise get in the way.
|
content-only reads where summaries would otherwise get in the way.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# `3.8.0` Chat-Host Onramp And Recommended Defaults
|
# `3.8.0` Chat-Host Onramp And Recommended Defaults
|
||||||
|
|
||||||
Status: Planned
|
Status: Done
|
||||||
|
|
||||||
## Goal
|
## Goal
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
# MCP Client Config Example
|
# MCP Client Config Example
|
||||||
|
|
||||||
|
Recommended default for most chat hosts: `workspace-core`.
|
||||||
|
|
||||||
`pyro-mcp` is intended to be exposed to LLM clients through the public `pyro` CLI.
|
`pyro-mcp` is intended to be exposed to LLM clients through the public `pyro` CLI.
|
||||||
|
|
||||||
Generic stdio MCP configuration using `uvx`:
|
Generic stdio MCP configuration using `uvx`:
|
||||||
|
|
@ -30,9 +32,9 @@ If `pyro-mcp` is already installed locally, the same server can be configured wi
|
||||||
|
|
||||||
Profile progression:
|
Profile progression:
|
||||||
|
|
||||||
|
- `workspace-core`: the recommended first persistent chat profile
|
||||||
- `vm-run`: expose only `vm_run`
|
- `vm-run`: expose only `vm_run`
|
||||||
- `workspace-core`: the default persistent chat profile
|
- `workspace-full`: advanced 3.x compatibility surface for shells, services, snapshots, secrets, network policy, and disk tools
|
||||||
- `workspace-full`: shells, services, snapshots, secrets, network policy, and disk tools
|
|
||||||
|
|
||||||
Primary profile for most agents:
|
Primary profile for most agents:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,10 @@ Requirements:
|
||||||
- `pip install openai` or `uv add openai`
|
- `pip install openai` or `uv add openai`
|
||||||
- `OPENAI_API_KEY`
|
- `OPENAI_API_KEY`
|
||||||
|
|
||||||
This example mirrors the `workspace-core` MCP profile by deriving tool schemas
|
This is the recommended persistent-chat example. It mirrors the
|
||||||
from `Pyro.create_server(profile="workspace-core")` and dispatching tool calls
|
`workspace-core` MCP profile by deriving tool schemas from
|
||||||
back through that same profiled server.
|
`Pyro.create_server(profile="workspace-core")` and dispatching tool calls back
|
||||||
|
through that same profiled server.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[project]
|
[project]
|
||||||
name = "pyro-mcp"
|
name = "pyro-mcp"
|
||||||
version = "3.7.0"
|
version = "3.8.0"
|
||||||
description = "Stable Firecracker workspaces, one-shot sandboxes, and MCP tools for coding agents."
|
description = "Stable Firecracker workspaces, one-shot sandboxes, and MCP tools for coding agents."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = { file = "LICENSE" }
|
license = { file = "LICENSE" }
|
||||||
|
|
|
||||||
|
|
@ -463,6 +463,11 @@ class Pyro:
|
||||||
)
|
)
|
||||||
|
|
||||||
def create_server(self, *, profile: McpToolProfile = "workspace-full") -> FastMCP:
|
def create_server(self, *, profile: McpToolProfile = "workspace-full") -> FastMCP:
|
||||||
|
"""Create an MCP server for one of the stable public tool profiles.
|
||||||
|
|
||||||
|
`workspace-full` remains the default for 3.x compatibility. New chat
|
||||||
|
hosts should usually start with `profile="workspace-core"`.
|
||||||
|
"""
|
||||||
normalized_profile = _validate_mcp_profile(profile)
|
normalized_profile = _validate_mcp_profile(profile)
|
||||||
enabled_tools = set(_PROFILE_TOOLS[normalized_profile])
|
enabled_tools = set(_PROFILE_TOOLS[normalized_profile])
|
||||||
server = FastMCP(name="pyro_mcp")
|
server = FastMCP(name="pyro_mcp")
|
||||||
|
|
|
||||||
|
|
@ -746,13 +746,14 @@ def _build_parser() -> argparse.ArgumentParser:
|
||||||
help="Run the MCP server.",
|
help="Run the MCP server.",
|
||||||
description=(
|
description=(
|
||||||
"Run the MCP server after you have already validated the host and "
|
"Run the MCP server after you have already validated the host and "
|
||||||
"guest execution with `pyro doctor` and `pyro run`."
|
"guest execution with `pyro doctor` and `pyro run`. Start most "
|
||||||
|
"chat hosts with `workspace-core`."
|
||||||
),
|
),
|
||||||
epilog=dedent(
|
epilog=dedent(
|
||||||
"""
|
"""
|
||||||
Examples:
|
Examples:
|
||||||
pyro mcp serve --profile vm-run
|
|
||||||
pyro mcp serve --profile workspace-core
|
pyro mcp serve --profile workspace-core
|
||||||
|
pyro mcp serve --profile vm-run
|
||||||
pyro mcp serve --profile workspace-full
|
pyro mcp serve --profile workspace-full
|
||||||
"""
|
"""
|
||||||
),
|
),
|
||||||
|
|
@ -762,18 +763,23 @@ def _build_parser() -> argparse.ArgumentParser:
|
||||||
mcp_serve_parser = mcp_subparsers.add_parser(
|
mcp_serve_parser = mcp_subparsers.add_parser(
|
||||||
"serve",
|
"serve",
|
||||||
help="Run the MCP server over stdio.",
|
help="Run the MCP server over stdio.",
|
||||||
description="Expose pyro tools over stdio for an MCP client.",
|
description=(
|
||||||
|
"Expose pyro tools over stdio for an MCP client. "
|
||||||
|
"`workspace-core` is the recommended first profile for most chat hosts."
|
||||||
|
),
|
||||||
epilog=dedent(
|
epilog=dedent(
|
||||||
"""
|
"""
|
||||||
Example:
|
Recommended first start:
|
||||||
pyro mcp serve --profile workspace-core
|
pyro mcp serve --profile workspace-core
|
||||||
|
|
||||||
Profiles:
|
Profiles:
|
||||||
vm-run: only the vm_run tool
|
workspace-core: recommended default for normal persistent chat editing
|
||||||
workspace-core: vm_run plus the practical workspace chat loop
|
vm-run: smallest one-shot-only surface
|
||||||
workspace-full: the full stable workspace surface
|
workspace-full: advanced 3.x compatibility surface for shells, services,
|
||||||
|
snapshots, secrets, network policy, and disk tools
|
||||||
|
|
||||||
Use this from an MCP client config after the CLI evaluation path works.
|
`workspace-full` remains the default in 3.x for compatibility, but most new
|
||||||
|
chat hosts should start with `workspace-core`.
|
||||||
"""
|
"""
|
||||||
),
|
),
|
||||||
formatter_class=_HelpFormatter,
|
formatter_class=_HelpFormatter,
|
||||||
|
|
@ -783,8 +789,9 @@ def _build_parser() -> argparse.ArgumentParser:
|
||||||
choices=PUBLIC_MCP_PROFILES,
|
choices=PUBLIC_MCP_PROFILES,
|
||||||
default="workspace-full",
|
default="workspace-full",
|
||||||
help=(
|
help=(
|
||||||
"Expose only one model-facing tool profile. "
|
"Expose only one model-facing tool profile. `workspace-core` is the "
|
||||||
"`workspace-full` preserves the current full MCP surface."
|
"recommended first profile for most chat hosts; `workspace-full` "
|
||||||
|
"preserves the current full MCP surface for 3.x compatibility."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,11 @@ def create_server(
|
||||||
*,
|
*,
|
||||||
profile: McpToolProfile = "workspace-full",
|
profile: McpToolProfile = "workspace-full",
|
||||||
) -> FastMCP:
|
) -> FastMCP:
|
||||||
"""Create and return a configured MCP server instance."""
|
"""Create and return a configured MCP server instance.
|
||||||
|
|
||||||
|
`workspace-full` remains the default for 3.x compatibility. New chat hosts
|
||||||
|
should usually start with `profile="workspace-core"`.
|
||||||
|
"""
|
||||||
return Pyro(manager=manager).create_server(profile=profile)
|
return Pyro(manager=manager).create_server(profile=profile)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ from typing import Any
|
||||||
from pyro_mcp.runtime import DEFAULT_PLATFORM, RuntimePaths
|
from pyro_mcp.runtime import DEFAULT_PLATFORM, RuntimePaths
|
||||||
|
|
||||||
DEFAULT_ENVIRONMENT_VERSION = "1.0.0"
|
DEFAULT_ENVIRONMENT_VERSION = "1.0.0"
|
||||||
DEFAULT_CATALOG_VERSION = "3.7.0"
|
DEFAULT_CATALOG_VERSION = "3.8.0"
|
||||||
OCI_MANIFEST_ACCEPT = ", ".join(
|
OCI_MANIFEST_ACCEPT = ", ".join(
|
||||||
(
|
(
|
||||||
"application/vnd.oci.image.index.v1+json",
|
"application/vnd.oci.image.index.v1+json",
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,8 @@ def test_cli_subcommand_help_includes_examples_and_guidance() -> None:
|
||||||
assert "workspace-core" in mcp_help
|
assert "workspace-core" in mcp_help
|
||||||
assert "workspace-full" in mcp_help
|
assert "workspace-full" in mcp_help
|
||||||
assert "vm-run" in mcp_help
|
assert "vm-run" in mcp_help
|
||||||
assert "Use this from an MCP client config after the CLI evaluation path works." in mcp_help
|
assert "recommended first profile for most chat hosts" in mcp_help
|
||||||
|
assert "default in 3.x for compatibility" in mcp_help
|
||||||
|
|
||||||
workspace_help = _subparser_choice(parser, "workspace").format_help()
|
workspace_help = _subparser_choice(parser, "workspace").format_help()
|
||||||
assert "stable workspace contract" in workspace_help
|
assert "stable workspace contract" in workspace_help
|
||||||
|
|
@ -2597,6 +2598,26 @@ def test_cli_workspace_shell_open_prints_id_only(
|
||||||
assert captured.err == ""
|
assert captured.err == ""
|
||||||
|
|
||||||
|
|
||||||
|
def test_chat_host_docs_and_examples_recommend_workspace_core() -> None:
|
||||||
|
readme = Path("README.md").read_text(encoding="utf-8")
|
||||||
|
install = Path("docs/install.md").read_text(encoding="utf-8")
|
||||||
|
integrations = Path("docs/integrations.md").read_text(encoding="utf-8")
|
||||||
|
mcp_config = Path("examples/mcp_client_config.md").read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
assert "## Chat Host Quickstart" in readme
|
||||||
|
assert "pyro mcp serve --profile workspace-core" in readme
|
||||||
|
assert "recommended first profile for normal persistent chat editing" in readme
|
||||||
|
|
||||||
|
assert "## Chat Host Quickstart" in install
|
||||||
|
assert "pyro mcp serve --profile workspace-core" in install
|
||||||
|
assert "advanced 3.x compatibility surface" in install
|
||||||
|
|
||||||
|
assert "Start most chat hosts with `workspace-core`." in integrations
|
||||||
|
assert '`Pyro.create_server(profile="workspace-core")` for most chat hosts' in integrations
|
||||||
|
|
||||||
|
assert "Recommended default for most chat hosts: `workspace-core`." in mcp_config
|
||||||
|
|
||||||
|
|
||||||
def test_cli_workspace_shell_write_signal_close_json(
|
def test_cli_workspace_shell_write_signal_close_json(
|
||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
capsys: pytest.CaptureFixture[str],
|
capsys: pytest.CaptureFixture[str],
|
||||||
|
|
|
||||||
2
uv.lock
generated
2
uv.lock
generated
|
|
@ -706,7 +706,7 @@ crypto = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyro-mcp"
|
name = "pyro-mcp"
|
||||||
version = "3.7.0"
|
version = "3.8.0"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "mcp" },
|
{ name = "mcp" },
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue