Files
nexu-io__open-design/plugins/_official/examples/mobile-app/open-design.json
lefarcen da7c4ae051 fix(web): rank Community "Newest" by shipped publishedAt, not local install timestamps (#5597)
* 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)
2026-07-14 08:43:57 +00:00

138 lines
10 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"$schema": "https://open-design.ai/schemas/plugin.v1.json",
"specVersion": "1.0.0",
"name": "example-mobile-app",
"title": "Mobile App",
"title_i18n": {
"zh-CN": "移动应用",
"zh-TW": "行動應用程式",
"ja": "モバイルアプリ",
"ko": "모바일 앱",
"de": "Mobile App",
"fr": "Application mobile",
"ru": "Мобильное приложение",
"es": "Aplicación móvil",
"pt-BR": "Aplicativo mobile",
"it": "App mobile",
"vi": "Ứng dụng di động",
"pl": "Aplikacja mobilna",
"id": "Aplikasi mobile",
"nl": "Mobiele app",
"ar": "تطبيق الهاتف المحمول",
"tr": "Mobil uygulama",
"uk": "Мобільний додаток",
"en": "Mobile App"
},
"version": "0.1.0",
"publishedAt": "2026-05-12T05:25:44Z",
"description": "A mobile-app screen rendered inside a pixel-accurate iPhone 15 Pro frame on the page. Built by copying the seed `assets/template.html` and pasting one screen archetype from `references/layouts.md`. Use when the brief asks for \"mobile app\", \"iOS app\", \"Android app\", \"phone screen\", or \"app UI\".",
"description_i18n": {
"zh-CN": "在页面中渲染于像素级精确的 iPhone 15 Pro 框架内的移动应用屏幕。通过复制种子文件 assets/template.html 并粘贴 references/layouts.md 中的一个屏幕原型来构建。当需求提到《移动应用》、《iOS 应用》、《Android 应用》、《手机屏幕》或《应用 UI》时使用。",
"zh-TW": "在頁面中渲染於像素級精確的 iPhone 15 Pro 框架內的行動應用程式畫面。透過複製種子檔案 assets/template.html 並貼上 references/layouts.md 中的一個畫面原型來建構。當需求提到「行動應用程式」、「iOS 應用程式」、「Android 應用程式」、「手機畫面」或「應用程式 UI」時使用。",
"ja": "ピクセル単位で正確な iPhone 15 Pro フレーム内にレンダリングされるモバイルアプリ画面。assets/template.html をコピーし、references/layouts.md から1つの画面アーキタイプを貼り付けて構築します。ブリーフで『モバイルアプリ』『iOS アプリ』『Android アプリ』『スマホ画面』『アプリ UI』が求められた際に使用します。",
"ko": "페이지 내에서 픽셀 단위로 정확한 iPhone 15 Pro 프레임 안에 렌더링되는 모바일 앱 화면입니다. assets/template.html을 복사하고 references/layouts.md에서 화면 원형 하나를 붙여넣어 제작합니다. 브리프에서 '모바일 앱', 'iOS 앱', 'Android 앱', '휴대폰 화면' 또는 '앱 UI'를 요청할 때 사용하세요.",
"de": "Ein Mobile-App-Bildschirm, der in einem pixelgenauen iPhone 15 Pro-Rahmen auf der Seite gerendert wird. Erstellt durch Kopieren der Seed-Datei assets/template.html und Einfügen eines Bildschirm-Archetyps aus references/layouts.md. Verwenden Sie dies, wenn im Brief nach 'Mobile App', 'iOS App', 'Android App', 'Telefonbildschirm' oder 'App UI' gefragt wird.",
"fr": "Un écran d'application mobile rendu dans un cadre iPhone 15 Pro pixel-perfect sur la page. Créé en copiant le fichier de départ assets/template.html et en collant un archétype d'écran depuis references/layouts.md. À utiliser lorsque le brief demande une 'application mobile', 'application iOS', 'application Android', 'écran de téléphone' ou 'UI d'application'.",
"ru": "Экран мобильного приложения, отрендеренный в попиксельно точной рамке iPhone 15 Pro на странице. Создается копированием исходного файла assets/template.html и вставкой одного архетипа экрана из references/layouts.md. Используйте, когда в брифе запрашивается 'мобильное приложение', 'iOS приложение', 'Android приложение', 'экран телефона' или 'UI приложения'.",
"es": "Una pantalla de aplicación móvil renderizada dentro de un marco iPhone 15 Pro con precisión de píxeles en la página. Se crea copiando el archivo semilla assets/template.html y pegando un arquetipo de pantalla desde references/layouts.md. Úsalo cuando el brief solicite 'aplicación móvil', 'aplicación iOS', 'aplicación Android', 'pantalla de teléfono' o 'UI de aplicación'.",
"pt-BR": "Uma tela de aplicativo mobile renderizada dentro de um frame iPhone 15 Pro com precisão pixel a pixel na página. Criado copiando o arquivo semente assets/template.html e colando um arquétipo de tela de references/layouts.md. Use quando o briefing pedir 'aplicativo mobile', 'aplicativo iOS', 'aplicativo Android', 'tela de celular' ou 'UI de aplicativo'.",
"it": "Una schermata di app mobile renderizzata all'interno di una cornice iPhone 15 Pro pixel-perfect sulla pagina. Creata copiando il file seed assets/template.html e incollando un archetipo di schermata da references/layouts.md. Da utilizzare quando il brief richiede 'app mobile', 'app iOS', 'app Android', 'schermo del telefono' o 'UI dell'app'.",
"vi": "Màn hình ứng dụng di động được render bên trong khung iPhone 15 Pro chính xác từng pixel trên trang. Được tạo bằng cách sao chép tệp mẫu assets/template.html và dán một nguyên mẫu màn hình từ references/layouts.md. Sử dụng khi yêu cầu đề cập đến 'ứng dụng di động', 'ứng dụng iOS', 'ứng dụng Android', 'màn hình điện thoại' hoặc 'UI ứng dụng'.",
"pl": "Ekran aplikacji mobilnej renderowany wewnątrz dokładnej co do piksela ramki iPhone 15 Pro na stronie. Tworzony przez skopiowanie pliku źródłowego assets/template.html i wklejenie jednego archetypu ekranu z references/layouts.md. Użyj, gdy brief wymienia 'aplikację mobilną', 'aplikację iOS', 'aplikację Android', 'ekran telefonu' lub 'UI aplikacji'.",
"id": "Layar aplikasi mobile yang dirender di dalam bingkai iPhone 15 Pro yang akurat hingga piksel di halaman. Dibuat dengan menyalin file seed assets/template.html dan menempelkan satu arketipe layar dari references/layouts.md. Gunakan ketika brief meminta 'aplikasi mobile', 'aplikasi iOS', 'aplikasi Android', 'layar ponsel', atau 'UI aplikasi'.",
"nl": "Een mobiele-appscherm gerenderd in een pixelnauwkeurig iPhone 15 Pro-frame op de pagina. Gemaakt door het seed-bestand assets/template.html te kopiëren en één schermarchetype uit references/layouts.md te plakken. Gebruik wanneer de briefing vraagt om 'mobiele app', 'iOS-app', 'Android-app', 'telefoonscherm' of 'app-UI'.",
"ar": "شاشة تطبيق محمول معروضة داخل إطار iPhone 15 Pro دقيق بالبكسل على الصفحة. يتم إنشاؤها بنسخ ملف البذرة assets/template.html ولصق نموذج شاشة من references/layouts.md. استخدمها عندما يطلب الموجز 'تطبيق محمول' أو 'تطبيق iOS' أو 'تطبيق Android' أو 'شاشة هاتف' أو 'واجهة تطبيق'.",
"tr": "Sayfada piksel hassasiyetinde bir iPhone 15 Pro çerçevesi içinde oluşturulmuş mobil uygulama ekranı. assets/template.html tohum dosyası kopyalanıp references/layouts.md dosyasından bir ekran arketipi yapıştırılarak oluşturulur. Brief'te 'mobil uygulama', 'iOS uygulaması', 'Android uygulaması', 'telefon ekranı' veya 'uygulama UI' istendiğinde kullanın.",
"uk": "Екран мобільного додатка, відрендерений у попіксельно точній рамці iPhone 15 Pro на сторінці. Створюється копіюванням вихідного файлу assets/template.html та вставкою одного архетипу екрану з references/layouts.md. Використовуйте, коли у брифі згадується 'мобільний додаток', 'iOS додаток', 'Android додаток', 'екран телефону' або 'UI додатка'.",
"en": "A mobile-app screen rendered inside a pixel-accurate iPhone 15 Pro frame on the page. Built by copying the seed `assets/template.html` and pasting one screen archetype from `references/layouts.md`. Use when the brief asks for \"mobile app\", \"iOS app\", \"Android app\", \"phone screen\", or \"app UI\"."
},
"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/mobile-app",
"tags": [
"example",
"first-party",
"prototype",
"design",
"web",
"mobile",
"mobile-app",
"ios-app",
"android-app",
"phone-screen",
"app-ui",
"app-mockup",
"untitled",
"app"
],
"compat": {
"agentSkills": [
{
"path": "./SKILL.md"
}
]
},
"od": {
"kind": "scenario",
"taskKind": "new-generation",
"mode": "prototype",
"platform": "mobile",
"scenario": "design",
"surface": "web",
"preview": {
"type": "html",
"entry": "./example.html"
},
"useCase": {
"query": {
"en": "A mobile-app screen rendered inside a pixel-accurate iPhone 15 Pro frame on the page. Built by copying the seed `assets/template.html` and pasting one screen archetype from `references/layouts.md`. Use when the brief asks for \"mobile app\", \"iOS app\", \"Android app\", \"phone screen\", or \"app UI\".",
"zh-CN": "使用这个插件完成以下任务:A mobile-app screen rendered inside a pixel-accurate iPhone 15 Pro frame on the page. Built by copying the seed `assets/template.html` and pasting one screen archetype from `references/layouts.md`. Use when the brief asks for \"mobile app\", \"iOS app\", \"Android app\", \"phone screen\", or \"app UI\"."
},
"exampleOutputs": [
{
"path": "./example.html",
"title": "Mobile App"
}
]
},
"context": {
"skills": [
{
"path": "./SKILL.md"
}
],
"designSystem": {
"primary": true
},
"craft": [
"state-coverage",
"animation-discipline"
],
"assets": [
"./example.html",
"./assets/template.html",
"./references/checklist.md",
"./references/layouts.md"
]
},
"pipeline": {
"stages": [
{
"id": "generate",
"atoms": [
"file-write",
"live-artifact"
]
}
]
},
"capabilities": [
"prompt:inject",
"fs:write"
]
}
}