mirror of
https://github.com/nexu-io/open-design.git
synced 2026-09-20 06:15:06 +08:00
da7c4ae051
* fix(web): rank Community "Newest" by shipped publishedAt, not local install timestamps
The Community gallery Newest toggle sorted by the installed-record
updatedAt/installedAt. Those are stamped when a machine seeds its own
database, so a fresh install (or an upgrade that re-stamps the catalog)
writes the whole bundled catalog milliseconds apart in folder-walk
order — Newest showed reverse walk order (roughly reverse-alphabetical),
unrelated to publication recency.
Root-cause fix: bundled templates now ship a real publication date.
- packages/contracts: add optional manifest field publishedAt (ISO 8601).
- apps/web sortByNewest: freshness = publishedAt when parseable, else
updatedAt (right signal for user-installed plugins); tie-breaks and
stability unchanged.
- plugins/_official: backfill publishedAt into all 460 bundled manifests
from each folder's first-appearance commit date in upstream git
history.
- e2e: repository-resource guard requiring every bundled manifest to
declare a parseable publishedAt, so the signal cannot silently erode.
- docs: field reference entries in plugins-spec (en + zh-CN).
Issue: https://plane.powerformer.net/open-design/projects/49832a02-3158-4faf-bf2f-d0e39c40c7e6/issues/ca0778af-97f5-4fc0-bc63-739280904979
Generated-By: looper 0.0.0-dev (runner=worker, agent=claude-code)
* worker: 模板用最新筛选,筛选出来的不是最新的
Generated-By: looper 0.0.0-dev (runner=worker, agent=claude-code)
* fix(web): keep shipped appeal order inside same-publishedAt batches
Review follow-up (#5597, nettee): after the freshness tie on an equal
publishedAt, the comparator still consulted local updatedAt/installedAt,
which a fresh install stamps in folder-walk order — so every
same-publication batch (largest: 322 manifests on one catalog date)
re-sorted per machine instead of keeping the shipped visual-appeal
ranking. Same-publishedAt records now preserve their incoming position;
local timestamps break ties only when at least one side has no usable
publishedAt. Adds the requested regression spec pinning
same-publishedAt / different-updatedAt records.
Generated-By: looper 0.0.0-dev (runner=worker, agent=claude-code)
* fix(web): gate publishedAt freshness to bundled records; untrack oversized looper attachment
Review follow-up (#5597, nettee round 2): publishedAt was overriding
updatedAt for every visible plugin, so a user-installed github/local/
marketplace plugin carrying an old manifest publishedAt would be buried
behind bundled templates despite a newer local install. publishedAtMs
now returns null for non-bundled records — "Newest" means install
recency for user installs, catalog publication for bundled ones. Adds
the requested regression (non-bundled, old publishedAt, newer
updatedAt) and clarifies the field docs (en + zh-CN).
CI repair: commit 578f7a9 tracked .looper-attachments/bug13_1.png
(3.8MB bug screenshot), tripping the Static gate 1MiB blob guard and
the Validate workspace aggregate. Untrack it and gitignore
.looper-attachments/ so harness attachments stay out of the repo.
Generated-By: looper 0.0.0-dev (runner=worker, agent=claude-code)
129 lines
11 KiB
JSON
129 lines
11 KiB
JSON
{
|
||
"$schema": "https://open-design.ai/schemas/plugin.v1.json",
|
||
"specVersion": "1.0.0",
|
||
"name": "example-worker-visualizer",
|
||
"title": "Worker Visualizer",
|
||
"title_i18n": {
|
||
"zh-CN": "Worker 可视化",
|
||
"zh-TW": "Worker 視覺化",
|
||
"ja": "Worker ビジュアライザー",
|
||
"ko": "Worker 시각화",
|
||
"de": "Worker-Visualizer",
|
||
"fr": "Visualiseur Worker",
|
||
"ru": "Worker-визуализатор",
|
||
"es": "Visualizador Worker",
|
||
"pt-BR": "Visualizador Worker",
|
||
"it": "Visualizzatore Worker",
|
||
"vi": "Trình trực quan Worker",
|
||
"pl": "Wizualizator Worker",
|
||
"id": "Visualizer Worker",
|
||
"nl": "Worker-visualizer",
|
||
"ar": "مُصوِّر Worker",
|
||
"tr": "Worker Görselleştirici",
|
||
"uk": "Worker-візуалізатор",
|
||
"en": "Worker Visualizer"
|
||
},
|
||
"version": "0.1.0",
|
||
"publishedAt": "2026-07-08T08:58:51Z",
|
||
"description": "Build a real-time visualizer whose heavy compute runs in a Web Worker — particle systems, physics, fractals, data/audio viz — optionally sharing memory via SharedArrayBuffer, rendered to canvas at 60fps. Trigger when the user asks for a web worker, simulation, particle system, physics, fractal, off-main-thread compute, or real-time visualizer.",
|
||
"description_i18n": {
|
||
"zh-CN": "构建一个实时可视化器,将繁重计算放到 Web Worker 中运行——粒子系统、物理、分形、数据/音频可视化——可通过 SharedArrayBuffer 共享内存,以 60fps 渲染到画布。当用户需要 web worker、模拟、粒子系统、物理、分形、离主线程计算或实时可视化时触发。",
|
||
"zh-TW": "建立一個即時視覺化器,將繁重運算放到 Web Worker 中執行——粒子系統、物理、碎形、資料/音訊視覺化——可透過 SharedArrayBuffer 共享記憶體,以 60fps 渲染到畫布。當使用者需要 web worker、模擬、粒子系統、物理、碎形、離主執行緒運算或即時視覺化時觸發。",
|
||
"ja": "重い計算を Web Worker で実行するリアルタイムビジュアライザー(パーティクル、物理、フラクタル、データ/オーディオ可視化)を構築。SharedArrayBuffer でメモリを共有し、60fps でキャンバスに描画します。web worker、シミュレーション、パーティクル、物理、フラクタル、メインスレッド外計算、リアルタイム可視化の要望で起動。",
|
||
"ko": "무거운 연산을 Web Worker에서 실행하는 실시간 시각화기(파티클, 물리, 프랙탈, 데이터/오디오 시각화)를 구축합니다. SharedArrayBuffer로 메모리를 공유하고 60fps로 캔버스에 렌더링합니다. web worker, 시뮬레이션, 파티클, 물리, 프랙탈, 오프메인스레드 연산, 실시간 시각화 요청 시 트리거됩니다.",
|
||
"de": "Erstellen Sie einen Echtzeit-Visualizer, dessen schwere Berechnung in einem Web Worker läuft — Partikelsysteme, Physik, Fraktale, Daten-/Audio-Visualisierung — optional per SharedArrayBuffer, auf Canvas mit 60fps gerendert. Wird ausgelöst bei Web-Worker-, Simulations-, Partikel-, Physik-, Fraktal-, Off-Main-Thread- oder Echtzeit-Visualizer-Anfragen.",
|
||
"fr": "Créez un visualiseur temps réel dont le calcul lourd s'exécute dans un Web Worker — systèmes de particules, physique, fractales, visualisation de données/audio — partageant éventuellement la mémoire via SharedArrayBuffer, rendu sur canvas à 60fps. Déclenché pour toute demande de web worker, simulation, particules, physique, fractale, calcul hors thread principal ou visualiseur temps réel.",
|
||
"ru": "Создайте визуализатор реального времени, тяжёлые вычисления которого выполняются в Web Worker — системы частиц, физика, фракталы, визуализация данных/аудио — с опциональным разделением памяти через SharedArrayBuffer, рендеринг на canvas при 60fps. Срабатывает при запросах web worker, симуляции, частиц, физики, фракталов, вычислений вне основного потока или визуализатора реального времени.",
|
||
"es": "Crea un visualizador en tiempo real cuyo cómputo pesado corre en un Web Worker — sistemas de partículas, física, fractales, visualización de datos/audio — compartiendo memoria opcionalmente vía SharedArrayBuffer, renderizado en canvas a 60fps. Se activa ante solicitudes de web worker, simulación, partículas, física, fractal, cómputo fuera del hilo principal o visualizador en tiempo real.",
|
||
"pt-BR": "Crie um visualizador em tempo real cujo cálculo pesado roda em um Web Worker — sistemas de partículas, física, fractais, visualização de dados/áudio — compartilhando memória opcionalmente via SharedArrayBuffer, renderizado em canvas a 60fps. Acionado em pedidos de web worker, simulação, partículas, física, fractal, cálculo fora da thread principal ou visualizador em tempo real.",
|
||
"it": "Crea un visualizzatore in tempo reale il cui calcolo pesante gira in un Web Worker — sistemi di particelle, fisica, frattali, visualizzazione dati/audio — condividendo opzionalmente la memoria via SharedArrayBuffer, renderizzato su canvas a 60fps. Si attiva per richieste di web worker, simulazione, particelle, fisica, frattale, calcolo fuori dal thread principale o visualizzatore in tempo reale.",
|
||
"vi": "Xây dựng trình trực quan thời gian thực với phần tính toán nặng chạy trong Web Worker — hệ hạt, vật lý, fractal, trực quan hóa dữ liệu/âm thanh — tùy chọn chia sẻ bộ nhớ qua SharedArrayBuffer, kết xuất lên canvas ở 60fps. Kích hoạt khi người dùng cần web worker, mô phỏng, hệ hạt, vật lý, fractal, tính toán ngoài luồng chính hoặc trình trực quan thời gian thực.",
|
||
"pl": "Zbuduj wizualizator czasu rzeczywistego, którego ciężkie obliczenia działają w Web Workerze — systemy cząstek, fizyka, fraktale, wizualizacja danych/audio — opcjonalnie współdzieląc pamięć przez SharedArrayBuffer, renderowany na canvasie w 60fps. Uruchamiane przy prośbach o web worker, symulację, cząstki, fizykę, fraktal, obliczenia poza głównym wątkiem lub wizualizator czasu rzeczywistego.",
|
||
"id": "Bangun visualizer real-time yang komputasi beratnya berjalan di Web Worker — sistem partikel, fisika, fraktal, visualisasi data/audio — opsional berbagi memori via SharedArrayBuffer, dirender ke canvas pada 60fps. Terpicu saat pengguna meminta web worker, simulasi, sistem partikel, fisika, fraktal, komputasi di luar main thread, atau visualizer real-time.",
|
||
"nl": "Bouw een real-time visualizer waarvan de zware berekening in een Web Worker draait — deeltjessystemen, fysica, fractals, data-/audiovisualisatie — optioneel met gedeeld geheugen via SharedArrayBuffer, op canvas gerenderd op 60fps. Wordt geactiveerd bij web worker-, simulatie-, deeltjes-, fysica-, fractal-, off-main-thread- of real-time visualizer-verzoeken.",
|
||
"ar": "أنشئ مُصوِّرًا فوريًا تُنفَّذ حساباته الثقيلة في Web Worker — أنظمة جسيمات وفيزياء وكسور (fractals) وتصوير بيانات/صوت — مع مشاركة اختيارية للذاكرة عبر SharedArrayBuffer، ويُرسم على canvas بمعدل 60 إطارًا/ث. يُفعّل عند طلب web worker أو محاكاة أو نظام جسيمات أو فيزياء أو كسور أو حساب خارج الخيط الرئيسي أو مُصوِّر فوري.",
|
||
"tr": "Ağır hesaplaması bir Web Worker'da çalışan gerçek zamanlı bir görselleştirici oluşturun — parçacık sistemleri, fizik, fraktallar, veri/ses görselleştirme — isteğe bağlı olarak SharedArrayBuffer ile bellek paylaşarak, canvas'a 60fps hızında çizilir. Web worker, simülasyon, parçacık sistemi, fizik, fraktal, ana iş parçacığı dışı hesaplama veya gerçek zamanlı görselleştirici istekleriyle tetiklenir.",
|
||
"uk": "Створіть візуалізатор реального часу, важкі обчислення якого виконуються у Web Worker — системи частинок, фізика, фрактали, візуалізація даних/аудіо — з опційним спільним використанням пам'яті через SharedArrayBuffer, рендеринг на canvas при 60fps. Спрацьовує на запити web worker, симуляції, частинок, фізики, фракталів, обчислень поза основним потоком або візуалізатора реального часу.",
|
||
"en": "Build a real-time visualizer whose heavy compute runs in a Web Worker — particle systems, physics, fractals, data/audio viz — optionally sharing memory via SharedArrayBuffer, rendered to canvas at 60fps. Trigger when the user asks for a web worker, simulation, particle system, physics, fractal, off-main-thread compute, or real-time visualizer."
|
||
},
|
||
"license": "MIT",
|
||
"author": {
|
||
"name": "Open Design",
|
||
"url": "https://github.com/nexu-io"
|
||
},
|
||
"homepage": "https://github.com/nexu-io/open-design/tree/main/plugins/_official/examples/worker-visualizer",
|
||
"tags": [
|
||
"example",
|
||
"first-party",
|
||
"prototype",
|
||
"web",
|
||
"web-worker",
|
||
"worker",
|
||
"simulation",
|
||
"particles",
|
||
"sharedarraybuffer",
|
||
"offscreencanvas",
|
||
"powered-preview",
|
||
"untitled"
|
||
],
|
||
"compat": {
|
||
"agentSkills": [
|
||
{
|
||
"path": "./SKILL.md"
|
||
}
|
||
]
|
||
},
|
||
"od": {
|
||
"kind": "scenario",
|
||
"taskKind": "new-generation",
|
||
"mode": "prototype",
|
||
"scenario": "design",
|
||
"surface": "web",
|
||
"preview": {
|
||
"type": "html",
|
||
"entry": "./example.html"
|
||
},
|
||
"useCase": {
|
||
"query": {
|
||
"en": "Build a real-time {{subject}} visualizer whose heavy compute runs in a Web Worker (sharing memory via SharedArrayBuffer when available), rendered to canvas at 60fps as a single self-contained index.html.",
|
||
"zh-CN": "构建一个实时的{{subject}}可视化器,将繁重计算放到 Web Worker 中运行(可用时通过 SharedArrayBuffer 共享内存),作为单个自包含的 index.html 以 60fps 渲染到画布。"
|
||
}
|
||
},
|
||
"inputs": [
|
||
{
|
||
"name": "subject",
|
||
"label": "What should it simulate?",
|
||
"type": "text",
|
||
"required": false,
|
||
"default": "a 12,000-body swirling particle field",
|
||
"placeholder": "e.g. an N-body galaxy, a Mandelbrot zoom, reaction-diffusion"
|
||
}
|
||
],
|
||
"context": {
|
||
"skills": [
|
||
{
|
||
"path": "./SKILL.md"
|
||
}
|
||
],
|
||
"designSystem": {
|
||
"primary": true
|
||
}
|
||
},
|
||
"pipeline": {
|
||
"stages": [
|
||
{
|
||
"id": "generate",
|
||
"atoms": [
|
||
"file-write",
|
||
"live-artifact"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"capabilities": [
|
||
"prompt:inject",
|
||
"fs:write"
|
||
]
|
||
}
|
||
}
|