Skip to content

Plugin manifest-version guard fires at release time, after the tag is immutable — and takes publish-installers/publish-repo with it #92

Description

@kipavy

What happened

The v0.16.0 release run failed at release / publish-plugins:

Release 'plugin-gist-sync-v1.1.0' already exists, but its index.js differ from the
freshly built bytes. plugin-gist-sync's source changed without bumping its manifest
version ... Bump the 'version' field in plugin-gist-sync's manifest.json and re-run.

The guard was right. fix(links): open the remaining dead external links via openUrl changed src/plugins/gist-sync/SettingsPage.tsx and added openExternal.ts without bumping src/plugins/gist-sync/manifest.json, so the freshly built bundle no longer matched the published plugin-gist-sync-v1.1.0 that the live catalogue points a hash at.

This is not a request to soften the check. Skipping instead of failing would ship an app whose embedded gist-sync bytes differ from what the catalogue serves, so an uninstall/reinstall would silently hand the user the old bundle back. Failing is correct.

The actual problem: where it fires

publish-plugins is needs: [changelog, publish-tauri], so the check runs only after all six desktop targets have built — ~20 minutes in, and after tag has already created an immutable v0.16.0. At that point the cheap fix (amend the offending commit) no longer exists; the bump has to land on a commit after the tag, and the shipped binary declares a version that no release matches.

The condition is a pure git-diff question — did any file under src/plugins/<id>/ change since that plugin's last published tag without manifest.json's version changing? It needs no build, no artifacts, and no release.

Blast radius, which is the part that hurt

publish-installers and publish-repo are both needs: [tag, release]. release failed, so both were skipped — Homebrew/winget and the apt/yum repo did not publish for v0.16.0 at all, and attach-plugin-catalog was skipped too. A one-line manifest omission silently took out every non-GitHub distribution channel for the release.

Proposal

  1. Add the version-mismatch check to ci so a PR that edits a plugin's source without bumping its manifest fails review, not release.
  2. Failing that, make it a pre-flight job in release.yml with no needs:, so it fires before tag and before 20 minutes of building.
  3. Reconsider whether publish-installers / publish-repo should depend on the whole release job. A plugin-publishing failure should not be able to suppress Homebrew, winget and the Linux repos.

Remediation applied for 0.16.0

  • gist-sync manifest bumped to 1.1.1 on dev (80c0e79).
  • publish-plugins re-dispatched for gist-sync from that ref.
  • The marketplace plugins.json merge is still the usual manual follow-up.
  • Homebrew/winget and the repo publish still need re-running for v0.16.0.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions