Accept prerelease Paseo versions in plugin requirements and prepare plugin docs for the 0.8 beta - #4452
Conversation
|
| Filename | Overview |
|---|---|
| packages/protocol/src/plugin-requirements.ts | Broadens prerelease compatibility through stable-core matching, but unintentionally defeats explicit prerelease minimums. |
| packages/protocol/src/plugin-requirements.test.ts | Expands daemon/app compatibility coverage but omits the older-beta versus newer-beta-floor boundary. |
| packages/server/src/server/plugins/manifest.test.ts | Validates every current checked-in plugin example through the production manifest reader. |
| plugin-examples/provider-acp-transformer/paseo-plugin.json | Removes unsupported manifest metadata so the ACP example passes manifest validation. |
| public-docs/plugins/v0.8/reference.md | Updates beta requirements and SDK guidance, while documenting the new stable-core compatibility behavior. |
| public-docs/plugins/v0.8/migration.md | Updates migrated manifests to use the beta-compatible stable range. |
| packages/website/src/plugin-docs-navigation.test.ts | Updates navigation expectations for the Beta label and provider guide. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart LR
M[Plugin manifest range] --> C[assertPluginCompatibility]
V[Daemon or app version] --> C
C --> S{Actual version satisfies?}
S -->|Yes| L[Load plugin]
S -->|No| K[Compare stable core]
K -->|Satisfies| L
K -->|Does not satisfy| R[Reject plugin]
Reviews (2): Last reviewed commit: "fix(plugins): accept prerelease versions..." | Re-trigger Greptile
Let beta runtimes load plugins targeting their stable release while preserving the pre-0.8 legacy boundary. Validate all checked-in example manifests and remove unsupported ACP example metadata.
…lugin docs for the 0.8 beta (getpaseo#4452) Accept plugin requirements against the runtime version or its stable core while preserving the legacy version boundary. Validate all example manifests, correct the ACP example metadata, and prepare plugin author documentation for the beta.
Linked issue
Refs #4206, #4347, #4430, #4265, #4314, #4357, #4435, #4392, #4431, #4358, #4203, #4446, #3983, #3985.
Type of change
Reasoning
Plugins declaring
requirements.paseo: ">=0.8.0"were rejected by Paseo0.8.0-beta.1, so the release examples could not install on the beta. Match the running version or its stable core against the range in the shared compatibility function. Both the daemon and app use this function; legacy<0.8.0plugins remain rejected by beta.1, and 0.7.2 remains rejected by>=0.8.0. Explicit prerelease ranges still work.The ACP example also had unsupported
name,version, anddescriptionmanifest fields. Remove them and validate every checked-in example through the production manifest reader in a parameterized test.Prepare the plugin guides for the beta: label v0.8 Beta while retaining stable v0.7 navigation; use
>=0.8.0in copyable manifests and explain stable-core matching; correct the slash-command RPC schema and stale runtime-boundary/config-edit guidance; clarify ACP and lifecycle-helper prerequisites; add README plugin discovery and trust guidance. The documentation-navigation assertion follows the Beta label and existing Providers page. The scaffold still generates the current CLI version as its minimum.Compatibility and scope
No wire schema or RPC shape changes. Old messages still parse unchanged; this changes only local plugin version eligibility in the shared app/daemon helper. An older app still checks its own version and does not become compatible merely because its daemon is compatible. Stable-core matching intentionally treats a prerelease as eligible wherever its stable release is eligible.
Two commits on the branch: the existing docs commit
1766217a8, followed by the code fix5de2122a7. No evidence files are committed. No release version bump, SDK publish, or provider implementation change.Test-first evidence
Before the fix, the new compatibility case failed with:
Before removing the ACP metadata, the new example-validation case failed with:
After the fixes:
Checked all 12 example manifests and seven manifest JSON snippets across public/internal/example docs: no unsupported top-level metadata fields found.
packages/app/src/plugins/registry.tsimports and calls the sameassertPluginCompatibilitybefore evaluating client bundles. No app-specific fallback was added.CLI integration verification
Used this checkout's built CLI against two isolated in-process daemons, each with its own temporary PASEO_HOME and OS-assigned port. The daemon code is the built release source with the rebuilt protocol package; the harness sets only the reported version to beta.1 or 0.7.2. Installed directly from checked-in example directories, with no temporary requirement rewrites or ACP command substitution. All 12 plugins reached running on beta.1, and all 12 were rejected on 0.7.2. Both daemons stopped in
finally; existing daemons were untouched.ACP's
example-acpcommand remains a documented placeholder; installation/running does not establish that command can complete a prompt. Prior UI/provider QA used an installed OpenCode ACP command explicitly, as recorded below.Exact CLI commands and output (trust notice / Node warning omitted)
Reported daemon version:
0.8.0-beta.1{ "id": "agent-configuration", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/agent-configuration", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "catppuccin", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/catppuccin", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "inline-thinking", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/inline-thinking", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "lifecycle-actions", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/lifecycle-actions", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "lifecycle-logger", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/lifecycle-logger", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "linear", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/linear", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "local-example", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/local-plugin", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "modal-ui-example", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/modal-ui", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "provider-acp-transformer-example", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/provider-acp-transformer", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "provider-direct-example", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/provider-direct", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "settings-example", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/settings", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.8.0-beta.1{ "id": "pi-tasks-timeline", "path": "/home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/qa-0-8-beta1-plugins-docs/plugin-examples/timeline-items", "enabled": true, "status": "running" }Exit: 0
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "6221835a-0854-4a2c-a865-54a2d02d9da2", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"agent-configuration\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "3d515126-92b3-4ef6-9aa1-71df3e1daab5", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"catppuccin\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "21a0c4ab-f688-4aa9-a61d-8b554a51e55e", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"inline-thinking\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "7a9f81a2-2da0-40ab-afba-9d115764a59f", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"lifecycle-actions\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "962a07a9-18de-4469-aaa6-d4476e9f6742", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"lifecycle-logger\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "8e76cd71-6e02-428e-943f-d39635cc1acc", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"linear\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "f673a478-1949-48e5-9346-3ca38b1596dd", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"local-example\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "38b35634-e1d9-4ce0-916e-d05267bb9ced", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"modal-ui-example\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "1bae68ad-e001-451a-917c-39d207d624c4", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"provider-acp-transformer-example\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "be67d89d-d8cf-4716-a4f7-a55d2797885a", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"provider-direct-example\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "47a8ab9d-b5c0-43ee-b00c-4ec96d0d55f3", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"settings-example\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Reported daemon version:
0.7.2{ "error": { "name": "DaemonRpcError", "requestId": "100c356f-564d-4ca6-91c8-6213eb87dc11", "requestType": "plugin.directory.install.request", "code": "handler_error", "message": "Request failed: Plugin \"pi-tasks-timeline\" requires Paseo >=0.8.0. Your daemon is 0.7.2. Use a compatible plugin version or update the daemon. requestType=plugin.directory.install.request code=handler_error" } }Exit: 1
Prior browser and SDK QA retained
Linux/Chromium at 1440×1000 and 390×844 against an isolated built daemon: settings save/validation/reload persistence; Catppuccin theme; sidebar item visibility/order; workspace and Explorer panels; composer pills and slash command; timeline renderer rows; modal clipboard/list behavior; direct-provider and configured ACP prompts; all 11 lifecycle hook types; public SDK project subscription, permission response and workspace-owned terminal operations; Git update rejection preserving the running revision. Those earlier UI checks used disclosed temporary example adaptations before the compatibility fix. This follow-up independently verifies unmodified checked-in example installation after the fix.
Prior local SDK/runtime/docs checks: 44 SDK boundaries, 1 plugin process, 31 client loader, 1 migration documentation, 2 documentation navigation; 52 current TypeScript snippets typechecked with typed surrounding context, and 46 Markdown links resolved (11 unique external URLs fetched). No complete local suite was run.
Remaining release QA notes outside this fix: the 0.7.2-versioned scaffold selects the old published SDK while emitting newer imports; a version-bumped/published beta scaffold still needs verification. Appending a plugin row after a completed provider turn extended its displayed duration in prior QA. Successful authenticated Linear search, live Pi integration, native platforms/gestures and every lifecycle policy branch remain untested. These are not claimed as fixed or green by this PR.
Final CI on
5de2122a78155bf4fec5bed6d696d364b38a6daeis green: SDK tests (including ACP), Linux and Windows server tests, typecheck, lint, formatting, Docker, Linux Nix and macOS desktop builds, and Greptile review all passed. Unaffected jobs were skipped by CI filters. The ACP failure did not recur; no rerun or assertion change was needed. All review threads are resolved; the stable-core behavior for explicit prerelease ranges was confirmed as intentional and the reviewer withdrew that finding.Checklist