mirror of
https://github.com/iflytek/skillhub.git
synced 2026-09-25 01:04:14 +00:00
1729 lines
62 KiB
HTML
1729 lines
62 KiB
HTML
<!doctype html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<meta name="description" content="SkillHub 2026 年第 31 周开源周报:仓库状态、功能迭代、生态进展及项目健康明细。">
|
||
<title>SkillHub 开源周报|2026 年第 31 周</title>
|
||
<script>document.documentElement.classList.add('js')</script>
|
||
<style data-report-theme="notion-light">
|
||
:root {
|
||
color-scheme: light;
|
||
--page: #ffffff;
|
||
--paper: #ffffff;
|
||
--warm: #f6f5f4;
|
||
--ink: #0d0d0d;
|
||
--ink-soft: #31302e;
|
||
--muted: #615d59;
|
||
--faint: #76716c;
|
||
--line: #e5e3e1;
|
||
--line-soft: #efeeec;
|
||
--blue: #0075de;
|
||
--blue-active: #005bab;
|
||
--blue-soft: #f2f9ff;
|
||
--green: #147a33;
|
||
--green-soft: #e9f7ec;
|
||
--orange: #b84d00;
|
||
--orange-soft: #fdf0e3;
|
||
--red: #b52d25;
|
||
--red-soft: #fdecea;
|
||
--neutral-soft: #f1f0ef;
|
||
--focus: #097fe8;
|
||
--radius-sm: 8px;
|
||
--radius: 12px;
|
||
--shadow: 0 2px 8px rgb(0 0 0 / 4%);
|
||
}
|
||
|
||
* {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
html {
|
||
scroll-behavior: smooth;
|
||
}
|
||
|
||
body {
|
||
margin: 0;
|
||
background: var(--page);
|
||
color: var(--ink);
|
||
font: 15px/1.65 Inter, -apple-system, BlinkMacSystemFont, "Segoe UI",
|
||
"PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
|
||
text-rendering: optimizeLegibility;
|
||
-webkit-font-smoothing: antialiased;
|
||
}
|
||
|
||
a {
|
||
color: var(--blue);
|
||
text-decoration: none;
|
||
text-underline-offset: 3px;
|
||
}
|
||
|
||
a:hover {
|
||
color: var(--blue-active);
|
||
text-decoration: underline;
|
||
}
|
||
|
||
button,
|
||
a {
|
||
-webkit-tap-highlight-color: transparent;
|
||
}
|
||
|
||
:focus-visible {
|
||
outline: 2px solid var(--focus);
|
||
outline-offset: 3px;
|
||
}
|
||
|
||
code {
|
||
padding: 1px 4px;
|
||
border-radius: 4px;
|
||
background: var(--neutral-soft);
|
||
color: var(--ink-soft);
|
||
font-size: .92em;
|
||
}
|
||
|
||
.skip-link {
|
||
position: fixed;
|
||
z-index: 30;
|
||
top: 8px;
|
||
left: -999px;
|
||
padding: 8px 12px;
|
||
border-radius: 4px;
|
||
background: var(--ink-soft);
|
||
color: #fff;
|
||
}
|
||
|
||
.skip-link:focus {
|
||
left: 8px;
|
||
}
|
||
|
||
.report {
|
||
width: min(1200px, 100%);
|
||
min-height: 100vh;
|
||
margin: 0 auto;
|
||
background: var(--paper);
|
||
}
|
||
|
||
.masthead {
|
||
padding: 44px 28px 36px;
|
||
border-bottom: 1px solid var(--line);
|
||
}
|
||
|
||
.topline {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 18px;
|
||
margin-bottom: 26px;
|
||
}
|
||
|
||
.brand {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10px;
|
||
color: var(--ink);
|
||
}
|
||
|
||
.brand-mark {
|
||
display: inline-flex;
|
||
width: 34px;
|
||
height: 34px;
|
||
align-items: center;
|
||
justify-content: center;
|
||
border-radius: 6px;
|
||
background: var(--ink-soft);
|
||
color: #fff;
|
||
font-size: 14px;
|
||
font-weight: 700;
|
||
letter-spacing: .04em;
|
||
}
|
||
|
||
.brand-name {
|
||
font-size: 17px;
|
||
font-weight: 700;
|
||
letter-spacing: -.01em;
|
||
}
|
||
|
||
.brand-tag {
|
||
padding: 4px 10px;
|
||
border-radius: 9999px;
|
||
background: var(--neutral-soft);
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.utility-links {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 16px;
|
||
font-size: 13px;
|
||
}
|
||
|
||
h1,
|
||
h2,
|
||
h3 {
|
||
text-wrap: balance;
|
||
}
|
||
|
||
h1 {
|
||
max-width: 820px;
|
||
margin: 0;
|
||
color: var(--ink);
|
||
font-size: clamp(32px, 4vw, 44px);
|
||
line-height: 1.15;
|
||
letter-spacing: -.025em;
|
||
}
|
||
|
||
.report-sub {
|
||
margin: 8px 0 24px;
|
||
color: var(--muted);
|
||
font-size: 15px;
|
||
}
|
||
|
||
.header-grid {
|
||
display: grid;
|
||
grid-template-columns: 1.15fr .85fr;
|
||
gap: 16px;
|
||
}
|
||
|
||
.meta-card,
|
||
.headline {
|
||
border-radius: var(--radius-sm);
|
||
padding: 20px 22px;
|
||
}
|
||
|
||
.meta-card {
|
||
background: var(--warm);
|
||
}
|
||
|
||
.meta-grid {
|
||
display: grid;
|
||
grid-template-columns: 1fr 1fr;
|
||
gap: 16px 24px;
|
||
}
|
||
|
||
.meta-item .key,
|
||
.headline-label {
|
||
display: block;
|
||
margin-bottom: 4px;
|
||
color: var(--faint);
|
||
font-size: 12px;
|
||
font-weight: 500;
|
||
letter-spacing: .01em;
|
||
}
|
||
|
||
.meta-item .value {
|
||
color: var(--ink-soft);
|
||
font-size: 14px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.period {
|
||
margin: 0;
|
||
}
|
||
|
||
.headline {
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
margin: 0;
|
||
border: 0;
|
||
background: var(--orange-soft);
|
||
color: var(--ink-soft);
|
||
}
|
||
|
||
.headline-status {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10px;
|
||
margin-bottom: 7px;
|
||
}
|
||
|
||
.headline-status strong {
|
||
color: var(--orange);
|
||
font-size: 22px;
|
||
line-height: 1.2;
|
||
}
|
||
|
||
.headline p {
|
||
margin: 0;
|
||
max-width: 60ch;
|
||
}
|
||
|
||
.metrics {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: 12px;
|
||
margin-top: 18px;
|
||
border: 0;
|
||
}
|
||
|
||
.metric {
|
||
min-width: 0;
|
||
padding: 16px;
|
||
border: 0;
|
||
border-radius: var(--radius-sm);
|
||
background: var(--warm);
|
||
}
|
||
|
||
.metric strong {
|
||
display: block;
|
||
color: var(--ink);
|
||
font-size: 26px;
|
||
line-height: 1.15;
|
||
letter-spacing: -.02em;
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.metric span {
|
||
display: block;
|
||
margin-top: 4px;
|
||
color: var(--muted);
|
||
font-size: 12.5px;
|
||
}
|
||
|
||
.tabs-wrap {
|
||
position: sticky;
|
||
z-index: 20;
|
||
top: 0;
|
||
overflow-x: auto;
|
||
border-bottom: 1px solid var(--line);
|
||
background: rgb(255 255 255 / 97%);
|
||
backdrop-filter: saturate(1.1) blur(5px);
|
||
}
|
||
|
||
.tabs {
|
||
display: flex;
|
||
min-width: max-content;
|
||
padding: 0 28px;
|
||
}
|
||
|
||
.tab {
|
||
position: relative;
|
||
min-height: 48px;
|
||
padding: 0 14px;
|
||
border: 0;
|
||
background: transparent;
|
||
color: var(--muted);
|
||
cursor: pointer;
|
||
font: inherit;
|
||
font-size: 14px;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.tab::after {
|
||
position: absolute;
|
||
right: 14px;
|
||
bottom: -1px;
|
||
left: 14px;
|
||
height: 2px;
|
||
background: transparent;
|
||
content: "";
|
||
}
|
||
|
||
.tab:hover,
|
||
.tab[aria-selected="true"] {
|
||
color: var(--ink);
|
||
}
|
||
|
||
.tab[aria-selected="true"] {
|
||
font-weight: 600;
|
||
}
|
||
|
||
.tab[aria-selected="true"]::after {
|
||
background: var(--ink-soft);
|
||
}
|
||
|
||
main {
|
||
padding: 0 28px 48px;
|
||
}
|
||
|
||
.tab-panel {
|
||
padding-top: 4px;
|
||
}
|
||
|
||
.js .tab-panel[hidden] {
|
||
display: none;
|
||
}
|
||
|
||
.panel-intro {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
gap: 24px;
|
||
margin: 30px 0 0;
|
||
color: var(--muted);
|
||
font-size: 13px;
|
||
}
|
||
|
||
.panel-intro p {
|
||
margin: 0;
|
||
}
|
||
|
||
section.report-section {
|
||
margin: 0;
|
||
padding: 48px 0;
|
||
border: 0;
|
||
}
|
||
|
||
.tab-panel > section.report-section:nth-of-type(even) {
|
||
background: var(--warm);
|
||
box-shadow: 0 0 0 100vmax var(--warm);
|
||
clip-path: inset(0 -100vmax);
|
||
}
|
||
|
||
section.report-section:first-of-type {
|
||
padding-top: 42px;
|
||
}
|
||
|
||
h2 {
|
||
margin: 0 0 18px;
|
||
color: var(--ink);
|
||
font-size: 26px;
|
||
line-height: 1.25;
|
||
letter-spacing: -.02em;
|
||
}
|
||
|
||
h3 {
|
||
margin: 30px 0 12px;
|
||
color: var(--ink);
|
||
font-size: 18px;
|
||
line-height: 1.35;
|
||
letter-spacing: -.01em;
|
||
}
|
||
|
||
p {
|
||
max-width: 75ch;
|
||
text-wrap: pretty;
|
||
}
|
||
|
||
.section-lead {
|
||
margin: -7px 0 18px;
|
||
color: var(--muted);
|
||
}
|
||
|
||
.table-wrap {
|
||
overflow-x: auto;
|
||
border: 1px solid var(--line);
|
||
border-radius: var(--radius-sm);
|
||
background: var(--paper);
|
||
}
|
||
|
||
table {
|
||
width: 100%;
|
||
min-width: 680px;
|
||
border-collapse: collapse;
|
||
font-size: 13.5px;
|
||
}
|
||
|
||
caption {
|
||
padding: 10px 14px;
|
||
background: var(--warm);
|
||
color: var(--ink-soft);
|
||
font-weight: 600;
|
||
text-align: left;
|
||
}
|
||
|
||
th,
|
||
td {
|
||
padding: 10px 14px;
|
||
border-bottom: 1px solid var(--line-soft);
|
||
vertical-align: top;
|
||
text-align: left;
|
||
}
|
||
|
||
th {
|
||
background: var(--warm);
|
||
color: var(--muted);
|
||
font-size: 12.5px;
|
||
font-weight: 600;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
tbody tr:last-child td {
|
||
border-bottom: 0;
|
||
}
|
||
|
||
tbody tr:hover {
|
||
background: #faf9f8;
|
||
}
|
||
|
||
.number {
|
||
text-align: right;
|
||
white-space: nowrap;
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.status,
|
||
.value-level {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
min-width: 25px;
|
||
padding: 4px 9px;
|
||
border: 0;
|
||
border-radius: 9999px;
|
||
font-size: 12px;
|
||
font-weight: 600;
|
||
line-height: 1.2;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.status::before {
|
||
width: 6px;
|
||
height: 6px;
|
||
border-radius: 50%;
|
||
background: currentColor;
|
||
content: "";
|
||
}
|
||
|
||
.status.ok {
|
||
background: var(--green-soft);
|
||
color: var(--green);
|
||
}
|
||
|
||
.status.warn {
|
||
background: var(--orange-soft);
|
||
color: var(--orange);
|
||
}
|
||
|
||
.status.risk {
|
||
background: var(--red-soft);
|
||
color: var(--red);
|
||
}
|
||
|
||
.value-a {
|
||
background: var(--red-soft);
|
||
color: var(--red);
|
||
}
|
||
|
||
.value-b {
|
||
background: var(--orange-soft);
|
||
color: var(--orange);
|
||
}
|
||
|
||
.value-c {
|
||
background: var(--blue-soft);
|
||
color: var(--blue-active);
|
||
}
|
||
|
||
.value-d {
|
||
background: var(--neutral-soft);
|
||
color: var(--muted);
|
||
}
|
||
|
||
.risk-note {
|
||
margin: 16px 0 0;
|
||
padding: 14px 18px;
|
||
border: 0;
|
||
border-radius: var(--radius-sm);
|
||
background: var(--orange-soft);
|
||
color: var(--ink-soft);
|
||
}
|
||
|
||
.repo-visuals {
|
||
display: grid;
|
||
grid-template-columns: minmax(280px, .85fr) minmax(0, 1.15fr);
|
||
gap: 18px;
|
||
}
|
||
|
||
.snapshot-list {
|
||
display: grid;
|
||
gap: 0;
|
||
}
|
||
|
||
.snapshot-row {
|
||
display: grid;
|
||
grid-template-columns: minmax(90px, 1fr) auto;
|
||
gap: 4px 16px;
|
||
align-items: center;
|
||
padding: 13px 0;
|
||
border-bottom: 1px solid var(--line-soft);
|
||
}
|
||
|
||
.snapshot-row:first-child {
|
||
padding-top: 0;
|
||
}
|
||
|
||
.snapshot-row:last-child {
|
||
padding-bottom: 0;
|
||
border-bottom: 0;
|
||
}
|
||
|
||
.snapshot-row .snapshot-label {
|
||
color: var(--muted);
|
||
font-size: 13px;
|
||
}
|
||
|
||
.snapshot-row strong {
|
||
color: var(--ink);
|
||
font-size: 28px;
|
||
line-height: 1.05;
|
||
letter-spacing: -.02em;
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.snapshot-row .snapshot-change {
|
||
grid-column: 1 / -1;
|
||
color: var(--muted);
|
||
font-size: 12.5px;
|
||
}
|
||
|
||
.snapshot-row .snapshot-change.positive {
|
||
color: var(--green);
|
||
}
|
||
|
||
.snapshot-row .snapshot-change.missing {
|
||
color: var(--orange);
|
||
}
|
||
|
||
.chart-note {
|
||
margin: 14px 0 0;
|
||
padding-top: 12px;
|
||
border-top: 1px dashed var(--line);
|
||
color: var(--muted);
|
||
font-size: 12.5px;
|
||
}
|
||
|
||
.ecosystem-signals {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||
gap: 12px;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.ecosystem-signal {
|
||
padding: 16px 18px;
|
||
border-radius: var(--radius-sm);
|
||
background: var(--paper);
|
||
box-shadow: inset 0 0 0 1px var(--line);
|
||
}
|
||
|
||
.ecosystem-signal strong {
|
||
display: block;
|
||
color: var(--ink);
|
||
font-size: 24px;
|
||
line-height: 1.15;
|
||
letter-spacing: -.02em;
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.ecosystem-signal span {
|
||
display: block;
|
||
margin-top: 5px;
|
||
color: var(--muted);
|
||
font-size: 12.5px;
|
||
}
|
||
|
||
.ecosystem-signal-note {
|
||
grid-column: 1 / -1;
|
||
margin: -3px 0 0;
|
||
color: var(--faint);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.ecosystem-list,
|
||
.method-list {
|
||
margin: 0;
|
||
padding: 0;
|
||
border-top: 1px solid var(--line);
|
||
list-style: none;
|
||
}
|
||
|
||
.ecosystem-list li,
|
||
.method-list li {
|
||
display: grid;
|
||
grid-template-columns: 150px 1fr;
|
||
gap: 20px;
|
||
padding: 13px 0;
|
||
border-bottom: 1px solid var(--line);
|
||
}
|
||
|
||
.method-list li {
|
||
grid-template-columns: 180px 1fr;
|
||
}
|
||
|
||
.ecosystem-list strong,
|
||
.method-list strong {
|
||
color: var(--ink);
|
||
}
|
||
|
||
.next-actions {
|
||
margin: 4px 0 30px;
|
||
padding: 20px 22px;
|
||
border: 1px solid var(--line);
|
||
border-radius: var(--radius);
|
||
background: var(--paper);
|
||
}
|
||
|
||
.next-actions h2 {
|
||
margin-bottom: 8px;
|
||
font-size: 18px;
|
||
}
|
||
|
||
.next-actions ol {
|
||
margin: 0;
|
||
padding-left: 22px;
|
||
}
|
||
|
||
.next-actions li {
|
||
margin: 7px 0;
|
||
}
|
||
|
||
.health-cards {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||
gap: 16px;
|
||
}
|
||
|
||
.health-card,
|
||
.chart-box,
|
||
.health-note {
|
||
border: 1px solid var(--line);
|
||
border-radius: var(--radius);
|
||
background: var(--paper);
|
||
box-shadow: var(--shadow);
|
||
}
|
||
|
||
.health-card {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 9px;
|
||
padding: 20px 22px;
|
||
}
|
||
|
||
.health-card .top {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 10px;
|
||
}
|
||
|
||
.health-card .name {
|
||
color: var(--ink);
|
||
font-size: 15px;
|
||
font-weight: 700;
|
||
}
|
||
|
||
.health-card .health-metric {
|
||
color: var(--ink);
|
||
font-size: 27px;
|
||
font-weight: 700;
|
||
line-height: 1.1;
|
||
letter-spacing: -.02em;
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.health-card .health-metric small {
|
||
color: var(--muted);
|
||
font-size: 13px;
|
||
font-weight: 500;
|
||
letter-spacing: 0;
|
||
}
|
||
|
||
.health-card p {
|
||
margin: 0;
|
||
color: var(--ink-soft);
|
||
font-size: 13.5px;
|
||
}
|
||
|
||
.health-card .detail {
|
||
padding-top: 9px;
|
||
border-top: 1px dashed var(--line);
|
||
color: var(--muted);
|
||
font-size: 12.5px;
|
||
}
|
||
|
||
.segbar {
|
||
display: flex;
|
||
height: 24px;
|
||
overflow: hidden;
|
||
margin: 15px 0 10px;
|
||
border-radius: 6px;
|
||
background: var(--neutral-soft);
|
||
}
|
||
|
||
.segbar > span {
|
||
min-width: 2px;
|
||
height: 100%;
|
||
}
|
||
|
||
.seg-success {
|
||
background: #1aae39;
|
||
}
|
||
|
||
.seg-failure {
|
||
background: #e16259;
|
||
}
|
||
|
||
.seg-auth {
|
||
background: #e8a94b;
|
||
}
|
||
|
||
.seg-skipped {
|
||
background: #d6d2cd;
|
||
}
|
||
|
||
.seg-cancelled {
|
||
background: #8e8984;
|
||
}
|
||
|
||
.chart-legend {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 8px 20px;
|
||
color: var(--muted);
|
||
font-size: 13px;
|
||
}
|
||
|
||
.chart-legend span {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 7px;
|
||
}
|
||
|
||
.chart-legend i {
|
||
width: 10px;
|
||
height: 10px;
|
||
border-radius: 3px;
|
||
}
|
||
|
||
.chart-legend b {
|
||
color: var(--ink-soft);
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.chart-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||
gap: 18px;
|
||
}
|
||
|
||
.chart-box {
|
||
padding: 20px 22px;
|
||
}
|
||
|
||
.chart-box h3 {
|
||
margin: 0 0 14px;
|
||
font-size: 15px;
|
||
}
|
||
|
||
.bars {
|
||
display: grid;
|
||
gap: 11px;
|
||
}
|
||
|
||
.bar-row {
|
||
display: grid;
|
||
grid-template-columns: 88px 1fr 42px;
|
||
gap: 10px;
|
||
align-items: center;
|
||
font-size: 13px;
|
||
}
|
||
|
||
.repo-visuals .bar-row {
|
||
grid-template-columns: 112px 1fr 36px;
|
||
}
|
||
|
||
.bar-label {
|
||
color: var(--muted);
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.bar-track {
|
||
height: 16px;
|
||
overflow: hidden;
|
||
border-radius: 5px;
|
||
background: var(--neutral-soft);
|
||
}
|
||
|
||
.bar-fill {
|
||
display: block;
|
||
height: 100%;
|
||
min-width: 2px;
|
||
border-radius: 5px;
|
||
background: var(--blue);
|
||
}
|
||
|
||
.bar-fill.hot {
|
||
background: var(--orange);
|
||
}
|
||
|
||
.bar-value {
|
||
color: var(--ink-soft);
|
||
font-weight: 700;
|
||
text-align: right;
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.donut-layout {
|
||
display: grid;
|
||
grid-template-columns: 150px 1fr;
|
||
gap: 22px;
|
||
align-items: center;
|
||
}
|
||
|
||
.donut {
|
||
position: relative;
|
||
width: 142px;
|
||
height: 142px;
|
||
border-radius: 50%;
|
||
background: conic-gradient(var(--orange) 0 var(--value), #d6d2cd var(--value) 100%);
|
||
}
|
||
|
||
.donut::after {
|
||
position: absolute;
|
||
inset: 24px;
|
||
border-radius: 50%;
|
||
background: var(--paper);
|
||
content: "";
|
||
}
|
||
|
||
.donut-center {
|
||
position: absolute;
|
||
z-index: 1;
|
||
inset: 0;
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.donut-center strong {
|
||
color: var(--ink);
|
||
font-size: 26px;
|
||
line-height: 1.1;
|
||
}
|
||
|
||
.donut-center span {
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.donut-copy p {
|
||
margin: 0 0 9px;
|
||
color: var(--ink-soft);
|
||
font-size: 13.5px;
|
||
}
|
||
|
||
.donut-copy p:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.health-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||
gap: 18px;
|
||
margin-top: 18px;
|
||
}
|
||
|
||
.chart-box + .table-wrap {
|
||
margin-top: 18px;
|
||
}
|
||
|
||
.health-note {
|
||
padding: 18px;
|
||
}
|
||
|
||
.health-note h3 {
|
||
margin: 0 0 7px;
|
||
font-size: 15px;
|
||
}
|
||
|
||
.health-note p {
|
||
margin: 0;
|
||
color: var(--ink-soft);
|
||
}
|
||
|
||
.flow-summary {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||
gap: 12px;
|
||
margin: 18px 0 24px;
|
||
}
|
||
|
||
.flow-item {
|
||
padding: 16px 18px;
|
||
border-radius: var(--radius-sm);
|
||
background: var(--warm);
|
||
}
|
||
|
||
.flow-item strong {
|
||
display: block;
|
||
color: var(--ink);
|
||
font-size: 20px;
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
.flow-item span {
|
||
color: var(--muted);
|
||
font-size: 12.5px;
|
||
}
|
||
|
||
details {
|
||
margin-top: 16px;
|
||
border: 1px solid var(--line);
|
||
border-radius: var(--radius);
|
||
background: var(--paper);
|
||
}
|
||
|
||
summary {
|
||
padding: 14px 18px;
|
||
color: var(--ink-soft);
|
||
cursor: pointer;
|
||
font-weight: 700;
|
||
}
|
||
|
||
.details-body {
|
||
padding: 0 18px 16px;
|
||
}
|
||
|
||
footer {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
gap: 24px;
|
||
padding: 22px 28px 28px;
|
||
border-top: 1px solid var(--line);
|
||
background: var(--warm);
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.sr-only {
|
||
position: absolute;
|
||
width: 1px;
|
||
height: 1px;
|
||
padding: 0;
|
||
margin: -1px;
|
||
overflow: hidden;
|
||
clip: rect(0, 0, 0, 0);
|
||
white-space: nowrap;
|
||
border: 0;
|
||
}
|
||
|
||
@media (max-width: 760px) {
|
||
.masthead,
|
||
main,
|
||
footer {
|
||
padding-right: 18px;
|
||
padding-left: 18px;
|
||
}
|
||
|
||
.topline,
|
||
footer,
|
||
.panel-intro {
|
||
align-items: flex-start;
|
||
flex-direction: column;
|
||
gap: 8px;
|
||
}
|
||
|
||
.header-grid,
|
||
.meta-grid,
|
||
.repo-visuals,
|
||
.chart-grid,
|
||
.health-grid,
|
||
.flow-summary {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
|
||
.header-grid > *,
|
||
.meta-item {
|
||
min-width: 0;
|
||
}
|
||
|
||
.meta-item .value {
|
||
overflow-wrap: anywhere;
|
||
}
|
||
|
||
.metrics {
|
||
grid-template-columns: repeat(2, 1fr);
|
||
}
|
||
|
||
.tabs {
|
||
padding: 0 6px;
|
||
}
|
||
|
||
section.report-section {
|
||
padding: 38px 0;
|
||
}
|
||
|
||
.ecosystem-list li,
|
||
.method-list li {
|
||
grid-template-columns: 1fr;
|
||
gap: 3px;
|
||
}
|
||
|
||
.ecosystem-signals {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
|
||
.ecosystem-signal-note {
|
||
grid-column: auto;
|
||
}
|
||
|
||
.donut-layout {
|
||
grid-template-columns: 1fr;
|
||
justify-items: center;
|
||
}
|
||
|
||
.donut-copy {
|
||
text-align: center;
|
||
}
|
||
}
|
||
|
||
@media (max-width: 430px) {
|
||
h1 {
|
||
font-size: 30px;
|
||
overflow-wrap: anywhere;
|
||
}
|
||
|
||
.bar-row {
|
||
grid-template-columns: 76px 1fr 32px;
|
||
gap: 7px;
|
||
}
|
||
|
||
.repo-visuals .bar-row {
|
||
grid-template-columns: 98px 1fr 28px;
|
||
}
|
||
}
|
||
|
||
@media (prefers-reduced-motion: reduce) {
|
||
html {
|
||
scroll-behavior: auto;
|
||
}
|
||
}
|
||
|
||
@media print {
|
||
@page {
|
||
size: A4;
|
||
margin: 13mm;
|
||
}
|
||
|
||
body {
|
||
background: #fff;
|
||
font-size: 10px;
|
||
}
|
||
|
||
.report {
|
||
width: 100%;
|
||
}
|
||
|
||
.masthead,
|
||
main,
|
||
footer {
|
||
padding-right: 0;
|
||
padding-left: 0;
|
||
}
|
||
|
||
.tabs-wrap,
|
||
.skip-link,
|
||
.utility-links {
|
||
display: none !important;
|
||
}
|
||
|
||
.tab-panel[hidden] {
|
||
display: block !important;
|
||
}
|
||
|
||
.tab-panel {
|
||
break-before: page;
|
||
}
|
||
|
||
.tab-panel:first-child {
|
||
break-before: auto;
|
||
}
|
||
|
||
.tab-panel > section.report-section:nth-of-type(even) {
|
||
background: #fff;
|
||
box-shadow: none;
|
||
clip-path: none;
|
||
}
|
||
|
||
section.report-section {
|
||
padding: 16px 0;
|
||
}
|
||
|
||
h1 {
|
||
font-size: 27px;
|
||
}
|
||
|
||
h2,
|
||
h3,
|
||
tr,
|
||
.health-card,
|
||
.health-note,
|
||
.chart-box,
|
||
.next-actions {
|
||
break-inside: avoid;
|
||
}
|
||
|
||
table {
|
||
min-width: 0;
|
||
font-size: 8px;
|
||
}
|
||
|
||
th,
|
||
td {
|
||
padding: 5px 6px;
|
||
}
|
||
|
||
.health-card,
|
||
.health-note,
|
||
.chart-box {
|
||
box-shadow: none;
|
||
}
|
||
|
||
.segbar,
|
||
.bar-fill,
|
||
.donut,
|
||
.status,
|
||
.value-level,
|
||
.metric,
|
||
.headline {
|
||
print-color-adjust: exact;
|
||
-webkit-print-color-adjust: exact;
|
||
}
|
||
}
|
||
</style>
|
||
<noscript>
|
||
<style>
|
||
.tabs-wrap { display: none !important; }
|
||
.tab-panel[hidden] { display: block !important; }
|
||
</style>
|
||
</noscript>
|
||
</head>
|
||
<body>
|
||
<a class="skip-link" href="#report-content">跳到报告正文</a>
|
||
<article class="report"
|
||
data-period-start="2026-07-24T00:00:00+08:00"
|
||
data-period-end="2026-07-31T00:00:00+08:00"
|
||
data-period-boundary="[)"
|
||
data-snapshot-at="2026-07-31T14:35:33+08:00"
|
||
data-star-evidence="current-visible-arrivals"
|
||
data-star-api-status="success"
|
||
data-star-arrivals="130"
|
||
data-star-observed-at="2026-07-31T16:35:58+08:00"
|
||
data-star-start-at=""
|
||
data-star-end-at="">
|
||
<header class="masthead">
|
||
<div class="topline">
|
||
<div class="brand">
|
||
<span class="brand-mark" aria-hidden="true">SH</span>
|
||
<span class="brand-name">SkillHub</span>
|
||
<span class="brand-tag">开源周报</span>
|
||
</div>
|
||
<nav class="utility-links" aria-label="站点链接">
|
||
<a href="../../archive.html">历史周报</a>
|
||
<a href="https://iflytek.github.io/skillhub/">项目文档</a>
|
||
<a href="https://github.com/iflytek/skillhub">GitHub 仓库</a>
|
||
</nav>
|
||
</div>
|
||
<h1>2026 年第 31 周</h1>
|
||
<p class="report-sub">项目健康 · 版本交付 · 开源生态 · Issue/PR 流转与价值队列</p>
|
||
<div class="header-grid">
|
||
<div class="meta-card">
|
||
<div class="meta-grid">
|
||
<div class="meta-item">
|
||
<span class="key">统计周期</span>
|
||
<span class="value">2026-07-24 00:00—2026-07-30 23:59 · Asia/Shanghai</span>
|
||
</div>
|
||
<div class="meta-item">
|
||
<span class="key">当前状态快照</span>
|
||
<span class="value">2026-07-31 14:35(Asia/Shanghai)</span>
|
||
</div>
|
||
<div class="meta-item">
|
||
<span class="key">项目仓库</span>
|
||
<span class="value"><a href="https://github.com/iflytek/skillhub">iflytek/skillhub</a></span>
|
||
</div>
|
||
<div class="meta-item">
|
||
<span class="key">数据来源</span>
|
||
<span class="value">GitHub API(认证)· Actions · Git · npm Downloads API</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="headline">
|
||
<span class="headline-label">总体状态</span>
|
||
<div class="headline-status">
|
||
<strong>需关注</strong>
|
||
<span class="status warn">Attention</span>
|
||
</div>
|
||
<p>周期内 Actions 有效成功率为 98.2%,应用 v0.2.15 已发布、CLI 未发版;Issue 净流入 21 个,当前开放 P1 达 21 个,是主要风险。</p>
|
||
</div>
|
||
</div>
|
||
<div class="metrics" aria-label="四项核心指标">
|
||
<div class="metric"><strong>4,849</strong><span>Stars · 本期当前可见新增 130</span></div>
|
||
<div class="metric"><strong>703</strong><span>Forks · 本期当前可见创建 58</span></div>
|
||
<div class="metric"><strong>98.2%</strong><span>Actions 有效成功率 · 278/283</span></div>
|
||
<div class="metric"><strong>1 / 0</strong><span>应用 / CLI Release · 本期</span></div>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="tabs-wrap">
|
||
<nav class="tabs" role="tablist" aria-label="周报视图">
|
||
<button class="tab" id="tab-overview" type="button" role="tab" aria-selected="true"
|
||
aria-controls="panel-overview" tabindex="0" data-tab="overview">总览</button>
|
||
<button class="tab" id="tab-health" type="button" role="tab" aria-selected="false"
|
||
aria-controls="panel-health" tabindex="-1" data-tab="health">项目健康</button>
|
||
<button class="tab" id="tab-flow" type="button" role="tab" aria-selected="false"
|
||
aria-controls="panel-flow" tabindex="-1" data-tab="flow">Issue 与 PR</button>
|
||
<button class="tab" id="tab-method" type="button" role="tab" aria-selected="false"
|
||
aria-controls="panel-method" tabindex="-1" data-tab="method">数据说明</button>
|
||
</nav>
|
||
</div>
|
||
|
||
<main id="report-content">
|
||
<div class="tab-panel" id="panel-overview" role="tabpanel" tabindex="0"
|
||
aria-labelledby="tab-overview" data-panel="overview">
|
||
<div class="panel-intro">
|
||
<p>三分钟总览:只保留仓库、迭代和生态三类决策信息。</p>
|
||
<p>详细健康和维护队列请使用上方 Tab。</p>
|
||
</div>
|
||
|
||
<section class="report-section" data-module="repository-summary" aria-labelledby="repository-title">
|
||
<h2 id="repository-title">一、仓库关键信息</h2>
|
||
<div class="repo-visuals">
|
||
<div class="chart-box" data-module="repository-scale">
|
||
<h3>规模快照</h3>
|
||
<div class="snapshot-list">
|
||
<div class="snapshot-row">
|
||
<span class="snapshot-label">Stars</span>
|
||
<strong>4,849</strong>
|
||
<span class="snapshot-change positive">本期当前可见新增 130</span>
|
||
</div>
|
||
<div class="snapshot-row">
|
||
<span class="snapshot-label">Forks</span>
|
||
<strong>703</strong>
|
||
<span class="snapshot-change positive">当前可见本期创建 58</span>
|
||
</div>
|
||
</div>
|
||
<p class="chart-note">Stars 与 Forks 的本期值按认证 API 中当前仍可见、创建时间落入半开周期的记录统计;分别为 130 与 58,不代表库存净增长。</p>
|
||
</div>
|
||
<div class="chart-box" data-module="weekly-collaboration-chart">
|
||
<h3>本期协作流转</h3>
|
||
<div class="bars" role="img" aria-label="W31 协作流转:Issue 新增 24 个、关闭 3 个;PR 新增 24 个、合并 20 个、关闭未合并 6 个">
|
||
<div class="bar-row"><span class="bar-label">Issue 新增</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">24</span></div>
|
||
<div class="bar-row"><span class="bar-label">Issue 关闭</span><span class="bar-track"><span class="bar-fill" style="width:12.5%"></span></span><span class="bar-value">3</span></div>
|
||
<div class="bar-row"><span class="bar-label">PR 新增</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">24</span></div>
|
||
<div class="bar-row"><span class="bar-label">PR 合并</span><span class="bar-track"><span class="bar-fill" style="width:83.3%"></span></span><span class="bar-value">20</span></div>
|
||
<div class="bar-row"><span class="bar-label">PR 关闭未合并</span><span class="bar-track"><span class="bar-fill" style="width:25%"></span></span><span class="bar-value">6</span></div>
|
||
</div>
|
||
<p class="chart-note">周期内 Issue 净流入 21,PR 净流出 2;当前快照开放 Issue 46 个、PR 16 个。主分支新增 56 个提交,本期合并 20 个 PR。</p>
|
||
</div>
|
||
</div>
|
||
<p class="risk-note"><strong>主要风险:</strong>Issue 输入速度显著高于处置速度,当前开放 P1 21 个、<code>triage/needs-info</code> 28 个;应用 v0.2.15 已在本期发布,但 CLI 仍停留在 0.1.9。</p>
|
||
</section>
|
||
|
||
<section class="report-section" data-module="feature-iterations" aria-labelledby="feature-title">
|
||
<h2 id="feature-title">二、功能迭代信息</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption>按用户价值排序的重要事项</caption>
|
||
<thead><tr><th>状态</th><th>事项</th><th>进展与下一步</th></tr></thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><span class="status ok">已完成</span></td>
|
||
<td>部署与生产化</td>
|
||
<td><a href="https://github.com/iflytek/skillhub/pull/443">Nginx 代理信任边界</a>与 <a href="https://github.com/iflytek/skillhub/pull/445">Helm Chart 部署方案</a>在周期内合并,补齐反向代理和 Kubernetes 部署能力。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="status ok">已完成</span></td>
|
||
<td>认证、CLI 与身份核心</td>
|
||
<td>修复 <a href="https://github.com/iflytek/skillhub/pull/607">Device Auth Redis 反序列化</a>、<a href="https://github.com/iflytek/skillhub/pull/608">Namespace 坐标</a>与 <a href="https://github.com/iflytek/skillhub/pull/610">403 错误语义</a>;<a href="https://github.com/iflytek/skillhub/pull/643">统一身份核心</a>在周期内合并。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="status ok">已完成</span></td>
|
||
<td>发布与搜索一致性</td>
|
||
<td><a href="https://github.com/iflytek/skillhub/pull/601">驳回版本重传</a>和 <a href="https://github.com/iflytek/skillhub/pull/592">标签变更后重建搜索索引</a>已合并,关闭两条核心流程缺陷。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="status ok">已完成</span></td>
|
||
<td>生态与文档补全</td>
|
||
<td><a href="https://github.com/iflytek/skillhub/pull/593">社区 FAQ</a>、<a href="https://github.com/iflytek/skillhub/pull/598">HarnessClaw 指南</a>、<a href="https://github.com/iflytek/skillhub/pull/599">README Star/Watch 引导</a>与 <a href="https://github.com/iflytek/skillhub/pull/603">生态入口 #603</a>均在周期内合并。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="status ok">已完成</span></td>
|
||
<td><a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">应用 v0.2.15</a></td>
|
||
<td>7 月 30 日 16:25 发布,包含本期已合并的部署、认证、发布与搜索改动;计入 W31 应用 Release。</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="report-section" data-module="ecosystem-progress" aria-labelledby="ecosystem-title">
|
||
<h2 id="ecosystem-title">三、生态相关进展</h2>
|
||
<div class="ecosystem-signals" data-module="ecosystem-signals" role="img"
|
||
aria-label="W31 开源生态参与信号:新增 Issue 作者 2 位、新增 PR 作者 6 位、合并作者 11 位;当前可见本期创建 Fork 58 个;SkillHub CLI 在 2026 年 7 月 24 日至 30 日 UTC 日桶下载 909 次">
|
||
<div class="ecosystem-signal"><strong>2 / 6 / 11</strong><span>新增 Issue 作者 / PR 作者 / 合并作者</span></div>
|
||
<div class="ecosystem-signal"><strong>58</strong><span>当前可见本期创建 Fork</span></div>
|
||
<div class="ecosystem-signal"><strong>909</strong><span>CLI 下载 · 7 个 UTC 日桶</span></div>
|
||
<p class="ecosystem-signal-note">以上为独立参与信号,不构成转化漏斗。</p>
|
||
</div>
|
||
<ul class="ecosystem-list">
|
||
<li><strong>社区贡献</strong><span>20 个 PR 由 11 位作者完成合并,贡献覆盖部署、认证、CLI、核心流程与文档。</span></li>
|
||
<li><strong>Agent 集成</strong><span><a href="https://github.com/iflytek/skillhub/pull/598">HarnessClaw Engine 指南</a> 已合并,新增一条 Agent 生态接入路径。</span></li>
|
||
<li><strong>项目可发现性</strong><span><a href="https://github.com/iflytek/skillhub/pull/599">README Star/Watch 引导</a>与 <a href="https://github.com/iflytek/skillhub/pull/603">Trendshift、AAIF 入口</a>均在周期内落地。</span></li>
|
||
</ul>
|
||
</section>
|
||
|
||
<aside class="next-actions" data-module="next-actions" aria-labelledby="next-title">
|
||
<h2 id="next-title">下周关注</h2>
|
||
<p>以下动作延续到下一期跟踪。</p>
|
||
<ol>
|
||
<li>为 21 个开放 P1 Issue 明确负责人和处置顺序,并批量处理 28 个 <code>triage/needs-info</code> Issue。</li>
|
||
<li>优先审查 <a href="https://github.com/iflytek/skillhub/pull/623">#623</a>、<a href="https://github.com/iflytek/skillhub/pull/624">#624</a>、<a href="https://github.com/iflytek/skillhub/pull/639">#639</a> 与 <a href="https://github.com/iflytek/skillhub/pull/633">#633</a>,减少高价值开放 PR。</li>
|
||
<li>明确 CLI 发版窗口;<a href="https://github.com/iflytek/skillhub/pull/608">#608 Namespace 修复</a>已进入源码,但尚未包含在 npm CLI 0.1.9 中。</li>
|
||
</ol>
|
||
</aside>
|
||
</div>
|
||
|
||
<div class="tab-panel" id="panel-health" role="tabpanel" tabindex="0"
|
||
aria-labelledby="tab-health" data-panel="health" hidden>
|
||
<div class="panel-intro">
|
||
<p>项目健康详情:用于维护者判断工程、交付和治理风险。</p>
|
||
<p>成功流水线不等同于“无漏洞”。</p>
|
||
</div>
|
||
|
||
<section class="report-section" data-module="health-summary" aria-labelledby="health-summary-title">
|
||
<h2 id="health-summary-title">项目健康状态</h2>
|
||
<div class="health-cards">
|
||
<article class="health-card">
|
||
<div class="top"><span class="name">工程稳定性</span><span class="status ok">稳定</span></div>
|
||
<div class="health-metric">98.2% <small>278/283</small></div>
|
||
<p>有效运行中有 5 次失败。</p>
|
||
<div class="detail">PR Tests 1 次、PR E2E Tests 3 次、DeepWiki 1 次。</div>
|
||
</article>
|
||
<article class="health-card">
|
||
<div class="top"><span class="name">安全流水线</span><span class="status ok">稳定</span></div>
|
||
<div class="health-metric">69 / 69 <small>执行成功</small></div>
|
||
<p>另有 12 次等待授权、18 次条件跳过。</p>
|
||
<div class="detail">执行成功不代表公开漏洞数量为 0。</div>
|
||
</article>
|
||
<article class="health-card">
|
||
<div class="top"><span class="name">自动化运营</span><span class="status warn">需关注</span></div>
|
||
<div class="health-metric">28 / 28 <small>Backlog Rescore</small></div>
|
||
<p>Publish Images 12/12,文档部署 4/4。</p>
|
||
<div class="detail">Issue Triage 成功 36 次、条件跳过 62 次。</div>
|
||
</article>
|
||
<article class="health-card">
|
||
<div class="top"><span class="name">Release 交付</span><span class="status warn">部分达成</span></div>
|
||
<div class="health-metric">1 / 0 <small>应用 / CLI</small></div>
|
||
<p><a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">v0.2.15</a> 于本期 7 月 30 日 16:25 发布。</p>
|
||
<div class="detail">CLI 周期内及期后均无新版本,最新仍为 0.1.9。</div>
|
||
</article>
|
||
<article class="health-card">
|
||
<div class="top"><span class="name">Issue 治理</span><span class="status risk">风险</span></div>
|
||
<div class="health-metric">+21 <small>本期净流入</small></div>
|
||
<p>当前开放 46 个,其中 P1 21 个、<code>triage/needs-info</code> 28 个。</p>
|
||
<div class="detail">输入速度明显高于关闭速度,是当前首要治理风险。</div>
|
||
</article>
|
||
<article class="health-card">
|
||
<div class="top"><span class="name">PR 治理</span><span class="status ok">期内净流出</span></div>
|
||
<div class="health-metric">-2 <small>本期净流量</small></div>
|
||
<p>合并 20 个、关闭未合并 6 个,当前开放 16 个。</p>
|
||
<div class="detail">当前 30 天以上 PR 为 3 个,仍需逐项做关闭或推进决策。</div>
|
||
</article>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="report-section" data-module="workflow-execution" aria-labelledby="ci-title">
|
||
<h2 id="ci-title">CI 与自动化执行</h2>
|
||
<p class="section-lead">统计期内有 451 条 Actions 记录,其中 278 次成功、5 次失败、43 次等待授权、119 次跳过、6 次取消。</p>
|
||
<div class="chart-box" data-module="actions-outcome-chart">
|
||
<h3>Actions 结果构成</h3>
|
||
<div class="segbar" role="img" aria-label="W31 Actions 共 451 条记录:成功 278,失败 5,等待授权 43,条件跳过 119,取消 6">
|
||
<span class="seg-success" style="width:61.64%"></span>
|
||
<span class="seg-failure" style="width:1.11%"></span>
|
||
<span class="seg-auth" style="width:9.53%"></span>
|
||
<span class="seg-skipped" style="width:26.39%"></span>
|
||
<span class="seg-cancelled" style="width:1.33%"></span>
|
||
</div>
|
||
<div class="chart-legend" aria-hidden="true">
|
||
<span><i class="seg-success"></i>成功 <b>278</b></span>
|
||
<span><i class="seg-failure"></i>失败 <b>5</b></span>
|
||
<span><i class="seg-auth"></i>等待授权 <b>43</b></span>
|
||
<span><i class="seg-skipped"></i>跳过 <b>119</b></span>
|
||
<span><i class="seg-cancelled"></i>取消 <b>6</b></span>
|
||
</div>
|
||
</div>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption>工作流执行明细</caption>
|
||
<thead>
|
||
<tr><th>工作流</th><th class="number">总记录</th><th class="number">成功</th><th class="number">失败</th><th class="number">等待授权</th><th class="number">跳过/取消</th></tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr><td>PR Tests</td><td class="number">84</td><td class="number">51</td><td class="number">1</td><td class="number">12</td><td class="number">20</td></tr>
|
||
<tr><td>PR E2E Tests</td><td class="number">73</td><td class="number">36</td><td class="number">3</td><td class="number">12</td><td class="number">22</td></tr>
|
||
<tr><td>PR Scripts</td><td class="number">36</td><td class="number">30</td><td class="number">0</td><td class="number">6</td><td class="number">0</td></tr>
|
||
<tr><td>Security</td><td class="number">99</td><td class="number">69</td><td class="number">0</td><td class="number">12</td><td class="number">18</td></tr>
|
||
<tr><td>Issue Triage</td><td class="number">98</td><td class="number">36</td><td class="number">0</td><td class="number">0</td><td class="number">62</td></tr>
|
||
<tr><td>Issue Backlog Rescore</td><td class="number">28</td><td class="number">28</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
|
||
<tr><td>Publish Images</td><td class="number">12</td><td class="number">12</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
|
||
<tr><td>Deploy Docs</td><td class="number">4</td><td class="number">4</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
|
||
<tr><td>其他自动化</td><td class="number">17</td><td class="number">12</td><td class="number">1</td><td class="number">1</td><td class="number">3</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<p class="risk-note"><strong>本期薄弱点:</strong>5 次失败来自 PR Tests 1 次、PR E2E Tests 3 次和 DeepWiki 1 次;等待授权共 43 次,不计入有效成功率分母。</p>
|
||
</section>
|
||
|
||
<section class="report-section" data-module="delivery-and-backlog" aria-labelledby="delivery-title">
|
||
<h2 id="delivery-title">安全、Release 与存量健康</h2>
|
||
<div class="health-grid">
|
||
<article class="health-note">
|
||
<h3>安全与供应链</h3>
|
||
<p>Security 69 次实际执行全部成功。公开数据无法确认 Dependabot、CodeQL 未修复告警和生产扫描任务数量。</p>
|
||
</article>
|
||
<article class="health-note">
|
||
<h3>Release 交付</h3>
|
||
<p>周期内应用 Release 为 1、CLI Release 为 0;<a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.15">应用 v0.2.15</a> 于 7 月 30 日 16:25 发布。#608 的 Namespace 修复尚未进入 npm CLI 0.1.9。</p>
|
||
</article>
|
||
</div>
|
||
<h3>Issue 健康</h3>
|
||
<div class="chart-grid">
|
||
<div class="chart-box" data-module="issue-age-chart">
|
||
<h3>开放 Issue 年龄结构</h3>
|
||
<div class="bars" role="img" aria-label="W31 当前开放 Issue 46 个:不足 7 天 26 个,7 到 13 天 4 个,14 到 29 天 4 个,30 天以上 12 个">
|
||
<div class="bar-row"><span class="bar-label">< 7 天</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">26</span></div>
|
||
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:15.4%"></span></span><span class="bar-value">4</span></div>
|
||
<div class="bar-row"><span class="bar-label">14—29 天</span><span class="bar-track"><span class="bar-fill" style="width:15.4%"></span></span><span class="bar-value">4</span></div>
|
||
<div class="bar-row"><span class="bar-label">≥ 30 天</span><span class="bar-track"><span class="bar-fill hot" style="width:46.2%"></span></span><span class="bar-value">12</span></div>
|
||
</div>
|
||
<p class="chart-note">当前快照包含期后进展;短期 Issue 占比高,治理压力集中在分诊、补充信息和价值判断。</p>
|
||
</div>
|
||
<div class="chart-box" data-module="issue-needs-info-chart">
|
||
<h3><code>needs-info</code> 占比</h3>
|
||
<div class="donut-layout">
|
||
<div class="donut" style="--value:60.9%" role="img" aria-label="W31 当前开放 Issue 中,28 个带 triage/needs-info 标签,占 46 个开放 Issue 的 60.9%">
|
||
<div class="donut-center"><strong>60.9%</strong><span>28 / 46</span></div>
|
||
</div>
|
||
<div class="donut-copy">
|
||
<p><strong>28 个</strong>开放 Issue 仍需补充信息。</p>
|
||
<p>该比例是当前快照,不作为周期趋势;需要集中澄清或关闭。</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<h3>PR 健康</h3>
|
||
<div class="chart-box" data-module="pr-age-chart">
|
||
<h3>开放 PR 年龄结构</h3>
|
||
<div class="bars" role="img" aria-label="W31 当前开放 PR 16 个:不足 7 天 11 个,7 到 13 天 0 个,14 到 29 天 2 个,30 天以上 3 个">
|
||
<div class="bar-row"><span class="bar-label">< 7 天</span><span class="bar-track"><span class="bar-fill" style="width:100%"></span></span><span class="bar-value">11</span></div>
|
||
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:0%"></span></span><span class="bar-value">0</span></div>
|
||
<div class="bar-row"><span class="bar-label">14—29 天</span><span class="bar-track"><span class="bar-fill" style="width:18.2%"></span></span><span class="bar-value">2</span></div>
|
||
<div class="bar-row"><span class="bar-label">≥ 30 天</span><span class="bar-track"><span class="bar-fill hot" style="width:27.3%"></span></span><span class="bar-value">3</span></div>
|
||
</div>
|
||
<p class="chart-note">30 天以上 PR 占当前开放队列的 18.8%;该快照包含期后新增项,不用于反推本期存量变化。</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="report-section" data-module="observable-response" aria-labelledby="response-title">
|
||
<h2 id="response-title">社区响应</h2>
|
||
<p>24 个新增 Issue 中,<a href="https://github.com/iflytek/skillhub/issues/604">#604</a> 与 <a href="https://github.com/iflytek/skillhub/issues/611">#611</a> 在周期内关闭;#604—#606 已形成 #607—#610 的修复或回归。新增输入主要集中在认证、事务一致性、身份联邦和 Web 工程问题;该口径不等同于首次维护者响应 SLA。</p>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="tab-panel" id="panel-flow" role="tabpanel" tabindex="0"
|
||
aria-labelledby="tab-flow" data-panel="flow" hidden>
|
||
<div class="panel-intro">
|
||
<p>先看本周流转,再看当前高价值维护队列。</p>
|
||
<p>价值级别是人工治理判断,不替代仓库标签。</p>
|
||
</div>
|
||
|
||
<section class="report-section" data-module="weekly-flow" aria-labelledby="flow-title">
|
||
<h2 id="flow-title">本周 Issue 与 PR 流转</h2>
|
||
<div class="flow-summary">
|
||
<div class="flow-item"><strong>Issue +24 / -3</strong><span>净流入 21 · 当前快照开放 46</span></div>
|
||
<div class="flow-item"><strong>PR +24 / 合并 20</strong><span>关闭未合并 6 · 净流出 2 · 当前开放 16</span></div>
|
||
</div>
|
||
|
||
<h3>新增 Issue(按价值排序)</h3>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption class="sr-only">W31 新增 Issue 价值排序</caption>
|
||
<thead><tr><th>价值</th><th>Issue</th><th>判断</th><th>当前进展</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/604">#604 Device Auth Redis 反序列化</a> / <a href="https://github.com/iflytek/skillhub/issues/605">#605 Token 撤销后仍放行</a> / <a href="https://github.com/iflytek/skillhub/issues/606">#606 CLI Namespace 与 403 语义</a></td><td>影响 CLI 登录、凭证撤销和命名空间解析。</td><td>#604 已在周期内关闭;#607—#610 已合并,#605、#606 仍需核对关闭条件。</td></tr>
|
||
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/611">#611 删除版本残留子外键</a> / <a href="https://github.com/iflytek/skillhub/issues/612">#612 扫描任务早于事务提交</a></td><td>直接影响版本删除和发布扫描一致性。</td><td>#611 于本期关闭;#612 仍开放,需补事务后触发回归。</td></tr>
|
||
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/613">#613 并发 OAuth 绑定 500</a> / <a href="https://github.com/iflytek/skillhub/issues/614">#614 旧 Session 阻断公开 API</a></td><td>影响登录与公开技能访问。</td><td>当前仍开放,需覆盖并发约束和失效会话回归。</td></tr>
|
||
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/615">#615 审核审计部分成功</a> / <a href="https://github.com/iflytek/skillhub/issues/617">#617 首次发布坐标竞争</a></td><td>可能造成客户端认知与服务端状态不一致。</td><td>当前仍开放,优先处理幂等与事务一致性。</td></tr>
|
||
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/616">#616 MVC 客户端错误返回 500</a> / <a href="https://github.com/iflytek/skillhub/issues/618">#618 Web 类型隔离</a></td><td>分别影响 API 错误语义和前端构建稳定性。</td><td>#618 已有开放 PR #619;#616 仍待实现。</td></tr>
|
||
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/620">#620 审核进度</a> / <a href="https://github.com/iflytek/skillhub/issues/621">#621 主题持久化</a> / <a href="https://github.com/iflytek/skillhub/issues/622">#622 通知轮询</a></td><td>均有用户体验价值,但实现范围与优先级不同。</td><td>仍处于议题阶段,应先拆验收标准再排期。</td></tr>
|
||
<tr><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/issues/628">#628 身份联邦架构</a> / <a href="https://github.com/iflytek/skillhub/issues/629">#629 外部身份可信属性</a> / <a href="https://github.com/iflytek/skillhub/issues/634">#634 禁用旧账户合并</a> / <a href="https://github.com/iflytek/skillhub/issues/640">#640 身份核心</a></td><td>集中影响外部身份信任、账户接管风险和统一身份边界。</td><td>#640 已形成并合并 #643;其余事项继续按迁移与安全门禁推进。</td></tr>
|
||
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/626">#626</a> / <a href="https://github.com/iflytek/skillhub/issues/627">#627 部署 Smoke Test</a></td><td>影响持久环境和受限 Ingress 下的发布验证。</td><td>需将环境假设改为显式配置,并保留可观察失败。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>新增、合并与关闭 PR</h3>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption class="sr-only">W31 关键 PR 流转</caption>
|
||
<thead><tr><th>类型</th><th>价值</th><th>PR</th><th>结果与判断</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>新增并合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/607">#607 Device Auth</a> / <a href="https://github.com/iflytek/skillhub/pull/608">#608 CLI Namespace</a> / <a href="https://github.com/iflytek/skillhub/pull/609">#609 Token 回归</a> / <a href="https://github.com/iflytek/skillhub/pull/610">#610 403 语义</a></td><td>4 个新增 PR 均已合并,快速处理认证与 CLI 缺陷。</td></tr>
|
||
<tr><td>本期合并</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/599">#599 README 引导</a> / <a href="https://github.com/iflytek/skillhub/pull/601">#601 驳回版本重传</a></td><td>两项在 W30 创建,本期完成项目可发现性与发布一致性交付。</td></tr>
|
||
<tr><td>新增待审</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/623">#623 OAuth 回跳</a> / <a href="https://github.com/iflytek/skillhub/pull/624">#624 React 19 Portal 崩溃</a></td><td>直接影响登录回跳和 Web 稳定性,建议优先完成回归。</td></tr>
|
||
<tr><td>新增待审</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/619">#619 Web 类型隔离</a></td><td>回应 #618,当前仍开放,需先确认构建环境隔离边界。</td></tr>
|
||
<tr><td>新增并合并</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/603">#603 生态入口</a></td><td>7 月 24 日创建、7 月 30 日合并,计入本期新增与合并。</td></tr>
|
||
<tr><td>新增并合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/643">#643 身份核心</a> / <a href="https://github.com/iflytek/skillhub/pull/641">#641 版本依赖删除</a> / <a href="https://github.com/iflytek/skillhub/pull/648">#648 身份门禁</a> / <a href="https://github.com/iflytek/skillhub/pull/649">#649 Binding V2</a></td><td>7 月 30 日完成身份核心、治理安全和迁移护栏交付。</td></tr>
|
||
<tr><td>本期合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/443">#443</a> / <a href="https://github.com/iflytek/skillhub/pull/445">#445</a> / <a href="https://github.com/iflytek/skillhub/pull/480">#480</a> / <a href="https://github.com/iflytek/skillhub/pull/560">#560</a></td><td>部署与认证:Nginx、Helm、OAuth Provider 与登录页恢复。</td></tr>
|
||
<tr><td>本期合并</td><td><span class="value-level value-a">A</span></td><td><a href="https://github.com/iflytek/skillhub/pull/592">#592 搜索索引重建</a></td><td>核心流程:标签变更后异步重建搜索索引。</td></tr>
|
||
<tr><td>本期合并</td><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/pull/593">#593</a> / <a href="https://github.com/iflytek/skillhub/pull/598">#598</a></td><td>生态与文档:FAQ 与 HarnessClaw 指南。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="report-section" data-module="priority-queue" aria-labelledby="priority-title">
|
||
<h2 id="priority-title">当前高价值维护队列</h2>
|
||
<p class="section-lead">以下为 2026-07-31 14:35 快照,只列需要明确决策的 A/B 项;价值分级是维护治理判断,不替代仓库现有 P1/P2 标签。</p>
|
||
|
||
<h3>Issue:A 级优先处理</h3>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption class="sr-only">A 级开放 Issue</caption>
|
||
<thead><tr><th>Issue</th><th>价值判断</th><th>建议动作</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/634">#634 禁用不安全的旧账户合并流程</a></td><td>涉及潜在账户接管风险,已有替代实现 #639。</td><td>完成安全回归和迁移兼容审查后优先合并。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/605">#605 Token 撤销后部分 API 仍放行</a></td><td>认证安全语义不一致,且 Issue 在回归测试合并后仍开放。</td><td>确认失败用例覆盖 whoami/search,完成实现后关闭。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/612">#612 扫描任务与发布事务竞争</a></td><td>可能使合法发布因任务提前执行而失败。</td><td>将异步启动约束到事务提交后,并补稳定回归。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/615">#615 审核状态与审计不一致</a></td><td>服务端已提交状态却向客户端返回失败。</td><td>统一事务边界,避免部分成功和重复操作。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/617">#617 首次发布坐标并发竞争</a></td><td>影响同坐标并发发布的幂等与错误语义。</td><td>增加数据库约束映射与并发回归测试。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>Issue:B 级需设计或严格审查</h3>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption class="sr-only">B 级开放 Issue</caption>
|
||
<thead><tr><th>Issue</th><th>建议动作</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/613">#613 并发 OAuth 绑定 500</a></td><td>围绕唯一约束和重试边界设计并发回归。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/614">#614 旧 Session 阻断公开 API</a></td><td>明确 permitAll 路由的失效会话处理语义。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/628">#628 统一身份联邦架构</a></td><td>将 #630、#631、#633 作为一个设计批次集中审查。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/640">#640 身份核心与 Provider 权限锁</a></td><td>先收敛与 #628 的边界,再决定实现拆分与兼容策略。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/620">#620 审核进度与重提历史</a></td><td>先定义作者可见字段与审核隐私边界。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/issues/622">#622 通知由 SSE 改为轮询</a></td><td>先用代理兼容性和资源成本数据验证替换必要性。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>PR:A 级优先推进</h3>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption class="sr-only">A 级开放 PR</caption>
|
||
<thead><tr><th>PR</th><th>价值判断</th><th>建议动作</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/pull/639">#639 隔离不安全账户合并流程</a></td><td>回应高风险认证 Issue #634,并替代已关闭的 #637。</td><td>优先核对账户接管回归、兼容路径和失败语义。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/pull/623">#623 保留 OAuth 回跳目标</a></td><td>直接影响认证后用户流程连续性。</td><td>验证多 Provider、非法目标和默认回跳后优先合并。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/pull/624">#624 修复 React 19 Portal 崩溃</a></td><td>解决用户可见的 removeChild/insertBefore 崩溃。</td><td>补弹窗开关和路由切换场景 E2E 后合并。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/pull/631">#631 外部身份可信属性</a></td><td>决定外部身份是否可安全触发用户配置。</td><td>与 #630 设计文档同步审查信任来源和降级路径。</td></tr>
|
||
<tr><td><a href="https://github.com/iflytek/skillhub/pull/633">#633 审批后配置 global membership</a></td><td>影响新用户审批后的基础授权可用性。</td><td>验证重试幂等、已有成员和审批回滚场景。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<details data-module="cleanup-queue">
|
||
<summary>展开:本周关闭未合并的 PR</summary>
|
||
<div class="details-body">
|
||
<p>长期 PR <a href="https://github.com/iflytek/skillhub/pull/442">#442</a>、<a href="https://github.com/iflytek/skillhub/pull/457">#457</a>、<a href="https://github.com/iflytek/skillhub/pull/460">#460</a>,以及本期新增后被替代的 <a href="https://github.com/iflytek/skillhub/pull/637">#637</a>、<a href="https://github.com/iflytek/skillhub/pull/638">#638</a>、<a href="https://github.com/iflytek/skillhub/pull/642">#642</a> 在周期内关闭且未合并。配合 20 个合并 PR,本期 PR 净流出 2 个;当前开放 16 个。</p>
|
||
</div>
|
||
</details>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="tab-panel" id="panel-method" role="tabpanel" tabindex="0"
|
||
aria-labelledby="tab-method" data-panel="method" hidden>
|
||
<div class="panel-intro">
|
||
<p>这里说明时间边界、数据来源与缺失项。</p>
|
||
<p>缺失数据均标为“未取得”,不替换为 0。</p>
|
||
</div>
|
||
|
||
<section class="report-section" data-module="metric-definitions" aria-labelledby="method-title">
|
||
<h2 id="method-title">统计口径</h2>
|
||
<ul class="method-list">
|
||
<li><strong>统计周期</strong><span>展示为 2026-07-24 00:00—2026-07-30 23:59,Asia/Shanghai;程序过滤采用等价半开区间 <code>[2026-07-24 00:00, 2026-07-31 00:00)</code>,对应 UTC 为 7 月 23 日 16:00 至 7 月 30 日 16:00。</span></li>
|
||
<li><strong>当前快照</strong><span>2026-07-31 14:35;开放队列、Fork 累计数及年龄结构取该时点。Star 总量与新增证据更新于 16:35;周期结束后的变化不计入本期流量。</span></li>
|
||
<li><strong>周期衔接</strong><span>W30 的排他截止与 W31 起始均为 7 月 24 日 00:00,相邻报告无重叠;周四 23:59 后的事件进入下一期。</span></li>
|
||
<li><strong>Star 证据</strong><span>7 月 31 日 16:35 的当前 Stars 为 4,849;130 表示同次认证 API 查询中,<code>starred_at</code> 落入本期且当前仍可见的 Stargazer。完整分页数量与仓库总数均为 4,849;该值不是周期净增长,也不能替代起止库存快照。</span></li>
|
||
<li><strong>Fork 证据</strong><span>当前 Forks 为 703;58 表示当前列表中创建时间落在本期的可见记录,不代表 Fork 库存净增长。</span></li>
|
||
<li><strong>Actions 成功率</strong><span><code>success / (success + failure)</code>;等待授权、条件跳过和取消不进入分母。</span></li>
|
||
<li><strong>Issue / PR</strong><span>GitHub Issues API 会同时返回 PR,本报告分开统计;价值 A—D 为人工治理判断。</span></li>
|
||
<li><strong>Release</strong><span>周期内应用 Release 为 1、CLI Release 为 0;应用 v0.2.15 于 7 月 30 日 16:25 发布,计入本期。</span></li>
|
||
<li><strong>npm 下载</strong><span>909 次覆盖 2026-07-24—2026-07-30 的 UTC 日桶,与 Asia/Shanghai 半开周期不完全对齐,因此仅作为带覆盖范围的生态观察,不称为完整周总量。</span></li>
|
||
<li><strong>推广数据</strong><span>文章、直播、社区分享和合作项目由维护者补录;本期未提供,因而不展示推广模块,也不记为 0。</span></li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section class="report-section" data-module="source-coverage" aria-labelledby="source-title">
|
||
<h2 id="source-title">数据来源与限制</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<caption>来源覆盖</caption>
|
||
<thead><tr><th>来源</th><th>用途</th><th>限制</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>GitHub API(认证)</td><td>仓库、Issue、PR、Release、Actions、Fork、Stargazer <code>starred_at</code></td><td>没有周期起止两份库存快照;当前可见新增不等于净增长。</td></tr>
|
||
<tr><td>Git 标签与提交历史</td><td>主分支提交、合并与 Release 时间核对</td><td>v0.2.15 计入本期;CLI 仍以 npm 0.1.9 为最新版本。</td></tr>
|
||
<tr><td>npm Downloads API</td><td><code>@astron-team/skillhub</code> 的 7 个 UTC 日桶</td><td>909 次下载不等同于独立用户,且覆盖范围与本报告时区边界不完全对齐。</td></tr>
|
||
<tr><td>维护者人工判断</td><td>价值排序、推广动作和产品边界</td><td>推广动作尚未提供。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<p class="risk-note"><strong>未取得:</strong>GitHub Traffic、Referrers、W31 起止两份可比 Star/Fork 库存快照、私有安全告警,以及生产 SkillHub 实例的可用率、延迟、Skill 数量和扫描成功率。</p>
|
||
</section>
|
||
</div>
|
||
</main>
|
||
|
||
<footer>
|
||
<span>SkillHub Open Source Weekly · 2026-W31</span>
|
||
<span>公开报告 · 周四结报 · 维护者治理视图</span>
|
||
</footer>
|
||
</article>
|
||
|
||
<script>
|
||
(function () {
|
||
var tabs = Array.prototype.slice.call(document.querySelectorAll('[role="tab"]'));
|
||
var panels = Array.prototype.slice.call(document.querySelectorAll('[role="tabpanel"]'));
|
||
|
||
function activate(name, moveFocus, updateHash) {
|
||
var nextTab = tabs.find(function (tab) { return tab.dataset.tab === name; }) || tabs[0];
|
||
tabs.forEach(function (tab) {
|
||
var selected = tab === nextTab;
|
||
tab.setAttribute('aria-selected', selected ? 'true' : 'false');
|
||
tab.tabIndex = selected ? 0 : -1;
|
||
});
|
||
panels.forEach(function (panel) {
|
||
panel.hidden = panel.dataset.panel !== nextTab.dataset.tab;
|
||
});
|
||
if (moveFocus) nextTab.focus();
|
||
if (updateHash && history.replaceState) {
|
||
history.replaceState(null, '', '#' + nextTab.dataset.tab);
|
||
}
|
||
}
|
||
|
||
tabs.forEach(function (tab, index) {
|
||
tab.addEventListener('click', function () {
|
||
activate(tab.dataset.tab, false, true);
|
||
});
|
||
tab.addEventListener('keydown', function (event) {
|
||
var nextIndex = index;
|
||
if (event.key === 'ArrowRight') nextIndex = (index + 1) % tabs.length;
|
||
else if (event.key === 'ArrowLeft') nextIndex = (index - 1 + tabs.length) % tabs.length;
|
||
else if (event.key === 'Home') nextIndex = 0;
|
||
else if (event.key === 'End') nextIndex = tabs.length - 1;
|
||
else return;
|
||
event.preventDefault();
|
||
activate(tabs[nextIndex].dataset.tab, true, true);
|
||
});
|
||
});
|
||
|
||
window.addEventListener('hashchange', function () {
|
||
activate(location.hash.replace('#', ''), false, false);
|
||
});
|
||
activate(location.hash.replace('#', ''), false, false);
|
||
}());
|
||
</script>
|
||
</body>
|
||
</html>
|