diff --git a/CHANGELOG.md b/CHANGELOG.md index 02e1f4b..90edb28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ 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 - Added CLI handoff shortcuts with `pyro workspace create --id-only` and diff --git a/README.md b/README.md index d94bbb7..e22dc66 100644 --- a/README.md +++ b/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) - 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/) -- 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) - Integration targets: [docs/integrations.md](docs/integrations.md) - Public contract: [docs/public-contract.md](docs/public-contract.md) @@ -60,7 +60,7 @@ What success looks like: ```bash Platform: linux-x86_64 Runtime: PASS -Catalog version: 3.7.0 +Catalog version: 3.8.0 ... [pull] phase=install environment=debian:12 [pull] phase=ready environment=debian:12 @@ -125,6 +125,7 @@ That stable workspace path gives you: After the quickstart works: - 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` - 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` @@ -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` - 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 today: @@ -195,7 +225,7 @@ uvx --from pyro-mcp pyro env list Expected output: ```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-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. @@ -312,7 +342,7 @@ machine consumption, use `--id-only` for only the identifier or `--json` for the workspace payload. Use `--seed-path` when 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 -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. 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 @@ -404,7 +434,8 @@ pyro doctor --json It fails closed when guest boot or guest exec is unavailable. 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 pyro mcp serve --profile workspace-core @@ -412,9 +443,9 @@ pyro mcp serve --profile workspace-core Profile progression for chat hosts: -- `vm-run`: expose only `vm_run` -- `workspace-core`: expose the practical persistent chat loop -- `workspace-full`: expose shells, services, snapshots, secrets, network policy, and disk tools +- `workspace-core`: recommended first profile for normal persistent chat editing +- `vm-run`: expose only `vm_run` for one-shot-only hosts +- `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: diff --git a/docs/first-run.md b/docs/first-run.md index e7829c0..6d78265 100644 --- a/docs/first-run.md +++ b/docs/first-run.md @@ -22,7 +22,7 @@ Networking: tun=yes ip_forward=yes ```bash $ 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-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. @@ -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 ``` +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. 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 `.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 -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 `/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 diff --git a/docs/install.md b/docs/install.md index 439f56f..b853440 100644 --- a/docs/install.md +++ b/docs/install.md @@ -85,7 +85,7 @@ uvx --from pyro-mcp pyro env list Expected output: ```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-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. @@ -233,6 +233,20 @@ After the CLI path works, you can move on to: - Python SDK: `from pyro_mcp import Pyro` - 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 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` 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 -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 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 diff --git a/docs/integrations.md b/docs/integrations.md index 22da086..47c5d6c 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -7,10 +7,10 @@ CLI path in [install.md](install.md) or [first-run.md](first-run.md). ## Recommended Default -Use `vm_run` first for one-shot commands, then move to `workspace-core` when the -agent needs to inhabit one sandbox across multiple calls. Only promote the chat -surface to `workspace-full` when it truly needs shells, services, snapshots, -secrets, network policy, or disk tools. +Start most chat hosts with `workspace-core`. Use `vm_run` only for one-shot +integrations, and promote the chat surface to `workspace-full` only when it +truly needs shells, services, snapshots, secrets, network policy, or disk +tools. That keeps the model-facing contract small: @@ -21,8 +21,8 @@ That keeps the model-facing contract small: Profile progression: +- `workspace-core`: recommended first profile for persistent chat editing - `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 ## OpenAI Responses API @@ -81,6 +81,7 @@ Best when: Recommended default: - `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(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 diff --git a/docs/public-contract.md b/docs/public-contract.md index cd311c4..2d07c7b 100644 --- a/docs/public-contract.md +++ b/docs/public-contract.md @@ -83,7 +83,7 @@ Behavioral guarantees: - `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 --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 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. @@ -277,7 +277,9 @@ Stable MCP profiles: 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_exec` by omitting `secret_env`. diff --git a/docs/roadmap/llm-chat-ergonomics.md b/docs/roadmap/llm-chat-ergonomics.md index 7c76989..60dfad5 100644 --- a/docs/roadmap/llm-chat-ergonomics.md +++ b/docs/roadmap/llm-chat-ergonomics.md @@ -6,7 +6,7 @@ goal: make the core agent-workspace use cases feel trivial from a chat-driven LLM interface. -Current baseline is `3.7.0`: +Current baseline is `3.8.0`: - the stable workspace contract exists across CLI, SDK, and MCP - 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 best chat-host profile is recommended in docs, but not yet obvious enough - from the default live `mcp serve` path -- 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 +- the recommended chat-host onramp is now explicit, but human-mode file reads + still need final transcript polish for copy-paste and chat logs ## 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 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 -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 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`, `--text-file`, and `--patch-file`, so the shortest handoff path no longer depends on `python -c` 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: -- `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 content-only reads where summaries would otherwise get in the way. diff --git a/docs/roadmap/llm-chat-ergonomics/3.8.0-chat-host-onramp-and-recommended-defaults.md b/docs/roadmap/llm-chat-ergonomics/3.8.0-chat-host-onramp-and-recommended-defaults.md index 0feb93c..c4f0852 100644 --- a/docs/roadmap/llm-chat-ergonomics/3.8.0-chat-host-onramp-and-recommended-defaults.md +++ b/docs/roadmap/llm-chat-ergonomics/3.8.0-chat-host-onramp-and-recommended-defaults.md @@ -1,6 +1,6 @@ # `3.8.0` Chat-Host Onramp And Recommended Defaults -Status: Planned +Status: Done ## Goal diff --git a/examples/mcp_client_config.md b/examples/mcp_client_config.md index 74e1ce1..efd8af3 100644 --- a/examples/mcp_client_config.md +++ b/examples/mcp_client_config.md @@ -1,5 +1,7 @@ # 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. 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: +- `workspace-core`: the recommended first persistent chat profile - `vm-run`: expose only `vm_run` -- `workspace-core`: the default persistent chat profile -- `workspace-full`: shells, services, snapshots, secrets, network policy, and disk tools +- `workspace-full`: advanced 3.x compatibility surface for shells, services, snapshots, secrets, network policy, and disk tools Primary profile for most agents: diff --git a/examples/openai_responses_workspace_core.py b/examples/openai_responses_workspace_core.py index 0ef9c27..6664c18 100644 --- a/examples/openai_responses_workspace_core.py +++ b/examples/openai_responses_workspace_core.py @@ -4,9 +4,10 @@ Requirements: - `pip install openai` or `uv add openai` - `OPENAI_API_KEY` -This example mirrors the `workspace-core` MCP profile by deriving tool schemas -from `Pyro.create_server(profile="workspace-core")` and dispatching tool calls -back through that same profiled server. +This is the recommended persistent-chat example. It mirrors the +`workspace-core` MCP profile by deriving tool schemas from +`Pyro.create_server(profile="workspace-core")` and dispatching tool calls back +through that same profiled server. """ from __future__ import annotations diff --git a/pyproject.toml b/pyproject.toml index 5bf246b..9d2e4da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pyro-mcp" -version = "3.7.0" +version = "3.8.0" description = "Stable Firecracker workspaces, one-shot sandboxes, and MCP tools for coding agents." readme = "README.md" license = { file = "LICENSE" } diff --git a/src/pyro_mcp/api.py b/src/pyro_mcp/api.py index 2fadd0b..56b16eb 100644 --- a/src/pyro_mcp/api.py +++ b/src/pyro_mcp/api.py @@ -463,6 +463,11 @@ class Pyro: ) 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) enabled_tools = set(_PROFILE_TOOLS[normalized_profile]) server = FastMCP(name="pyro_mcp") diff --git a/src/pyro_mcp/cli.py b/src/pyro_mcp/cli.py index 3490088..85e6d77 100644 --- a/src/pyro_mcp/cli.py +++ b/src/pyro_mcp/cli.py @@ -746,13 +746,14 @@ def _build_parser() -> argparse.ArgumentParser: help="Run the MCP server.", description=( "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( """ Examples: - pyro mcp serve --profile vm-run pyro mcp serve --profile workspace-core + pyro mcp serve --profile vm-run pyro mcp serve --profile workspace-full """ ), @@ -762,18 +763,23 @@ def _build_parser() -> argparse.ArgumentParser: mcp_serve_parser = mcp_subparsers.add_parser( "serve", 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( """ - Example: + Recommended first start: pyro mcp serve --profile workspace-core Profiles: - vm-run: only the vm_run tool - workspace-core: vm_run plus the practical workspace chat loop - workspace-full: the full stable workspace surface + workspace-core: recommended default for normal persistent chat editing + vm-run: smallest one-shot-only 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, @@ -783,8 +789,9 @@ def _build_parser() -> argparse.ArgumentParser: choices=PUBLIC_MCP_PROFILES, default="workspace-full", help=( - "Expose only one model-facing tool profile. " - "`workspace-full` preserves the current full MCP surface." + "Expose only one model-facing tool profile. `workspace-core` is the " + "recommended first profile for most chat hosts; `workspace-full` " + "preserves the current full MCP surface for 3.x compatibility." ), ) diff --git a/src/pyro_mcp/server.py b/src/pyro_mcp/server.py index c3a26ea..3015991 100644 --- a/src/pyro_mcp/server.py +++ b/src/pyro_mcp/server.py @@ -13,7 +13,11 @@ def create_server( *, profile: McpToolProfile = "workspace-full", ) -> 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) diff --git a/src/pyro_mcp/vm_environments.py b/src/pyro_mcp/vm_environments.py index 64278de..c70c41b 100644 --- a/src/pyro_mcp/vm_environments.py +++ b/src/pyro_mcp/vm_environments.py @@ -19,7 +19,7 @@ from typing import Any from pyro_mcp.runtime import DEFAULT_PLATFORM, RuntimePaths DEFAULT_ENVIRONMENT_VERSION = "1.0.0" -DEFAULT_CATALOG_VERSION = "3.7.0" +DEFAULT_CATALOG_VERSION = "3.8.0" OCI_MANIFEST_ACCEPT = ", ".join( ( "application/vnd.oci.image.index.v1+json", diff --git a/tests/test_cli.py b/tests/test_cli.py index e14c5ca..d881166 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -67,7 +67,8 @@ def test_cli_subcommand_help_includes_examples_and_guidance() -> None: assert "workspace-core" in mcp_help assert "workspace-full" 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() assert "stable workspace contract" in workspace_help @@ -2597,6 +2598,26 @@ def test_cli_workspace_shell_open_prints_id_only( 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( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], diff --git a/uv.lock b/uv.lock index a14789a..8418840 100644 --- a/uv.lock +++ b/uv.lock @@ -706,7 +706,7 @@ crypto = [ [[package]] name = "pyro-mcp" -version = "3.7.0" +version = "3.8.0" source = { editable = "." } dependencies = [ { name = "mcp" },