mirror of
https://github.com/nexu-io/open-design.git
synced 2026-09-20 06:15:06 +08:00
390fcf88f3
* fix(plugin-previews): validate baked preview metadata against shipped plugins The Home Community gallery renders whatever data/plugin-previews/manifest.json names, and nothing kept that metadata in sync with reality: #4815 deleted 19 example plugins but left all 19 manifest entries behind, #4040 shipped a card showing another plugin's imagery, a failed re-bake silently leaves the old clip serving outdated content, and durationMs recorded the intended walk time rather than the encoded file (23 entries carried holdMs > real duration, so the card's idle loop pointed past the end of the clip). - add scripts/check-plugin-preview-manifest.ts to pnpm guard: every manifest entry must name a shipped plugin, own its clip keys (<id>/<hash>/... or the legacy <id>.<hash>....), carry a coherent fingerprint, and never share a clip with another entry; prune the 19 orphaned entries it caught - bake validation (BAKE_VERSION 5): reject blank clips (whole-clip luma range via ffprobe signalstats), record durationMs from the encoded file, clamp holdMs to it, and write a bake-report.json naming skipped/stale/blank plugins instead of swallowing the failure - strict mode (--strict / PREVIEW_STRICT=1) fails the run when a bake left broken metadata behind; the pre-merge validation workflow now runs strict while the post-merge/nightly publishers stay lenient * fix(plugins): make the hyperframes example self-contained The example loaded cdn.tailwindcss.com (a render-blocking head script the page never used — every style is inline) plus Google Fonts. Inside the sandboxed gallery iframe or on a slow network the stalled script showed a long blank instead of the composition, and the CI bake raced the webfonts. Drop both: the page now renders from local system font stacks with zero external requests, so the live preview, the detail iframe, and the baked clip all show the same content. * fix(plugin-previews): address review — fail fast on probe errors, widen strict trigger paths - probeClipMs/clipLumaRange now throw instead of returning null: ffprobe is required validation infrastructure, and a swallowed probe error silently disabled exactly the checks this PR adds. A thrown error becomes an 'error …' skip, is recorded in bake-report.json under 'errors', and fails strict mode — while the routine skips every sweep has (non-html plugins 404ing the preview route) still never trip strict. - bake-plugin-previews-pr.yml now also triggers on plugins/community/**, .github/actions/bake-previews/**, and itself, so community-plugin preview changes and bake-recipe changes cannot merge without the strict pre-merge validation. * fix(plugin-previews): bake static pages as a held still instead of skipping forever The strict pre-merge bake on this PR caught five manifest entries that could NEVER refresh: example-dating-web, example-html-ppt-zhangzara-8-bit-orbit, example-frame-logo-outro, od-new-generation, example-orbit-notion. All five are (near-)static pages — the CDP screencast only delivers frames when something repaints, so they produce 1-4 frames and the old 'frames < 5' guard skipped them on every bake, nightly included, leaving their committed entries permanently stale (their old clips are the 103-210ms degenerate files in the manifest today). Encode <5-frame captures as a still instead: hold the last frame for the idle-loop span (half before the trailing repeated concat entry, half inherited by it, summing to ~HOLD_MS). Only a zero-frame capture is a real failure now. The blank-luma check still rejects stills of nothing. * fix(plugin-previews): never persist a manifest entry without a fingerprint When the preview fingerprint fetch failed, the loop still rendered and — on an otherwise successful bake — persisted an entry with hash: null and un-fingerprinted keys: metadata the content-hash reuse skip can never match again and the new manifest guard rejects. Treat a missing fingerprint as an infrastructure error instead: skip the plugin, record it under errors in bake-report.json (strict mode exits non-zero), and leave any committed entry untouched for the next sweep. --------- Co-authored-by: Tuola Ge <gexingli@refly.ai>
68 lines
2.6 KiB
YAML
68 lines
2.6 KiB
YAML
name: bake-plugin-previews-pr
|
|
|
|
# Low-privilege pre-merge bake validation for plugin preview changes.
|
|
#
|
|
# This workflow intentionally does not receive R2 credentials, a write-capable
|
|
# token, or a manifest push step. It may execute PR-head preview code because it
|
|
# runs with read-only repository permissions and no secrets; the secret-bearing
|
|
# upload/review PR path stays in bake-plugin-previews.yml after merge, and the
|
|
# release writeback stays in bake-plugin-previews-release.yml.
|
|
|
|
on:
|
|
pull_request:
|
|
types: [opened, synchronize, reopened]
|
|
# Everything that changes what a baked preview looks like: both plugin
|
|
# roots the preview manifest may reference (the guard and the bake cover
|
|
# plugins/community too), the renderer, and the shared bake action + this
|
|
# workflow itself — so a change to the bake recipe or its strictness can't
|
|
# merge without running the strict pre-merge validation.
|
|
paths:
|
|
- 'plugins/_official/**'
|
|
- 'plugins/community/**'
|
|
- 'scripts/bake-plugin-previews.mjs'
|
|
- '.github/actions/bake-previews/**'
|
|
- '.github/workflows/bake-plugin-previews-pr.yml'
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: bake-plugin-previews-pr-${{ github.event.pull_request.number }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
bake:
|
|
name: Bake plugin previews (pre-merge)
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 90
|
|
steps:
|
|
- name: Checkout PR head
|
|
uses: actions/checkout@v6.0.2
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha }}
|
|
fetch-depth: 0
|
|
|
|
- name: Setup workspace
|
|
uses: ./.github/actions/setup-workspace
|
|
|
|
- name: Render previews without publishing
|
|
uses: ./.github/actions/bake-previews
|
|
with:
|
|
upload: 'false'
|
|
# Strict: a PR that breaks its own preview (blank clip, or a change
|
|
# whose re-bake fails and would leave the committed entry serving the
|
|
# OLD clip) fails here, pre-merge, instead of shipping a gallery card
|
|
# that no longer matches the plugin.
|
|
strict: 'true'
|
|
|
|
- name: Compare generated manifest
|
|
run: |
|
|
OLD=data/plugin-previews/manifest.json
|
|
NEW=.tmp/plugin-previews/manifest.json
|
|
diff_result="$(node scripts/plugin-previews-diff.mjs "$OLD" "$NEW")"
|
|
case "$diff_result" in
|
|
changed) echo "previews changed — post-merge bake will publish clips and open the rolling manifest PR" ;;
|
|
unchanged) echo "previews unchanged" ;;
|
|
*) echo "unexpected diff result: '$diff_result'" >&2; exit 1 ;;
|
|
esac
|