Update Versions - #59
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changepacks/main
branch
from
September 14, 2026 07:32
49231ae to
65e7238
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changepacks
devup-mcp@0.5.0 → 0.6.0 - crates/devup-mcp/Cargo.toml
Minor
doctorreports it as a path. A collection asked the OAuth backend for a token before it asked anything whether a token was needed, and refused outright when there wasn't one. That inverted the two paths. The bridge spends no Figma allowance and needs no credential of any kind, so it is the path to reach for; direct is metered and a single screen costs several reads. Whoever had attached the plugin - precisely to stay off the metered path - was told to go and authorize the metered path first, and the export never started, on a file every read of which the plugin was sitting there ready to serve. After the previous change moved node-scoped metadata onto the bridge, nothing in a tsx export needs the remote path at all, so that refusal stood between an attached plugin and a finished screen for no remaining reason.FigmaUpstream::serves_without_credentialsanswers per file key rather than per process, because a plugin holding another file open says nothing about this one, andFallbackUpstreamdelegates it to the bridge. The login is now required only when no plugin is holding this file. A read inside the collection that the bridge genuinely cannot serve - a file-scope metadata read, or referencePng's get_screenshot - still refuses on its own, where the reason belongs to that read instead of condemning the whole export before it starts. Separately,devup_figma_auth doctorknew only aboutdirect, which made the only instrument for diagnosing the connection one that could give exactly one answer - run login - to every question, including the ones whose real answer was 'run the plugin' or 'the listener never bound'. It now reportspreferredPath: bridgeand apaths.bridgeblock separating the three states that need three different repairs: not listening (the port was taken or switched off), listening with nothing attached (run the plugin, and the port is named), and attached (with the file keys, because a plugin open on the wrong file looks identical from the outside). Measured against the release binary with no token stored at all: a plugin attached over the real socket, doctor reporting available, and an export that reached the read instead of DEVUP_AUTH_REQUIRED.devup-mcp-devup-ui@0.5.0 → 0.5.1 - crates/devup-mcp-devup-ui/Cargo.toml
Patch
devup-mcp-figma@0.5.0 → 0.6.0 - crates/devup-mcp-figma/Cargo.toml
Minor
doctorreports it as a path. A collection asked the OAuth backend for a token before it asked anything whether a token was needed, and refused outright when there wasn't one. That inverted the two paths. The bridge spends no Figma allowance and needs no credential of any kind, so it is the path to reach for; direct is metered and a single screen costs several reads. Whoever had attached the plugin - precisely to stay off the metered path - was told to go and authorize the metered path first, and the export never started, on a file every read of which the plugin was sitting there ready to serve. After the previous change moved node-scoped metadata onto the bridge, nothing in a tsx export needs the remote path at all, so that refusal stood between an attached plugin and a finished screen for no remaining reason.FigmaUpstream::serves_without_credentialsanswers per file key rather than per process, because a plugin holding another file open says nothing about this one, andFallbackUpstreamdelegates it to the bridge. The login is now required only when no plugin is holding this file. A read inside the collection that the bridge genuinely cannot serve - a file-scope metadata read, or referencePng's get_screenshot - still refuses on its own, where the reason belongs to that read instead of condemning the whole export before it starts. Separately,devup_figma_auth doctorknew only aboutdirect, which made the only instrument for diagnosing the connection one that could give exactly one answer - run login - to every question, including the ones whose real answer was 'run the plugin' or 'the listener never bound'. It now reportspreferredPath: bridgeand apaths.bridgeblock separating the three states that need three different repairs: not listening (the port was taken or switched off), listening with nothing attached (run the plugin, and the port is named), and attached (with the file keys, because a plugin open on the wrong file looks identical from the outside). Measured against the release binary with no token stored at all: a plugin attached over the real socket, doctor reporting available, and an export that reached the read instead of DEVUP_AUTH_REQUIRED.get_metadatawas excluded from the bridge on the ground that the plugin's answer has a different shape; measured against a View seat whose allowance was spent, that single call was the whole difference between an export and a refusal, because every other read in the path already had a script. The exclusion held only for the shape, not for the data:find_metadatadeserialises aMetadataDocumentin its first branch and reduces the official XML to that same type in the next, so a plugin that emits the canonical camelCase document is read by the same decoder rather than a parallel one.metadata.jsemits exactly that document and nothing else - no geometry, which the decoder does not read and the snapshot already carries. A read with no node is left on the remote path: it answers with the top-level page list, which is a different contract and not worth imitating. The second is independent of transport. When a root has children and more than two hundred descendants, the legacy plan snapshots the children and, in node scope, never the root - so projection fails with DEVUP_FIGMA_NODE_NOT_FOUND on exactly the screen the caller named. That path is rarely reached because the fast envelope usually serves node scope; it is reached whenever the fast envelope falls back, and then it cannot succeed at all. The node to convert is now always among the snapshot targets. Measured on a 1920-wide screen whose fast envelope fell back: eight Figma calls, all served by the plugin, no metered call and no rate-limit refusal, where the same screen previously stopped at the metadata call. The descendant count a plugin reports is not the count the official XML reports - the official metadata collapses instances nested inside an instance and the Plugin API walk does not - so the split decision can differ between the two paths; that difference now costs one redundant bridged snapshot instead of a failure.