Commit Graph

170 Commits

Author SHA1 Message Date
open-design-release-bot[bot]
1d83115fd4 chore(plugin-previews): refresh baked preview manifest (#4905)
Co-authored-by: open-design-bot <bot@open-design.ai>
2026-06-30 08:31:57 +00:00
github-actions[bot]
52a1cd4375 chore(plugin-previews): refresh baked preview manifest (#4672)
Co-authored-by: open-design-bot <bot@open-design.ai>
2026-06-23 11:52:21 +00:00
github-actions[bot]
618a07d8db chore(plugin-previews): refresh baked preview manifest (#4490)
Co-authored-by: open-design-bot <bot@open-design.ai>
2026-06-21 16:18:40 +00:00
github-actions[bot]
efc0a85e9d chore(plugin-previews): refresh baked preview manifest (#4442)
Co-authored-by: open-design-bot <bot@open-design.ai>
2026-06-17 15:22:07 +08:00
elihahah666
b034609cde chore(plugins): remove the shamoni example plugin (duplicate preview imagery) (#4040)
* chore(plugins): remove the shamoni example plugin

The Shamoni scroll-driven gallery example ships a baked preview that
duplicates luxury-botanical's hero imagery, so the Community shelf
shows the same perfume tile twice. Curator call: drop the example
entirely — plugin folder, baked-preview manifest entry, and its slot
in the pinned curated ordering.

* fix(daemon): prune persisted bundled rows when their folder leaves the image

The bundled boot walker only upserted folders that still exist, so a
plugin removed from the daemon image (like the Shamoni example this PR
deletes) survived in upgraded installs' installed_plugins table — and
/api/plugins kept serving a record whose backing files were gone.

Make bundled rows mirror the bundled tree: after a successful walk,
delete source_kind='bundled' rows whose folder was not seen this boot.
Folders that still ship but fail to parse stay registered (warned, not
pruned), the ENOENT early-return never prunes (a missing bundledRoot is
a packaging bug, not a removal), and user-installed rows are untouched.

---------

Co-authored-by: qiongyu1999 <2694684348@qq.com>
2026-06-10 08:07:12 +00:00
github-actions[bot]
68cb6c2aad chore(plugin-previews): refresh baked preview manifest (#4049)
* chore(plugin-previews): refresh baked preview manifest

* ci: trigger checks on bot-authored manifest refresh

---------

Co-authored-by: open-design-bot <bot@open-design.ai>
Co-authored-by: audit <a@b.c>
2026-06-10 07:04:34 +00:00
github-actions[bot]
c0d26ef999 chore(plugin-previews): refresh baked preview manifest (#4032)
* chore(plugin-previews): refresh baked preview manifest

* ci: trigger checks on bot-authored manifest refresh

---------

Co-authored-by: open-design-bot <bot@open-design.ai>
Co-authored-by: audit <a@b.c>
2026-06-10 02:53:16 +00:00
github-actions[bot]
21a7e0f081 chore(plugin-previews): refresh baked preview manifest (#4022)
* chore(plugin-previews): refresh baked preview manifest

* ci: trigger checks on bot-authored manifest refresh

---------

Co-authored-by: open-design-bot <bot@open-design.ai>
Co-authored-by: audit <a@b.c>
2026-06-09 20:25:04 +00:00
github-actions[bot]
5811eb4c54 chore(plugin-previews): refresh baked preview manifest (#4010)
* chore(plugin-previews): refresh baked preview manifest

* ci(plugin-previews): re-trigger checks on the bot-authored manifest PR

---------

Co-authored-by: open-design-bot <bot@open-design.ai>
Co-authored-by: audit <a@b.c>
2026-06-09 15:16:36 +00:00
lefarcen
d0f350e825 feat(plugins-home): pre-baked hover-pan preview clips for the gallery (#3994)
* feat(plugins-home): pre-baked hover-pan preview clips for the gallery

The Community gallery renders every html plugin as a live, scaled
example.html iframe that animates + auto-pans on hover. That is
GPU-expensive at scale (each tile is its own out-of-process document
re-compositing a tall page) and renders inconsistently for tricky pages
(WebGL noise, video backgrounds, lazy content).

Pre-render each preview to a tiny H.264 clip + first-frame poster:

- scripts/bake-plugin-previews.mjs: headless-Chrome screencast of a
  [hold@top in-place animation][linear pan top->bottom] capture, waiting
  on fonts + <img> + CSS background-images + <video> backgrounds first,
  then ffmpeg -> CFR H.264 mp4 + poster.jpg + manifest.json. Velocity is
  pre-computed from page height so the pan always finishes within ~10s.
  Runtime deps (puppeteer-core / Chrome / ffmpeg) stay out of package.json
  and are provided by the CI environment.
- daemon: serves <out> at /api/plugin-previews and attaches the clip to a
  plugin record under od.bakedPreview (a SEPARATE field — the detail modal
  still reads od.preview and opens the live, interactive page).
- web: inferPluginPreview(record, { preferBaked: true }) lets gallery tiles
  opt into the clip; MediaSurface loops the in-place [0, holdMs] span while
  idle and plays the pan on hover, one always-mounted <video> (no black
  flash), looped frame-accurately via requestVideoFrameCallback, with no
  native controls. Plugins without a bake keep the live-iframe fallback.

CI upload to R2 + the post-merge/nightly bake workflow (with content-hash
skip) and the daemon on-demand path land in follow-ups.

* feat(plugins-home): content-hash skip so unchanged plugins reuse their baked clip

The bake now hashes each plugin's preview HTML + a BAKE_VERSION and stores it
in the manifest. Re-running skips any plugin whose hash is unchanged (no render,
no re-encode, and the CI step re-uploads nothing) — editing the page or bumping
BAKE_VERSION invalidates it. Verified: a second pass over already-baked plugins
reuses all of them in ~1s instead of re-rendering.

* feat(plugins-home): point baked-preview URLs at R2 in production

bakedPreviewBlock now builds its poster/video URLs from
OD_PLUGIN_PREVIEWS_BASE_URL (the R2 public origin) when set, falling back to
the daemon's own /api/plugin-previews static route for local dev. The CI bake
uploads the clips to R2 and the deployed daemon points at them there.

* feat(plugins-home): CI workflow to bake + publish plugin previews

Adds .github/workflows/bake-plugin-previews.yml: post-merge (paths:
plugins/_official) + nightly + manual. Each run starts the daemon, bakes ALL
plugins (the content-hash skip makes that cheap — only changed pages re-render,
PREVIEW_REMOTE trusts the manifest hash since CI clips live on R2 not on disk),
`aws s3 cp`s the new clips to R2 (no --delete, so untouched clips stay), and
commits the refreshed manifest back to main.

- The daemon now reads the checked-in manifest from data/plugin-previews/ by
  default (binaries stay on R2; OD_PLUGIN_PREVIEWS_DIR still overrides locally),
  seeded here with an empty manifest so every plugin starts on the live-iframe
  fallback until the first bake lands.

Verification needs a real CI run (R2 secrets + a daemon in CI); the bake script,
hash skip, daemon injection, and web display are all already verified locally.

* ci(plugin-previews): open a reviewed PR for the manifest instead of pushing to main

Protected main can't take a direct push, and the manifest is version-pinned
(ships with the build), so the bake now opens a PR with the refreshed
data/plugin-previews/manifest.json and requests review from @lefarcen rather
than committing straight to main. Only fires when a plugin actually changed.

* ci(plugin-previews): fix invalid YAML — single-line PR body (@ in body broke the literal block)

* ci(plugin-previews): TEMP branch trigger + debug guards (limit 3, skip publish off-main)

* ci(plugin-previews): install puppeteer-core via pnpm (npm chokes on workspace:*)

* ci(plugin-previews): correct R2 secrets (repository-assets bucket) + TEMP branch publish test

* ci(plugin-previews): revert temp branch-debug toggles (workflow verified in CI)

* fix(plugins-home): gate bakedPreview on a fetchable source + fix workflow shellcheck

Review feedback (nettee):
- bakedPreviewBlock now only attaches a baked preview when a remote origin
  (OD_PLUGIN_PREVIEWS_BASE_URL) is set OR the clip files exist on disk. A
  deployment reading the checked-in manifest without the base URL set would
  otherwise emit /api/plugin-previews URLs that 404 (binaries live on R2),
  breaking tiles instead of falling back to the live iframe.
- workflow: `for _` instead of unused `for i` (SC2034) and split the CHROME
  declare/export (SC2155) so the actionlint gate passes.

* fix(plugins-home): log manifest load failures instead of swallowing them

Review feedback (nettee, non-blocking): loadManifest() caught every read/parse
error and returned {}, so a malformed manifest would silently disable all baked
previews with no trace. Warn so it's diagnosable.

* feat(plugins-home): use baked previews on the example-prompt preset tiles too

The HomeHero '示例提示词' preset tiles render the same plugin previews via
PreviewSurface; pass preferBaked so they get the cheap poster + hover-pan clip
instead of a live iframe, matching the gallery.

* ci(plugin-previews): grant pull-requests: write so the manifest PR step can open its PR

Review feedback (nettee): the permissions block only set contents: write, so
pull-requests defaulted to none and gh pr create would 403 on the first run that
changes the manifest.

---------

Co-authored-by: audit <a@b.c>
2026-06-09 13:14:54 +00:00
open-design-bot
fb0510dd3c chore(card): generated card 2026-06-03 10:40:27 +00:00
open-design-bot
3a4a27ff51 chore(events): append pr_merged 2026-06-03 10:40:26 +00:00
open-design-bot
eb1396bf0c chore(contributors): +30pts for @zoeforfun (PR #3564) 2026-06-03 10:40:25 +00:00
Marc Chan
279da4f3b6 chore(contributors): remove migrated data files (#3138) 2026-05-27 16:24:06 +00:00
open-design-bot
b3b6291dbb chore(card): generated card 2026-05-27 10:09:01 +00:00
open-design-bot
9ebf21af6e chore(events): append pr_merged 2026-05-27 10:08:59 +00:00
open-design-bot
416f8aefa5 chore(contributors): +30pts for @itsmeved24 (PR #3021) 2026-05-27 10:08:58 +00:00
open-design-bot
98b396335d chore(card): generated card 2026-05-27 09:53:47 +00:00
open-design-bot
334001c7fa chore(events): append pr_merged 2026-05-27 09:53:46 +00:00
open-design-bot
4634ef0ddf chore(contributors): +30pts for @522700967-wq (PR #3010) 2026-05-27 09:53:44 +00:00
open-design-bot
caa40e54da chore(card): generated card 2026-05-27 09:47:22 +00:00
open-design-bot
3eae821c5e chore(events): append pr_merged 2026-05-27 09:47:20 +00:00
open-design-bot
95d6ca663c chore(contributors): +30pts for @elihahah666 (PR #3098) 2026-05-27 09:47:19 +00:00
open-design-bot
ea046e313e chore(card): generated card 2026-05-27 09:39:48 +00:00
open-design-bot
37fab30e6a chore(events): append pr_merged 2026-05-27 09:39:46 +00:00
open-design-bot
f9796d6e6c chore(contributors): +30pts for @Siri-Ray (PR #3085) 2026-05-27 09:39:45 +00:00
open-design-bot
9923529831 chore(events): append issue_opened_accepted 2026-05-27 09:34:16 +00:00
open-design-bot
bdd684895c chore(contributors): +5pts for @AmyShang-alt (issue #3104) 2026-05-27 09:34:15 +00:00
open-design-bot
c997f37ab7 chore(events): append pr_merged 2026-05-27 09:25:01 +00:00
open-design-bot
72e4cda383 chore(contributors): +12pts for @jinmeihong0201-gif (PR #3094) 2026-05-27 09:25:00 +00:00
open-design-bot
2aa53abc83 chore(events): append pr_merged 2026-05-27 09:20:55 +00:00
open-design-bot
ce4bc0d456 chore(contributors): +12pts for @alchemistklk (PR #3099) 2026-05-27 09:20:53 +00:00
open-design-bot
e4e17767d5 chore(events): append pr_merged 2026-05-27 09:15:12 +00:00
open-design-bot
18c60e90b9 chore(contributors): +12pts for @lefarcen (PR #3100) 2026-05-27 09:15:10 +00:00
open-design-bot
02b352f13d chore(card): generated card 2026-05-27 09:10:57 +00:00
open-design-bot
a486caae1b chore(events): append issue_opened_accepted 2026-05-27 09:10:55 +00:00
open-design-bot
c96499f854 chore(contributors): +5pts for @shaarron (issue #3101) 2026-05-27 09:10:54 +00:00
open-design-bot
a030c98f63 chore(events): append pr_merged 2026-05-27 08:50:01 +00:00
open-design-bot
7350d93b66 chore(contributors): +12pts for @alchemistklk (PR #3092) 2026-05-27 08:50:00 +00:00
open-design-bot
33f2ee58a8 chore(events): append issue_opened_accepted 2026-05-27 08:35:15 +00:00
open-design-bot
0391958daa chore(contributors): +5pts for @AmyShang-alt (issue #3095) 2026-05-27 08:35:14 +00:00
open-design-bot
bf85fe599e chore(events): append issue_opened_accepted 2026-05-27 07:40:53 +00:00
open-design-bot
d9bea6e8cf chore(contributors): +5pts for @AmyShang-alt (issue #3089) 2026-05-27 07:40:52 +00:00
open-design-bot
1e6b383157 chore(events): append pr_merged 2026-05-27 07:32:33 +00:00
open-design-bot
69156c93bb chore(contributors): +12pts for @alchemistklk (PR #3088) 2026-05-27 07:32:31 +00:00
open-design-bot
3fb620af42 chore(events): append pr_merged 2026-05-27 07:25:06 +00:00
open-design-bot
8b5a88cfdc chore(contributors): +12pts for @YOMXXX (PR #3072) 2026-05-27 07:25:04 +00:00
open-design-bot
4db1585047 chore(card): generated card 2026-05-27 07:18:59 +00:00
open-design-bot
72b8807e09 chore(events): append pr_merged 2026-05-27 07:18:57 +00:00
open-design-bot
cf02afee4a chore(contributors): +30pts for @YOMXXX (PR #3070) 2026-05-27 07:18:56 +00:00