Files
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

114 lines
5.5 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": "design-system-application",
"title": "Application",
"title_i18n": {
"zh-CN": "应用程序",
"zh-TW": "應用程式",
"ja": "アプリケーション",
"ko": "애플리케이션",
"de": "Anwendung",
"fr": "Application",
"ru": "Приложение",
"es": "Aplicación",
"pt-BR": "Aplicativo",
"it": "Applicazione",
"vi": "Ứng dụng",
"pl": "Aplikacja",
"id": "Aplikasi",
"nl": "Applicatie",
"ar": "التطبيق",
"tr": "Uygulama",
"uk": "Застосунок",
"en": "Application"
},
"version": "0.1.0",
"publishedAt": "2026-05-12T07:18:16Z",
"description": "App dashboard with purple-themed aesthetic, top-bar navigation, card-based layouts, and developer-first workflows.",
"description_i18n": {
"zh-CN": "紫色主题的应用仪表板,包含顶栏导航、卡片式布局和开发者优先的工作流程。",
"zh-TW": "紫色主題的應用程式儀表板,包含頂部導航列、卡片式佈局和開發者優先的工作流程。",
"ja": "紫をテーマにしたアプリダッシュボード。トップバーナビゲーション、カードベースのレイアウト、開発者ファーストのワークフローを搭載。",
"ko": "보라색 테마의 앱 대시보드로, 상단 바 내비게이션, 카드 기반 레이아웃 및 개발자 우선 워크플로를 제공합니다.",
"de": "App-Dashboard mit violettem Design, Top-Bar-Navigation, kartenbasierten Layouts und entwicklerorientierten Workflows.",
"fr": "Tableau de bord d'application au design violet, avec navigation en barre supérieure, mises en page à base de cartes et workflows axés développeur.",
"ru": "Панель управления приложения в фиолетовой тематике с навигацией в верхней панели, карточными макетами и процессами, ориентированными на разработчиков.",
"es": "Panel de aplicación con estética morada, navegación superior, diseños basados en tarjetas y flujos de trabajo orientados a desarrolladores.",
"pt-BR": "Painel de aplicativo com estética roxa, navegação superior, layouts baseados em cards e fluxos de trabalho voltados para desenvolvedores.",
"it": "Dashboard dell'app con estetica viola, navigazione a barra superiore, layout basati su card e flussi di lavoro orientati agli sviluppatori.",
"vi": "Bảng điều khiển ứng dụng với giao diện màu tím, thanh điều hướng trên cùng, bố cục dạng thẻ và quy trình làm việc ưu tiên nhà phát triển.",
"pl": "Panel aplikacji z fioletową estetyką, nawigacją górną, układami opartymi na kartach i przepływami pracy zorientowanymi na programistów.",
"id": "Dashboard aplikasi dengan estetika bertema ungu, navigasi bilah atas, tata letak berbasis kartu, dan alur kerja yang mengutamakan developer.",
"nl": "App-dashboard met paarse esthetiek, navigatie in de bovenste balk, kaartgebaseerde lay-outs en ontwikkelaargerichte workflows.",
"ar": "لوحة تحكم التطبيق بتصميم أرجواني، مع شريط تنقل علوي، وتخطيطات قائمة على البطاقات، وسير عمل موجه للمطورين.",
"tr": "Mor temalı estetik, üst çubuk navigasyonu, kart tabanlı düzenler ve geliştirici odaklı iş akışlarına sahip uygulama panosu.",
"uk": "Панель керування застосунком з фіолетовою естетикою, навігацією у верхній панелі, макетами на основі карток та робочими процесами, орієнтованими на розробників.",
"en": "App dashboard with purple-themed aesthetic, top-bar navigation, card-based layouts, and developer-first workflows."
},
"license": "MIT",
"tags": [
"design-system",
"first-party",
"design",
"professional-corporate"
],
"od": {
"kind": "scenario",
"taskKind": "new-generation",
"mode": "design-system",
"scenario": "design",
"surface": "web",
"useCase": {
"query": {
"en": "Generate a {{artifactKind}} using the Application design system. Stay faithful to its colour palette, typography, spacing, iconography, and component vocabulary as documented in DESIGN.md.",
"zh-CN": "使用这个插件完成以下任务:Generate a {{artifactKind}} using the Application design system. Stay faithful to its colour palette, typography, spacing, iconography, and component vocabulary as documented in DESIGN.md."
}
},
"inputs": [
{
"name": "artifactKind",
"label": "Artifact kind",
"type": "select",
"options": [
"landing page",
"dashboard",
"marketing site",
"app screen"
],
"default": "landing page"
},
{
"name": "brief",
"label": "Brief",
"type": "text",
"placeholder": "What should the page communicate?"
}
],
"context": {
"designSystem": {
"ref": "application",
"primary": true
},
"assets": [
"./DESIGN.md"
]
},
"pipeline": {
"stages": [
{
"id": "generate",
"atoms": [
"file-write",
"live-artifact"
]
}
]
},
"capabilities": [
"prompt:inject",
"fs:write"
]
}
}