fix(hello-status): match the registration to the manifest and gate drift in CI - #8
Merged
Merged
Conversation
…ift in CI The release job refuses to package an official plugin whose manifest.json and plugin.json disagree, so bumping only the manifest to 1.1.0 in #6 left main red: com.glyph.hello-status: manifest.json version 1.1.0 != plugin.json version 1.0.0 Nothing checked that pairing before the merge, so it could only surface in the post-merge release job, which no re-run can turn green. - plugin.json now declares version 1.1.0 and sandbox false, matching the manifest. The marketplace reads the registration for the consent prompt shown before the download, so omitting sandbox there offered the ordinary install warning for a full-trust plugin. - com.glyph.dictionary-fa drops sandbox false from its manifest instead: it only calls ctx.assets.readText and ctx.spellcheck.registerDictionary, both implemented in the sandbox worker, and its published 1.0.0 package already runs sandboxed. - scripts/check-plugins.mjs owns the parity rules (id, version, apiVersion, sandbox, declared files). validate.yml runs it on every PR and release-official.mjs imports it, so both gates read one source of truth. - The catalog badge now names the trust mode either way. It only rendered "sandboxed" for an explicit sandbox true, which nobody writes because it is the default, so the opt-out it exists to flag never showed up. - Smoke tests drive the real release script end to end against a throwaway repo with a stubbed gh, covering packaging, the digest, the packageUrl rewrite and every refusal path. A Smoke workflow runs them with node --test.
hamidfzm
force-pushed
the
fix/plugin-manifest-parity
branch
from
August 16, 2026 12:15
88d2013 to
33856e7
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.
Problem
Release official plugins run 31945013113 failed on
main:#6 bumped
manifest.jsonto 1.1.0 so the sample plugin would be repackaged with itssandbox: falseline, but leftplugin.jsonat 1.0.0.scripts/release-official.mjsrequires the two to agree before it packages anything, and nothing checked that pairing at PR time, so the mismatch could only surface in the post-merge release job, which no re-run can turn green.Two related drifts came out of the same read:
com.glyph.hello-status/plugin.jsonomittedsandbox, so the marketplace, which reads the registration for the consent prompt shown before the download, offered the ordinary install warning for a full-trust plugin. The installed manifest still triggers the full-access warning afterwards, so nothing ran unapproved, but users saw the wrong prompt first.com.glyph.dictionary-fa/manifest.jsondeclaressandbox: falseit does not need. It only callsctx.assets.readTextandctx.spellcheck.registerDictionary, both implemented in the sandbox worker, and its published 1.0.0 package already runs sandboxed.Changes
plugins/com.glyph.hello-status/plugin.json: version 1.1.0 andsandbox: false, matching the manifest.packageUrlandsha256are left alone; the release job rewrites them after merge.plugins/com.glyph.dictionary-fa/manifest.json: dropsandbox: false(least privilege, and it matches the released package). No version bump, so no re-release.scripts/check-plugins.mjs(new): the parity rules in one place, checking id against the folder name, version, apiVersion, sandbox (absent means sandboxed on both sides), and that every manifest-declared file exists.validate.ymlruns it on every PR andrelease-official.mjsimports it, so the PR gate and the release gate read one source of truth. The id check moves out of thevalidate.ymlshell loop into the script.scripts/build-index.mjs: the catalog badge names the trust mode either way. It only rendered "sandboxed" for an explicitsandbox: true, which nobody writes because it is the default, so the opt-out the badge exists to flag never showed up. Hello Status now readsofficial · full trust · no permissions..github/workflows/smoke.yml(new): CI-time smoke tests, mirroring the split in the main Glyph repo betweenci-smoke.yml(drive the real script) and the data checks.Tests
scripts/release-official.test.mjsruns the real release script end to end against a throwaway repo whoseghis a shell stub, so packaging happens for real and nothing can reach GitHub:packageUrlandsha256(zip contents and digest asserted against the file on disk)ghscripts/check-plugins.test.mjsunit-tests the parity rules, including thatcheckAllfinds no problems in this repo.Both run with
node --test: no dependencies, no test framework. The smoke suite is POSIX only (shell stub plus Info-ZIPzip) and skips on Windows. The Smoke job on this PR runs all 16 tests, the 6 smoke cases included. Reverting theplugin.jsonfix and rerunningnode scripts/check-plugins.mjsreproduces the exact CI error, this time at PR time.Notes
index.json,index/tools.json, anddocs/plugin-catalog.mdare regenerated here, as the generator check onmainnow requires. After merge,mainreleasescom.glyph.hello-status-v1.1.0and rewritespackageUrlandsha256in its own bot commit.