chore: import zh skill orbit-github
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
# WeHub 来源说明
|
||||
|
||||
- Skill 名称:`orbit-github`
|
||||
- 中文类目:24h 工具/工作区每日简报
|
||||
- 上游仓库:`nexu-io__open-design`
|
||||
- 上游路径:`plugins/_official/examples/orbit-github/SKILL.md`
|
||||
- 上游链接:https://github.com/nexu-io/open-design/blob/HEAD/plugins/_official/examples/orbit-github/SKILL.md
|
||||
- 本仓库为 WeHub 中文 Skill 汉化包,基于 skill 市场筛选 Top200 清单整理
|
||||
- 原作者、版权和许可证信息以上游仓库为准
|
||||
@@ -0,0 +1,146 @@
|
||||
---
|
||||
name: orbit-github
|
||||
description: |
|
||||
Open Orbit 简报技能 — 当 GitHub 是用户唯一已连接的连接器,或当用户
|
||||
明确将每日摘要限定在 GitHub 范围内时,由 Orbit 管道选中。从用户的
|
||||
已认证 GitHub 连接中拉取过去 24 小时的 PR、审查请求、Issue、CI 运行
|
||||
与合并记录,并以镜像 GitHub 原生「通知 + PR 差异」视觉语言的布局
|
||||
进行呈现。此技能不应手动触发——由 Orbit 的每日摘要调度器基于实时
|
||||
GitHub 数据调用。
|
||||
triggers:
|
||||
- "github briefing"
|
||||
- "github digest"
|
||||
- "pr digest"
|
||||
- "github 简报"
|
||||
- "代码活动汇总"
|
||||
od:
|
||||
mode: prototype
|
||||
platform: desktop
|
||||
scenario: orbit
|
||||
featured: 2
|
||||
preview:
|
||||
type: html
|
||||
entry: index.html
|
||||
design_system:
|
||||
requires: false
|
||||
example_prompt: "Generate today's Open Orbit GitHub briefing. GitHub is my only connected connector — pull yesterday's PRs, review requests, issues, CI runs, and merges and render them as a GitHub Notifications + PR-diff page."
|
||||
---
|
||||
|
||||
# Orbit · GitHub 简报
|
||||
|
||||
限定于 GitHub 的单连接器 Orbit 模板。
|
||||
|
||||
## ⚠️ 真实来源协议(请先阅读此部分)
|
||||
|
||||
**步骤 1.** 在编写任何输出之前,先打开并阅读此文件夹中附带的 `example.html`。
|
||||
该文件是规范设计——你的任务是**复现它**,而非重新诠释。
|
||||
|
||||
**步骤 2.** 一比一镜像示例的结构:
|
||||
- 相同的 DOM 层级结构与类名
|
||||
- 相同的导航栏项目(且仅有这些)
|
||||
- 相同的左侧筛选列表(且仅有这些)
|
||||
- 相同的事件分组,顺序相同,行数相同
|
||||
- 相同的差异预览位置、相同的 CI 失败块、相同的关注块
|
||||
- 末尾相同的 `<script>` 块(筛选/悬停/链接注入)
|
||||
|
||||
**步骤 3.** 你可以刷新模拟值(PR 编号、标题、时间、CI 提交消息)使其读起来像是"今天",但你**不得**凭空添加额外的 UI:不得新增侧栏条目、通知、事件类型、徽章或装饰元素。如果 `example.html` 中尚未存在的内容,就不应出现在你的输出中。
|
||||
|
||||
以下各节是**令牌与视觉语言的参考**——而非扩展页面的许可。
|
||||
|
||||
## ⚠️ 设计系统策略
|
||||
|
||||
此技能自带**完整**的视觉语言(GitHub 的 Primer 外观),内置于 `example.html` 中。用户**不得**被要求选择或附加设计系统,你**不得**将任何外部的 DESIGN.md 令牌注入输出中。
|
||||
|
||||
- 如果当前项目附加了设计系统,**忽略它**。
|
||||
- 如果用户提供了品牌令牌或 Figma 文件,**忽略它们**。
|
||||
- 仅使用 `example.html` 中定义的颜色/字体/圆角值。
|
||||
|
||||
这是一个硬性约束:简报必须读起来像一个真实的 GitHub 页面,而非用户的品牌页面。
|
||||
|
||||
## 画布令牌(使用以下精确值)
|
||||
|
||||
```
|
||||
页面背景: #f6f8fa
|
||||
卡片背景: #ffffff
|
||||
导航栏: #24292f /* GitHub 黑色头部 */
|
||||
导航文字: #ffffff
|
||||
正文色: #1f2328
|
||||
浅色文字: #59636e
|
||||
边框色: #d0d7de
|
||||
细分割线: rgba(208,215,222,0.32)
|
||||
|
||||
状态 · 打开: #1a7f37
|
||||
状态 · 已合并: #8250df
|
||||
状态 · 已关闭: #cf222e
|
||||
状态 · 草稿: #6e7781
|
||||
|
||||
关注背景: #fff8c5 /* 黄色审查请求块 */
|
||||
关注边框: #d4a72c
|
||||
CI 失败背景: #ffebe9
|
||||
CI 失败边框: #cf222e
|
||||
```
|
||||
|
||||
字体栈:
|
||||
- `-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif`
|
||||
- 字号:导航 14px,标题 16/20px,正文 14px,元信息 12px
|
||||
|
||||
## 页面章节
|
||||
|
||||
1. **顶部导航栏** — 全宽,深色(`#24292f`),高 60px。
|
||||
左侧:Octocat SVG 标志(白色,32px)+ 搜索输入框
|
||||
(背景 `rgba(255,255,255,0.08)`,白色占位文字半透明)。
|
||||
右侧:`+` 下拉菜单、通知铃铛(若未读数 > 0 显示红点)、圆形头像。
|
||||
|
||||
2. **标题行** — 导航栏下方的浅色条,高 56px。
|
||||
左侧:页面面包屑 `Inbox · Daily Digest · May 6`。
|
||||
右侧:筛选下拉芯片(`Type ▾ Date ▾ Status ▾`)。
|
||||
|
||||
3. **双栏主区域**:
|
||||
- **左侧栏**(240px):垂直筛选列表。项目:
|
||||
`Inbox · Saved · Done · All` 之后是分隔线,然后是
|
||||
`Participating · Mentions · Review requests · Assigned · Comments`。
|
||||
当前活动项:浅灰色药丸背景。
|
||||
- **主面板**(flex 1):按类别分组的事件流。
|
||||
|
||||
4. **主面板中的类别分组**(按此顺序):
|
||||
- **等待你处理的审查请求** — 黄色关注块
|
||||
(背景 `#fff8c5`,1px 边框 `#d4a72c`)。每行:头像 + 仓库路径
|
||||
+ PR 标题 + 审阅者状态小圆点行
|
||||
(✓ 绿色 / ⏳ 黄色 / ○ 灰色)+ "X of Y 位审阅者" + 时长。
|
||||
- **CI / 检查** — 每次失败运行均为红色边框卡片
|
||||
(边框色 `#cf222e`,背景 `#ffebe9`),带有红色 `✗` 符号、
|
||||
运行名称、分支名称(等宽字体)、提交消息、时长。
|
||||
- **分配给你的 Issue** — 普通行,状态圆圈(打开绿色/已关闭红色)、
|
||||
标题、仓库路径、时长、标签药丸。
|
||||
- **活动** — 较安静的行,用于合并/关闭操作;浅色文字、
|
||||
小型 `merged` 紫色药丸或 `closed` 红色药丸。
|
||||
|
||||
5. **可选的 PR 差异预览** — 在某条 PR 行下方内联展示
|
||||
2–3 行模拟代码,使用 12px 等宽代码块,带红色 `−` /
|
||||
绿色 `+` 前缀行,以及 `#ffebe9` / `#dafbe1` 行背景色。
|
||||
|
||||
6. **页脚** — 单行,12px 浅色文字:
|
||||
`Open Orbit · auto-generated 06:42 · GitHub only`。
|
||||
|
||||
## 药丸/芯片规则
|
||||
|
||||
- 状态药丸:药丸形状(border-radius 2em),12px 中等字重,4×8 内边距。
|
||||
前景白色,背景使用上述状态颜色。
|
||||
- 标签(`bug`、`p1`、`frontend` 等):GitHub 标签圆形药丸,每个
|
||||
标签使用各自任意的颜色。使用多样化的真实世界标签色调。
|
||||
- 审阅者圆点:8px 实心圆,2px 间距,仅在你能保持视觉
|
||||
细腻的情况下使用 `✓ ⏳ ○` 字形。
|
||||
|
||||
## 实现约束(配对:不要做 / 要做)
|
||||
|
||||
| 不要做 | 要做 |
|
||||
|---|---|
|
||||
| 混合浅色与深色主题 | 保持在浅色 Primer 主题上(`#f6f8fa` 页面背景,`#ffffff` 卡片) |
|
||||
| 使用非 GitHub 字体 | 仅使用 `-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif` |
|
||||
| 将头像渲染为方形或圆角方形 | 始终为圆形,审阅者重叠 `≤ 6px` |
|
||||
| 在装饰元素上使用阴影/渐变/发光效果 | 使用平面表面;通过 `#d0d7de` 1px 边框区分 |
|
||||
| 使用 Lorem Ipsum | 编写真实的 GitHub 文案:PR 标题如 `feat: orbit briefing card`,分支如 `chore/upgrade-deps`,提交主题不超过 72 个字符 |
|
||||
| 将 CI 失败渲染为普通行 | 包裹在红色边框卡片中(`#cf222e` 边框,`#ffebe9` 背景),带红色 `✗` 符号和运行名称 |
|
||||
| 将审查请求渲染为普通行 | 放在黄色关注块中(`#fff8c5` 背景,`#d4a72c` 边框),带审阅者状态圆点行 |
|
||||
| 使用占位仓库名称如 `org/repo` | 使用 `nexu-io/open-design`(该组织实际的主仓库) |
|
||||
| 随意选取标签颜色 | 使用真实的开发团队色调——`bug` 红色,`enhancement` 蓝色,`documentation` 浅蓝色,`frontend` 紫色 |
|
||||
+770
@@ -0,0 +1,770 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head><script>(function(){
|
||||
function makeStore(){
|
||||
var data = {};
|
||||
var api = {
|
||||
getItem: function(k){ return Object.prototype.hasOwnProperty.call(data, k) ? data[k] : null; },
|
||||
setItem: function(k, v){ data[k] = String(v); },
|
||||
removeItem: function(k){ delete data[k]; },
|
||||
clear: function(){ data = {}; },
|
||||
key: function(i){ return Object.keys(data)[i] || null; }
|
||||
};
|
||||
Object.defineProperty(api, 'length', { get: function(){ return Object.keys(data).length; } });
|
||||
return api;
|
||||
}
|
||||
function tryShim(name){
|
||||
var works = false;
|
||||
try { works = !!window[name] && typeof window[name].getItem === 'function'; void window[name].length; }
|
||||
catch (_) { works = false; }
|
||||
if (works) return;
|
||||
try { Object.defineProperty(window, name, { configurable: true, value: makeStore() }); }
|
||||
catch (_) { try { window[name] = makeStore(); } catch (__) {} }
|
||||
}
|
||||
tryShim('localStorage');
|
||||
tryShim('sessionStorage');
|
||||
})();</script>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Orbit · GitHub 简报 — 2026-05-06</title>
|
||||
<style>
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
color: #1f2328;
|
||||
background: #f6f8fa;
|
||||
}
|
||||
|
||||
/* ── GitHub Top Nav ── */
|
||||
.gh-header {
|
||||
background: #24292f;
|
||||
height: 48px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 16px;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
}
|
||||
.gh-header svg { fill: #ffffff; }
|
||||
.gh-header-logo { flex-shrink: 0; }
|
||||
.gh-header-logo svg { width: 32px; height: 32px; }
|
||||
.gh-header-logo svg:hover { fill: rgba(255,255,255,0.7); }
|
||||
|
||||
.gh-header-search {
|
||||
margin-left: 16px;
|
||||
flex: 1;
|
||||
max-width: 540px;
|
||||
}
|
||||
.gh-header-search input {
|
||||
width: 100%;
|
||||
background: rgba(255,255,255,0.08);
|
||||
border: 1px solid rgba(255,255,255,0.2);
|
||||
border-radius: 6px;
|
||||
padding: 5px 12px;
|
||||
font-size: 14px;
|
||||
color: #ffffff;
|
||||
outline: none;
|
||||
font-family: inherit;
|
||||
}
|
||||
.gh-header-search input::placeholder { color: rgba(255,255,255,0.4); }
|
||||
.gh-header-search input:focus {
|
||||
background: rgba(255,255,255,0.12);
|
||||
border-color: rgba(255,255,255,0.4);
|
||||
}
|
||||
.gh-header-search-slash {
|
||||
position: absolute;
|
||||
right: 8px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
border: 1px solid rgba(255,255,255,0.2);
|
||||
border-radius: 4px;
|
||||
padding: 0 5px;
|
||||
font-size: 11px;
|
||||
color: rgba(255,255,255,0.4);
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
.gh-header-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-left: auto;
|
||||
}
|
||||
.gh-avatar-header {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
background: linear-gradient(135deg, #6366f1, #8b5cf6);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
color: #ffffff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* ── Page Layout ── */
|
||||
.page-container {
|
||||
max-width: 1280px;
|
||||
margin: 0 auto;
|
||||
padding: 24px 32px;
|
||||
display: flex;
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
/* ── Left Sidebar Nav ── */
|
||||
.sidebar {
|
||||
width: 256px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.sidebar-nav {
|
||||
list-style: none;
|
||||
}
|
||||
.sidebar-nav li button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
color: #1f2328;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
font-family: inherit;
|
||||
background: none;
|
||||
border: none;
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
text-align: left;
|
||||
}
|
||||
.sidebar-nav li button:hover {
|
||||
background: rgba(208,215,222,0.32);
|
||||
}
|
||||
.sidebar-nav li button.active {
|
||||
background: rgba(208,215,222,0.48);
|
||||
font-weight: 600;
|
||||
}
|
||||
.sidebar-nav li button svg {
|
||||
fill: #656d76;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.sidebar-nav li button.active svg { fill: #1f2328; }
|
||||
.sidebar-count {
|
||||
margin-left: auto;
|
||||
background: rgba(208,215,222,0.48);
|
||||
padding: 0 6px;
|
||||
border-radius: 9999px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: #1f2328;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
/* ── Main Content ── */
|
||||
.main-content {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
/* ── Section Groups ── */
|
||||
.event-group {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.event-group-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 8px 16px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
border: 1px solid #d0d7de;
|
||||
border-radius: 6px 6px 0 0;
|
||||
background: #f6f8fa;
|
||||
}
|
||||
.event-group-header.warning {
|
||||
background: #fff8c5;
|
||||
border-color: #d4a72c;
|
||||
}
|
||||
.event-group-header.ci-fail {
|
||||
background: #ffebe9;
|
||||
border-color: #cf222e;
|
||||
}
|
||||
.event-group-header .count {
|
||||
background: rgba(208,215,222,0.48);
|
||||
padding: 0 6px;
|
||||
border-radius: 9999px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
line-height: 20px;
|
||||
}
|
||||
.event-group-header.warning .count {
|
||||
background: rgba(154,103,0,0.12);
|
||||
color: #9a6700;
|
||||
}
|
||||
.event-group-header.ci-fail .count {
|
||||
background: rgba(207,34,46,0.12);
|
||||
color: #cf222e;
|
||||
}
|
||||
|
||||
/* ── Event Rows ── */
|
||||
.event-list {
|
||||
border: 1px solid #d0d7de;
|
||||
border-top: none;
|
||||
border-radius: 0 0 6px 6px;
|
||||
background: #ffffff;
|
||||
}
|
||||
.event-row {
|
||||
padding: 12px 16px;
|
||||
border-bottom: 1px solid #d0d7de;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 12px;
|
||||
}
|
||||
.event-row:last-child { border-bottom: none; }
|
||||
|
||||
.event-icon {
|
||||
flex-shrink: 0;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-top: 3px;
|
||||
}
|
||||
.event-icon svg { width: 16px; height: 16px; }
|
||||
|
||||
.event-body {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.event-title-line {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
flex-wrap: wrap;
|
||||
gap: 4px;
|
||||
font-size: 14px;
|
||||
}
|
||||
.event-repo {
|
||||
color: #656d76;
|
||||
font-weight: 400;
|
||||
}
|
||||
.event-sep { color: #656d76; }
|
||||
.event-pr-label {
|
||||
color: #656d76;
|
||||
}
|
||||
.event-title-text {
|
||||
font-weight: 600;
|
||||
color: #1f2328;
|
||||
}
|
||||
.event-title-text a {
|
||||
color: #0969da;
|
||||
text-decoration: none;
|
||||
}
|
||||
.event-title-text a:hover { text-decoration: underline; }
|
||||
.event-timestamp {
|
||||
margin-left: auto;
|
||||
color: #656d76;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.event-meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
margin-top: 4px;
|
||||
font-size: 12px;
|
||||
color: #656d76;
|
||||
}
|
||||
|
||||
/* ── Status Pills ── */
|
||||
.pill {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 2px 8px;
|
||||
border-radius: 9999px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
line-height: 18px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.pill-open { background: #1a7f37; color: #ffffff; }
|
||||
.pill-merged { background: #8250df; color: #ffffff; }
|
||||
.pill-closed { background: #cf222e; color: #ffffff; }
|
||||
.pill-draft { background: #6e7781; color: #ffffff; }
|
||||
.pill svg { width: 12px; height: 12px; fill: currentColor; }
|
||||
|
||||
/* ── Labels ── */
|
||||
.gh-label {
|
||||
display: inline-block;
|
||||
padding: 0 7px;
|
||||
border-radius: 9999px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
line-height: 20px;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
.label-backend { background: #ddf4ff; color: #0550ae; border-color: rgba(5,80,174,0.2); }
|
||||
.label-p1 { background: #ffebe9; color: #a40e26; border-color: rgba(164,14,38,0.2); }
|
||||
|
||||
/* ── Reviewer Avatars ── */
|
||||
.reviewer-stack {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0;
|
||||
}
|
||||
.reviewer-avatar {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
border: 2px solid #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 9px;
|
||||
font-weight: 600;
|
||||
color: #ffffff;
|
||||
margin-left: -4px;
|
||||
position: relative;
|
||||
}
|
||||
.reviewer-avatar:first-child { margin-left: 0; }
|
||||
|
||||
.reviewer-status {
|
||||
position: absolute;
|
||||
bottom: -2px;
|
||||
right: -2px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
border: 1.5px solid #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.reviewer-status.approved { background: #1a7f37; }
|
||||
.reviewer-status.pending { background: #bf8700; }
|
||||
.reviewer-status.none { background: #d0d7de; }
|
||||
.reviewer-status svg { width: 6px; height: 6px; fill: #ffffff; }
|
||||
|
||||
/* ── Diff Preview ── */
|
||||
.diff-preview {
|
||||
margin-top: 8px;
|
||||
border: 1px solid #d0d7de;
|
||||
border-radius: 6px;
|
||||
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.diff-header {
|
||||
background: #f6f8fa;
|
||||
padding: 4px 12px;
|
||||
color: #656d76;
|
||||
font-size: 12px;
|
||||
border-bottom: 1px solid #d0d7de;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
.diff-header svg { width: 12px; height: 12px; fill: #656d76; }
|
||||
.diff-line {
|
||||
padding: 0 12px;
|
||||
white-space: pre;
|
||||
}
|
||||
.diff-line.add {
|
||||
background: #dafbe1;
|
||||
color: #116329;
|
||||
}
|
||||
.diff-line.remove {
|
||||
background: #ffebe9;
|
||||
color: #82071e;
|
||||
}
|
||||
.diff-line.context {
|
||||
background: #ffffff;
|
||||
color: #656d76;
|
||||
}
|
||||
.diff-line-number {
|
||||
display: inline-block;
|
||||
width: 32px;
|
||||
text-align: right;
|
||||
color: rgba(31,35,40,0.3);
|
||||
user-select: none;
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
/* ── CI Fail Card ── */
|
||||
.ci-fail-card .event-row {
|
||||
border-left: 3px solid #cf222e;
|
||||
}
|
||||
|
||||
/* ── Conversation Indicator ── */
|
||||
.convo-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 2px 8px;
|
||||
border-radius: 9999px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
background: #fff8c5;
|
||||
color: #9a6700;
|
||||
}
|
||||
.convo-badge svg { width: 12px; height: 12px; fill: currentColor; }
|
||||
|
||||
/* ── Footer ── */
|
||||
.orbit-footer {
|
||||
text-align: center;
|
||||
padding: 24px 16px 32px;
|
||||
font-size: 12px;
|
||||
color: #656d76;
|
||||
}
|
||||
.orbit-footer strong {
|
||||
color: #1f2328;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* ── Responsive ── */
|
||||
@media (max-width: 768px) {
|
||||
.page-container {
|
||||
flex-direction: column;
|
||||
padding: 16px;
|
||||
}
|
||||
.sidebar { width: 100%; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- ════════ GitHub Header ════════ -->
|
||||
<header class="gh-header">
|
||||
<!-- Octocat Logo -->
|
||||
<a class="gh-header-logo" href="#">
|
||||
<svg viewBox="0 0 16 16" width="32" height="32">
|
||||
<path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"/>
|
||||
</svg>
|
||||
</a>
|
||||
|
||||
<!-- Search -->
|
||||
<div class="gh-header-search" style="position:relative;">
|
||||
<input type="text" placeholder="输入 / 搜索" />
|
||||
<span class="gh-header-search-slash">/</span>
|
||||
</div>
|
||||
|
||||
<!-- Action buttons -->
|
||||
<div class="gh-header-actions">
|
||||
<div class="gh-avatar-header">E</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- ════════ Page ════════ -->
|
||||
<div class="page-container">
|
||||
|
||||
<!-- ── Sidebar ── -->
|
||||
<nav class="sidebar" data-od-id="sidebar">
|
||||
<ul class="sidebar-nav" id="sidebarNav">
|
||||
<li>
|
||||
<button class="active" data-filter="all">
|
||||
<svg viewBox="0 0 16 16"><path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25V2.75C0 1.784.784 1 1.75 1ZM1.5 2.75v10.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"/></svg>
|
||||
全部
|
||||
<span class="sidebar-count">5</span>
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
<button data-filter="participating">
|
||||
<svg viewBox="0 0 16 16"><path d="M1.5 14.25c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25v12.5ZM0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm9.22 3.72a.749.749 0 0 1 1.06 0l3.5 3.5a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L10 7.31 7.28 10.03a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734Z"/></svg>
|
||||
我参与的
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
<button data-filter="mentions">
|
||||
<svg viewBox="0 0 16 16"><path d="M4.75 7.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm3.25.75a.75.75 0 1 1 1.5 0 .75.75 0 0 1-1.5 0Zm4 0a.75.75 0 1 1 1.5 0 .75.75 0 0 1-1.5 0Z"/><path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25Zm1.75-.25a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25Z"/></svg>
|
||||
@提及我的
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
<button data-filter="reviews">
|
||||
<svg viewBox="0 0 16 16"><path d="M3.5 9.5a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm5-1a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"/></svg>
|
||||
待审查
|
||||
<span class="sidebar-count">2</span>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<!-- ── Main Content ── -->
|
||||
<main class="main-content" data-od-id="main-content">
|
||||
|
||||
<!-- ═══ Review Requests ═══ -->
|
||||
<div class="event-group" data-od-id="review-requests" data-category="reviews">
|
||||
<div class="event-group-header warning">
|
||||
<svg viewBox="0 0 16 16" width="16" height="16" fill="#9a6700"><path d="M8 2c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6 2.69-6 6-6Zm.25 3a.75.75 0 0 0-1.5 0v3c0 .199.079.39.22.53l2 2a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L8.25 7.69Z"/></svg>
|
||||
等待你的审查请求
|
||||
<span class="count">2</span>
|
||||
</div>
|
||||
<div class="event-list">
|
||||
|
||||
<!-- PR #2371 -->
|
||||
<div class="event-row">
|
||||
<div class="event-icon">
|
||||
<svg viewBox="0 0 16 16" fill="#1a7f37"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"/></svg>
|
||||
</div>
|
||||
<div class="event-body">
|
||||
<div class="event-title-line">
|
||||
<span class="event-repo">open-design/web</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="event-pr-label">PR #2371</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="pill pill-open">
|
||||
<svg viewBox="0 0 16 16"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354Z"/></svg>
|
||||
打开
|
||||
</span>
|
||||
<span class="event-title-text"><a href="#">feat: orbit briefing card</a></span>
|
||||
<span class="event-timestamp">marie 2 天前创建</span>
|
||||
</div>
|
||||
<div class="event-meta">
|
||||
<!-- Reviewer Avatars -->
|
||||
<div class="reviewer-stack">
|
||||
<div class="reviewer-avatar" style="background:#2da44e;" title="alex — 已批准">A
|
||||
<span class="reviewer-status approved"><svg viewBox="0 0 16 16"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"/></svg></span>
|
||||
</div>
|
||||
<div class="reviewer-avatar" style="background:#0969da;" title="sam — 已批准">S
|
||||
<span class="reviewer-status approved"><svg viewBox="0 0 16 16"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"/></svg></span>
|
||||
</div>
|
||||
<div class="reviewer-avatar" style="background:#cf222e;" title="jess — 已批准">J
|
||||
<span class="reviewer-status approved"><svg viewBox="0 0 16 16"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"/></svg></span>
|
||||
</div>
|
||||
<div class="reviewer-avatar" style="background:#8250df;" title="eli — 待审">E
|
||||
<span class="reviewer-status pending"></span>
|
||||
</div>
|
||||
<div class="reviewer-avatar" style="background:#bf3989;" title="cody — 待审">C
|
||||
<span class="reviewer-status pending"></span>
|
||||
</div>
|
||||
</div>
|
||||
<span style="color:#656d76;">✓ 5 位审查者中已有 3 位批准 · 等待 <strong style="color:#1f2328;">你</strong> + <strong style="color:#1f2328;">cody</strong></span>
|
||||
</div>
|
||||
|
||||
<!-- Diff Preview -->
|
||||
<div class="diff-preview">
|
||||
<div class="diff-header">
|
||||
<svg viewBox="0 0 16 16"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914Z"/></svg>
|
||||
src/components/OrbitBriefingCard.tsx
|
||||
</div>
|
||||
<div class="diff-line context"><span class="diff-line-number">42</span> return (</div>
|
||||
<div class="diff-line remove"><span class="diff-line-number">43</span>- <div className="briefing-legacy"></div>
|
||||
<div class="diff-line add"><span class="diff-line-number">43</span>+ <Card variant="orbit" density="compact"></div>
|
||||
<div class="diff-line add"><span class="diff-line-number">44</span>+ <BriefingHeader provider={provider} /></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PR #2389 -->
|
||||
<div class="event-row">
|
||||
<div class="event-icon">
|
||||
<svg viewBox="0 0 16 16" fill="#1a7f37"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"/></svg>
|
||||
</div>
|
||||
<div class="event-body">
|
||||
<div class="event-title-line">
|
||||
<span class="event-repo">open-design/web</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="event-pr-label">PR #2389</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="pill pill-open">
|
||||
<svg viewBox="0 0 16 16"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354Z"/></svg>
|
||||
打开
|
||||
</span>
|
||||
<span class="event-title-text"><a href="#">refactor: skill loader</a></span>
|
||||
<span class="event-timestamp">1 天前</span>
|
||||
</div>
|
||||
<div class="event-meta">
|
||||
<span class="convo-badge">
|
||||
<svg viewBox="0 0 16 16"><path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/></svg>
|
||||
对话需要你回复
|
||||
</span>
|
||||
<span style="color:#656d76;">@cody 提出了一个问题</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ═══ CI / Checks ═══ -->
|
||||
<div class="event-group ci-fail-card" data-od-id="ci-checks" data-category="ci">
|
||||
<div class="event-group-header ci-fail">
|
||||
<svg viewBox="0 0 16 16" width="16" height="16" fill="#cf222e"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm9.78-2.22-5.5 5.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l5.5-5.5a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"/></svg>
|
||||
CI / 检查
|
||||
<span class="count">1</span>
|
||||
</div>
|
||||
<div class="event-list">
|
||||
<div class="event-row">
|
||||
<div class="event-icon">
|
||||
<svg viewBox="0 0 16 16" fill="#cf222e"><path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"/></svg>
|
||||
</div>
|
||||
<div class="event-body">
|
||||
<div class="event-title-line">
|
||||
<span class="event-repo">open-design/web</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span style="color:#1f2328;font-weight:600;">main</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span style="color:#cf222e;font-weight:600;">✗ test (e2e) 失败</span>
|
||||
<span class="event-timestamp">2 小时前</span>
|
||||
</div>
|
||||
<div class="event-meta">
|
||||
<svg viewBox="0 0 16 16" width="12" height="12" fill="#656d76"><path d="M11.93 8.5a4.002 4.002 0 0 1-7.86 0H.75a.75.75 0 0 1 0-1.5h3.32a4.002 4.002 0 0 1 7.86 0h3.32a.75.75 0 0 1 0 1.5Zm-1.43-.25a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z"/></svg>
|
||||
<span>最近提交:<code style="font-family:ui-monospace,SFMono-Regular,'SF Mono',Menlo,Consolas,monospace;background:#f6f8fa;border:1px solid #d0d7de;padding:1px 5px;border-radius:4px;font-size:0.85em;">chore(deps): bump cheerio to 1.0.2</code></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ═══ Issues assigned to you ═══ -->
|
||||
<div class="event-group" data-od-id="issues" data-category="issues" data-mentions>
|
||||
<div class="event-group-header">
|
||||
<svg viewBox="0 0 16 16" width="16" height="16" fill="#1a7f37"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"/></svg>
|
||||
分配给你的 Issue
|
||||
<span class="count">1</span>
|
||||
</div>
|
||||
<div class="event-list">
|
||||
<div class="event-row">
|
||||
<div class="event-icon">
|
||||
<svg viewBox="0 0 16 16" fill="#1a7f37"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"/></svg>
|
||||
</div>
|
||||
<div class="event-body">
|
||||
<div class="event-title-line">
|
||||
<span class="event-repo">open-design/web</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="event-pr-label">ENG-148</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="pill pill-open">
|
||||
<svg viewBox="0 0 16 16"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"/></svg>
|
||||
打开
|
||||
</span>
|
||||
<span class="event-title-text"><a href="#">Auth middleware refactor</a></span>
|
||||
<span class="event-timestamp">5 天无活动</span>
|
||||
</div>
|
||||
<div class="event-meta">
|
||||
<span class="gh-label label-backend">backend</span>
|
||||
<span class="gh-label label-p1">p1</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ═══ Activity ═══ -->
|
||||
<div class="event-group" data-od-id="activity" data-category="activity">
|
||||
<div class="event-group-header">
|
||||
<svg viewBox="0 0 16 16" width="16" height="16" fill="#656d76"><path d="M11.93 8.5a4.002 4.002 0 0 1-7.86 0H.75a.75.75 0 0 1 0-1.5h3.32a4.002 4.002 0 0 1 7.86 0h3.32a.75.75 0 0 1 0 1.5Zm-1.43-.25a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z"/></svg>
|
||||
活动
|
||||
<span class="count">1</span>
|
||||
</div>
|
||||
<div class="event-list">
|
||||
<div class="event-row">
|
||||
<div class="event-icon">
|
||||
<svg viewBox="0 0 16 16" fill="#8250df"><path d="M5.45 5.154A4.25 4.25 0 0 0 9.25 7.5h1.378a2.251 2.251 0 1 1 0 1.5H9.25A5.734 5.734 0 0 1 5 7.123v3.505a2.25 2.25 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.95-.218ZM4.25 13.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm8.5-4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM5 3.25a.75.75 0 1 0 0 .005V3.25Z"/></svg>
|
||||
</div>
|
||||
<div class="event-body">
|
||||
<div class="event-title-line">
|
||||
<span class="event-repo">open-design/web</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="event-pr-label">PR #2401</span>
|
||||
<span class="event-sep">·</span>
|
||||
<span class="pill pill-merged">
|
||||
<svg viewBox="0 0 16 16"><path d="M5.45 5.154A4.25 4.25 0 0 0 9.25 7.5h1.378a2.251 2.251 0 1 1 0 1.5H9.25A5.734 5.734 0 0 1 5 7.123v3.505a2.25 2.25 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.95-.218ZM4.25 13.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm8.5-4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM5 3.25a.75.75 0 1 0 0 .005V3.25Z"/></svg>
|
||||
已合并
|
||||
</span>
|
||||
<span class="event-title-text"><strong>bob</strong> 已合并到 main</span>
|
||||
<span class="event-timestamp">18 小时前</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- ════════ Footer ════════ -->
|
||||
<footer class="orbit-footer">
|
||||
<strong>Open Orbit</strong> · 自动生成于 06:42 · 2026-05-06
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
var nav = document.getElementById('sidebarNav');
|
||||
var groups = document.querySelectorAll('.event-group');
|
||||
|
||||
nav.addEventListener('click', function(e) {
|
||||
var btn = e.target.closest('button');
|
||||
if (!btn) return;
|
||||
|
||||
// Toggle active
|
||||
nav.querySelectorAll('button').forEach(function(b) { b.classList.remove('active'); });
|
||||
btn.classList.add('active');
|
||||
|
||||
var filter = btn.getAttribute('data-filter');
|
||||
|
||||
groups.forEach(function(g) {
|
||||
if (filter === 'all') {
|
||||
g.style.display = '';
|
||||
} else if (filter === 'participating') {
|
||||
// User participates in reviews + issues assigned
|
||||
g.style.display = (g.hasAttribute('data-category') &&
|
||||
(g.dataset.category === 'reviews' || g.dataset.category === 'issues')) ? '' : 'none';
|
||||
} else if (filter === 'mentions') {
|
||||
g.style.display = g.hasAttribute('data-mentions') ? '' : 'none';
|
||||
} else if (filter === 'reviews') {
|
||||
g.style.display = g.dataset.category === 'reviews' ? '' : 'none';
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Row hover highlight + click-to-open-on-GitHub
|
||||
const REPO = 'https://github.com/nexu-io/open-design';
|
||||
function buildUrl(label) {
|
||||
const t = (label || '').trim();
|
||||
const prMatch = t.match(/PR\s*#(\d+)/i);
|
||||
if (prMatch) return REPO + '/pull/' + prMatch[1];
|
||||
const issueIdMatch = t.match(/^[A-Z]+-(\d+)/);
|
||||
if (issueIdMatch) return REPO + '/issues?q=' + encodeURIComponent(t);
|
||||
const hashMatch = t.match(/#(\d+)/);
|
||||
if (hashMatch) return REPO + '/issues/' + hashMatch[1];
|
||||
return REPO;
|
||||
}
|
||||
document.querySelectorAll('.event-row').forEach(function(row) {
|
||||
const label = row.querySelector('.event-pr-label')?.textContent;
|
||||
const url = buildUrl(label);
|
||||
row.style.cursor = 'pointer';
|
||||
row.style.transition = 'background 80ms ease-out';
|
||||
row.addEventListener('mouseenter', function() { row.style.background = '#f6f8fa'; });
|
||||
row.addEventListener('mouseleave', function() { row.style.background = ''; });
|
||||
row.addEventListener('click', function(e) {
|
||||
// Don't override clicks on inner real anchors
|
||||
if (e.target.closest('a')) return;
|
||||
window.open(url, '_blank', 'noopener,noreferrer');
|
||||
});
|
||||
// Upgrade the title placeholder anchor to a real URL
|
||||
const titleAnchor = row.querySelector('.event-title-text a');
|
||||
if (titleAnchor) {
|
||||
titleAnchor.href = url;
|
||||
titleAnchor.target = '_blank';
|
||||
titleAnchor.rel = 'noopener noreferrer';
|
||||
}
|
||||
});
|
||||
// Top logo also points to the repo
|
||||
const headerLogo = document.querySelector('.gh-header-logo');
|
||||
if (headerLogo) {
|
||||
headerLogo.href = REPO;
|
||||
headerLogo.target = '_blank';
|
||||
headerLogo.rel = 'noopener noreferrer';
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"$schema": "https://open-design.ai/schemas/plugin.v1.json",
|
||||
"specVersion": "1.0.0",
|
||||
"name": "example-orbit-github",
|
||||
"title": "Orbit Github",
|
||||
"title_i18n": {
|
||||
"zh-CN": "Orbit Github",
|
||||
"zh-TW": "Orbit Github",
|
||||
"ja": "Orbit Github",
|
||||
"ko": "Orbit Github",
|
||||
"de": "Orbit Github",
|
||||
"fr": "Orbit Github",
|
||||
"ru": "Orbit Github",
|
||||
"es": "Orbit Github",
|
||||
"pt-BR": "Orbit Github",
|
||||
"it": "Orbit Github",
|
||||
"vi": "Orbit Github",
|
||||
"pl": "Orbit Github",
|
||||
"id": "Orbit Github",
|
||||
"nl": "Orbit Github",
|
||||
"ar": "Orbit Github",
|
||||
"tr": "Orbit Github",
|
||||
"uk": "Orbit Github",
|
||||
"en": "Orbit Github"
|
||||
},
|
||||
"version": "0.1.0",
|
||||
"description": "Open Orbit briefing skill — selected by the Orbit pipeline when\nGitHub is the user's only connected connector, or when the user\nexplicitly scopes their daily digest to GitHub. Pulls the past 24\nhours of PRs, review requests, issues, CI runs, and merges from the\nuser's authenticated GitHub connection and renders them in a layout\nthat mirrors GitHub's native Notifications + PR-diff visual language.\nThis skill should not be triggered manually — it is invoked by\nOrbit's daily-digest scheduler against live GitHub data.",
|
||||
"description_i18n": {
|
||||
"zh-CN": "根据 GitHub 连接器自动生成每日摘要的 Orbit 技能。拉取过去 24 小时的 PR、审查请求、问题、CI 运行和合并记录,以类似 GitHub 原生通知的布局呈现。由 Orbit 每日摘要调度器自动调用。",
|
||||
"zh-TW": "根據 GitHub 連接器自動生成每日摘要的 Orbit 技能。拉取過去 24 小時的 PR、審查請求、問題、CI 運行和合併記錄,以類似 GitHub 原生通知的佈局呈現。由 Orbit 每日摘要調度器自動調用。",
|
||||
"ja": "GitHub コネクタに基づいて毎日のダイジェストを自動生成する Orbit スキル。過去 24 時間の PR、レビューリクエスト、Issue、CI 実行、マージを取得し、GitHub ネイティブ通知風のレイアウトで表示します。Orbit の毎日ダイジェストスケジューラーによって自動起動されます。",
|
||||
"ko": "GitHub 커넥터를 기반으로 일일 요약을 자동 생성하는 Orbit 스킬입니다. 지난 24시간의 PR, 리뷰 요청, 이슈, CI 실행, 병합 내역을 가져와 GitHub 네이티브 알림 스타일로 표시합니다. Orbit 일일 요약 스케줄러에 의해 자동 호출됩니다.",
|
||||
"de": "Orbit-Skill zur automatischen Erstellung täglicher Zusammenfassungen basierend auf GitHub-Verbindungen. Ruft PRs, Review-Anfragen, Issues, CI-Läufe und Merges der letzten 24 Stunden ab und zeigt sie im GitHub-nativen Benachrichtigungsstil an. Wird automatisch vom Orbit Daily-Digest-Scheduler aufgerufen.",
|
||||
"fr": "Compétence Orbit pour générer automatiquement des résumés quotidiens basés sur les connexions GitHub. Récupère les PR, demandes de révision, issues, exécutions CI et fusions des dernières 24 heures et les affiche dans un style de notification natif GitHub. Invoqué automatiquement par le planificateur de résumé quotidien Orbit.",
|
||||
"ru": "Навык Orbit для автоматического создания ежедневных сводок на основе подключений GitHub. Извлекает PR, запросы на проверку, задачи, запуски CI и слияния за последние 24 часа и отображает их в стиле нативных уведомлений GitHub. Автоматически вызывается планировщиком ежедневных сводок Orbit.",
|
||||
"es": "Habilidad de Orbit para generar automáticamente resúmenes diarios basados en conexiones de GitHub. Recupera PRs, solicitudes de revisión, issues, ejecuciones de CI y merges de las últimas 24 horas y los muestra en el estilo de notificaciones nativo de GitHub. Invocado automáticamente por el programador de resumen diario de Orbit.",
|
||||
"pt-BR": "Habilidade Orbit para gerar automaticamente resumos diários baseados em conexões GitHub. Recupera PRs, solicitações de revisão, issues, execuções de CI e merges das últimas 24 horas e os exibe no estilo de notificações nativo do GitHub. Invocado automaticamente pelo agendador de resumo diário do Orbit.",
|
||||
"it": "Skill Orbit per generare automaticamente riepiloghi giornalieri basati su connessioni GitHub. Recupera PR, richieste di revisione, issue, esecuzioni CI e merge delle ultime 24 ore e li visualizza nello stile delle notifiche native di GitHub. Invocato automaticamente dallo scheduler di riepilogo giornaliero di Orbit.",
|
||||
"vi": "Kỹ năng Orbit tự động tạo bản tóm tắt hàng ngày dựa trên kết nối GitHub. Lấy các PR, yêu cầu đánh giá, vấn đề, chạy CI và merge trong 24 giờ qua, hiển thị theo phong cách thông báo gốc của GitHub. Được gọi tự động bởi bộ lập lịch tóm tắt hàng ngày của Orbit.",
|
||||
"pl": "Umiejętność Orbit do automatycznego generowania codziennych podsumowań na podstawie połączeń GitHub. Pobiera PR-y, żądania przeglądu, zgłoszenia, uruchomienia CI i scalenia z ostatnich 24 godzin i wyświetla je w stylu natywnych powiadomień GitHub. Wywoływane automatycznie przez harmonogram codziennego podsumowania Orbit.",
|
||||
"id": "Keterampilan Orbit untuk menghasilkan ringkasan harian otomatis berdasarkan koneksi GitHub. Mengambil PR, permintaan tinjauan, masalah, eksekusi CI, dan penggabungan 24 jam terakhir dan menampilkannya dalam gaya notifikasi asli GitHub. Dipanggil secara otomatis oleh penjadwal ringkasan harian Orbit.",
|
||||
"nl": "Orbit-vaardigheid voor het automatisch genereren van dagelijkse samenvattingen op basis van GitHub-verbindingen. Haalt PR's, beoordelingsverzoeken, issues, CI-runs en merges van de afgelopen 24 uur op en toont ze in de stijl van native GitHub-notificaties. Wordt automatisch aangeroepen door de Orbit dagelijkse samenvattingsplanner.",
|
||||
"ar": "مهارة Orbit لإنشاء ملخصات يومية تلقائية بناءً على اتصالات GitHub. تسترد طلبات السحب ومراجعات الكود والمشكلات وعمليات CI والدمج من آخر 24 ساعة وتعرضها بأسلوب إشعارات GitHub الأصلي. يتم استدعاؤها تلقائيًا بواسطة مجدول الملخص اليومي في Orbit.",
|
||||
"tr": "GitHub bağlantılarına dayalı günlük özetleri otomatik olarak oluşturan Orbit becerisi. Son 24 saatteki PR'ları, inceleme isteklerini, sorunları, CI çalıştırmalarını ve birleştirmeleri alır ve GitHub'ın yerel bildirim stilinde görüntüler. Orbit günlük özet zamanlayıcısı tarafından otomatik olarak çağrılır.",
|
||||
"uk": "Навичка Orbit для автоматичного створення щоденних зведень на основі підключень GitHub. Отримує PR, запити на перевірку, завдання, запуски CI та злиття за останні 24 години та відображає їх у стилі нативних сповіщень GitHub. Автоматично викликається планувальником щоденних зведень Orbit.",
|
||||
"en": "Open Orbit briefing skill — selected by the Orbit pipeline when\nGitHub is the user's only connected connector, or when the user\nexplicitly scopes their daily digest to GitHub. Pulls the past 24\nhours of PRs, review requests, issues, CI runs, and merges from the\nuser's authenticated GitHub connection and renders them in a layout\nthat mirrors GitHub's native Notifications + PR-diff visual language.\nThis skill should not be triggered manually — it is invoked by\nOrbit's daily-digest scheduler against live GitHub 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-github",
|
||||
"tags": [
|
||||
"example",
|
||||
"first-party",
|
||||
"prototype",
|
||||
"orbit",
|
||||
"web",
|
||||
"desktop",
|
||||
"github-briefing",
|
||||
"github-digest",
|
||||
"pr-digest",
|
||||
"github",
|
||||
"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 GitHub briefing. GitHub is my only connected connector — pull yesterday's PRs, review requests, issues, CI runs, and merges and render them as a GitHub Notifications + PR-diff page.",
|
||||
"zh-CN": "使用这个插件完成以下任务:Generate today's Open Orbit GitHub briefing. GitHub is my only connected connector — pull yesterday's PRs, review requests, issues, CI runs, and merges and render them as a GitHub Notifications + PR-diff page."
|
||||
},
|
||||
"exampleOutputs": [
|
||||
{
|
||||
"path": "./example.html",
|
||||
"title": "Orbit Github"
|
||||
}
|
||||
]
|
||||
},
|
||||
"context": {
|
||||
"skills": [
|
||||
{
|
||||
"path": "./SKILL.md"
|
||||
}
|
||||
],
|
||||
"assets": [
|
||||
"./example.html"
|
||||
]
|
||||
},
|
||||
"pipeline": {
|
||||
"stages": [
|
||||
{
|
||||
"id": "generate",
|
||||
"atoms": [
|
||||
"file-write",
|
||||
"live-artifact"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"capabilities": [
|
||||
"prompt:inject",
|
||||
"fs:write"
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user