Files
nexu-io__open-design/plugins/_official/examples/orbit-gmail/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

125 lines
8.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": "example-orbit-gmail",
"title": "Orbit Gmail",
"title_i18n": {
"zh-CN": "Orbit Gmail",
"zh-TW": "Orbit Gmail",
"ja": "Orbit Gmail",
"ko": "Orbit Gmail",
"de": "Orbit Gmail",
"fr": "Orbit Gmail",
"ru": "Orbit Gmail",
"es": "Orbit Gmail",
"pt-BR": "Orbit Gmail",
"it": "Orbit Gmail",
"vi": "Orbit Gmail",
"pl": "Orbit Gmail",
"id": "Orbit Gmail",
"nl": "Orbit Gmail",
"ar": "Orbit Gmail",
"tr": "Orbit Gmail",
"uk": "Orbit Gmail",
"en": "Orbit Gmail"
},
"version": "0.1.0",
"publishedAt": "2026-05-12T07:18:16Z",
"description": "Open Orbit briefing skill — selected by the Orbit pipeline when Gmail is the user's only connected connector, or when the user explicitly scopes their daily digest to Gmail. Pulls the past 24 hours of inbox activity (replies awaited, mentions, cc, auto- categorized bulk) from the user's authenticated Gmail connection and renders the digest as the Orbit Daily Digest email opened inside Gmail's reading view. This skill should not be triggered manually — it is invoked by Orbit's daily-digest scheduler against live Gmail data.",
"description_i18n": {
"zh-CN": "当 Gmail 是用户唯一连接的服务或用户明确指定时,自动提取过去 24 小时的收件箱活动并生成每日摘要。由 Orbit 调度器自动触发,不应手动调用。",
"zh-TW": "當 Gmail 是使用者唯一連接的服務或使用者明確指定時,自動提取過去 24 小時的收件匣活動並產生每日摘要。由 Orbit 排程器自動觸發,不應手動呼叫。",
"ja": "Gmail が唯一の接続サービスの場合、または明示的に指定された場合に、過去 24 時間の受信トレイアクティビティを抽出してデイリーダイジェストを生成します。Orbit スケジューラーにより自動起動され、手動での実行は不要です。",
"ko": "Gmail이 유일한 연결 서비스이거나 사용자가 명시적으로 지정한 경우, 지난 24시간의 받은편지함 활동을 추출하여 일일 요약을 생성합니다. Orbit 스케줄러에 의해 자동 실행되며 수동 실행은 불필요합니다.",
"de": "Extrahiert die Posteingangsaktivitäten der letzten 24 Stunden und erstellt eine tägliche Zusammenfassung, wenn Gmail der einzige verbundene Dienst ist oder explizit ausgewählt wurde. Wird automatisch vom Orbit-Scheduler ausgelöst und sollte nicht manuell gestartet werden.",
"fr": "Extrait l'activité de la boîte de réception des dernières 24 heures et génère un résumé quotidien lorsque Gmail est le seul service connecté ou explicitement sélectionné. Déclenché automatiquement par le planificateur Orbit, ne doit pas être exécuté manuellement.",
"ru": "Извлекает активность почтового ящика за последние 24 часа и создает ежедневный дайджест, когда Gmail является единственным подключенным сервисом или явно выбран пользователем. Автоматически запускается планировщиком Orbit, не требует ручного запуска.",
"es": "Extrae la actividad de la bandeja de entrada de las últimas 24 horas y genera un resumen diario cuando Gmail es el único servicio conectado o está explícitamente seleccionado. Se activa automáticamente por el programador de Orbit y no debe ejecutarse manualmente.",
"pt-BR": "Extrai a atividade da caixa de entrada das últimas 24 horas e gera um resumo diário quando o Gmail é o único serviço conectado ou explicitamente selecionado. Acionado automaticamente pelo agendador do Orbit, não deve ser executado manualmente.",
"it": "Estrae l'attività della posta in arrivo delle ultime 24 ore e genera un riepilogo giornaliero quando Gmail è l'unico servizio connesso o esplicitamente selezionato. Attivato automaticamente dallo scheduler di Orbit, non deve essere eseguito manualmente.",
"vi": "Trích xuất hoạt động hộp thư đến trong 24 giờ qua và tạo bản tóm tắt hàng ngày khi Gmail là dịch vụ duy nhất được kết nối hoặc được chọn rõ ràng. Tự động kích hoạt bởi bộ lập lịch Orbit, không nên chạy thủ công.",
"pl": "Wyodrębnia aktywność skrzynki odbiorczej z ostatnich 24 godzin i generuje codzienne podsumowanie, gdy Gmail jest jedyną podłączoną usługą lub została wyraźnie wybrana. Uruchamiane automatycznie przez harmonogram Orbit, nie należy uruchamiać ręcznie.",
"id": "Mengekstrak aktivitas kotak masuk 24 jam terakhir dan menghasilkan ringkasan harian ketika Gmail adalah layanan tersambung satu-satunya atau dipilih secara eksplisit. Dipicu otomatis oleh penjadwal Orbit, tidak perlu dijalankan secara manual.",
"nl": "Haalt inbox-activiteit van de afgelopen 24 uur op en genereert een dagelijkse samenvatting wanneer Gmail de enige verbonden service is of expliciet geselecteerd. Wordt automatisch geactiveerd door de Orbit-planner en hoeft niet handmatig te worden uitgevoerd.",
"ar": "يستخرج نشاط صندوق الوارد خلال الـ 24 ساعة الماضية وينشئ ملخصاً يومياً عندما يكون Gmail هو الخدمة الوحيدة المتصلة أو محددة صراحةً. يتم تشغيله تلقائياً بواسطة مجدول Orbit ولا ينبغي تشغيله يدوياً.",
"tr": "Gmail tek bağlı hizmet olduğunda veya açıkça seçildiğinde son 24 saatteki gelen kutusu etkinliğini çıkarır ve günlük özet oluşturur. Orbit zamanlayıcı tarafından otomatik olarak tetiklenir, manuel çalıştırılmamalıdır.",
"uk": "Витягує активність поштової скриньки за останні 24 години та створює щоденний дайджест, коли Gmail є єдиним підключеним сервісом або явно обраний користувачем. Автоматично запускається планувальником Orbit, не потребує ручного запуску.",
"en": "Open Orbit briefing skill — selected by the Orbit pipeline when Gmail is the user's only connected connector, or when the user explicitly scopes their daily digest to Gmail. Pulls the past 24 hours of inbox activity (replies awaited, mentions, cc, auto- categorized bulk) from the user's authenticated Gmail connection and renders the digest as the Orbit Daily Digest email opened inside Gmail's reading view. This skill should not be triggered manually — it is invoked by Orbit's daily-digest scheduler against live Gmail data."
},
"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/orbit-gmail",
"tags": [
"example",
"first-party",
"prototype",
"orbit",
"web",
"desktop",
"gmail-briefing",
"inbox-digest",
"email-summary",
"gmail",
"untitled"
],
"compat": {
"agentSkills": [
{
"path": "./SKILL.md"
}
]
},
"od": {
"kind": "scenario",
"taskKind": "new-generation",
"mode": "prototype",
"platform": "desktop",
"scenario": "orbit",
"surface": "web",
"preview": {
"type": "html",
"entry": "./example.html"
},
"useCase": {
"query": {
"en": "Generate today's Open Orbit Gmail briefing. Gmail is my only connected connector — pull yesterday's mail and render it as the opened Orbit Daily Digest email inside Gmail's reading view.",
"zh-CN": "使用这个插件完成以下任务:Generate today's Open Orbit Gmail briefing. Gmail is my only connected connector — pull yesterday's mail and render it as the opened Orbit Daily Digest email inside Gmail's reading view."
},
"exampleOutputs": [
{
"path": "./example.html",
"title": "Orbit Gmail"
}
]
},
"context": {
"skills": [
{
"path": "./SKILL.md"
}
],
"assets": [
"./example.html"
]
},
"pipeline": {
"stages": [
{
"id": "generate",
"atoms": [
"file-write",
"live-artifact"
]
}
]
},
"capabilities": [
"prompt:inject",
"fs:write"
]
}
}