diff --git a/.changepacks/changepack_log_bridge_first.json b/.changepacks/changepack_log_bridge_first.json deleted file mode 100644 index 2ac3f2c5..00000000 --- a/.changepacks/changepack_log_bridge_first.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "changes": { - "crates/devup-mcp/Cargo.toml": "Minor" - }, - "note": "An agent asked for one screen with the Devup Bridge plugin attached and serving, was told `status: \"disconnected\"` by `devup_figma_auth` - a word that described only the OAuth path - and asked its user to log in. Pressing on, `devup_figma_export` without a url was refused as \"url or artifactId is required\" with no next step, so it invented `/design/bridge/bridge`; the plugin, which could not report its own file key, served it because it was the only one attached, and the answer reported `source.kind: \"direct\"` and the invented key as the file's. Connectivity is now path-aware: `status` (and the `login`/`logout` answers) report `connected`, `activePath` (`bridge`, `direct` or null), both paths with the files attached plugins have open - file name, current page and selection, which the plugin now reports on attach and on every change - and a `nextAction`; top-level `disconnected` is left only for when neither path can serve, and `doctor` is the same report plus reference data. With exactly one plugin attached, `devup_figma_export`, `devup_figma_search` and `devup_figma_explore` take no url: they read the plugin's file, export and explore start from the node selected in Figma, and `frameIds` without url name frames in it. `figma-bridge://current[?node-id=]` is the official placeholder where a link is still needed, and every link devup-mcp hands back for a file whose key is unknown uses it. With no plugin or several, the refusal carries a `nextAction` listing the ways forward - run the plugin, log in and pass a link, or pick one of the attached files. Answers the plugin served say `source.kind: \"bridge\"` with `bridgePort`, `fileName`, `pageName` and `bridgeReads`, and `source.fileKey` is only ever the key the plugin reported: null with a reason when it reported none, and a key the request carried is reported apart as `requestedFileKey`. A plugin that could not report its key is routed by a connection-scoped key that never reaches the direct path and never appears in an answer. Plugins are now tracked per connection, so two keyless plugins no longer collapse into one slot, with the second's registration erased when the first disconnects. `login` warns rather than blocks when a bridge is attached. The auth tool description, the server instructions (rule 1a) and `devup://guide/usage` now state the connection order: bridge, then direct.", - "date": "2026-09-25T09:00:00.000000000Z" -} diff --git a/Cargo.lock b/Cargo.lock index ec6762c5..00d21ac0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -693,7 +693,7 @@ checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" [[package]] name = "devup-mcp" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -724,7 +724,7 @@ dependencies = [ [[package]] name = "devup-mcp-devup-ui" -version = "0.11.0" +version = "0.12.0" dependencies = [ "devup-mcp-figma", "insta", @@ -741,7 +741,7 @@ dependencies = [ [[package]] name = "devup-mcp-figma" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -768,7 +768,7 @@ dependencies = [ [[package]] name = "devup-mcp-visual" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "image", diff --git a/Cargo.toml b/Cargo.toml index 2813f42e..174389ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ resolver = "3" [workspace.package] -version = "0.11.0" +version = "0.12.0" edition = "2024" rust-version = "1.98" license = "MIT"