skillhub/weekly/site/reports/2026-W29/index.html
XiaoSeS b0b8993ca3 fix(docs): align weekly reports to Thursday close
Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>
2026-07-31 17:15:00 +08:00

1724 lines
55 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 年第 29 周开源周报:仓库状态、功能迭代、生态进展及项目健康明细。">
<title>SkillHub 开源周报|2026 年第 29 周</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-10T00:00:00+08:00"
data-period-end="2026-07-17T00:00:00+08:00"
data-period-boundary="[)"
data-snapshot-at="2026-07-23T22:00:00+08:00"
data-star-evidence="current-visible-arrivals"
data-star-api-status="success"
data-star-arrivals="109"
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 年第 29 周</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-10 00:00—2026-07-16 23:59 · Asia/Shanghai</span>
</div>
<div class="meta-item">
<span class="key">当前状态快照</span>
<span class="value">2026-07-23 22:00(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 有 3 次失败且周度 Release 未完成;长期 Issue/PR 积压仍是主要治理风险。</p>
</div>
</div>
<div class="metrics" aria-label="四项核心指标">
<div class="metric"><strong>4,823</strong><span>Stars · 本期当前可见新增 109</span></div>
<div class="metric"><strong>652</strong><span>Forks · 本期当前可见创建 181</span></div>
<div class="metric"><strong>94.2%</strong><span>Actions 有效成功率 · 49/52</span></div>
<div class="metric"><strong>0 / 0</strong><span>应用 / CLI Release · W29</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,823</strong>
<span class="snapshot-change positive">本期当前可见新增 109</span>
</div>
<div class="snapshot-row">
<span class="snapshot-label">Forks</span>
<strong>652</strong>
<span class="snapshot-change positive">本期当前可见创建 181</span>
</div>
</div>
<p class="chart-note">Stars 与 Forks 的本期值按认证 API 中当前仍可见、创建时间落入半开周期的记录统计;分别为 109 与 181,不代表库存净增长。</p>
</div>
<div class="chart-box" data-module="weekly-collaboration-chart">
<h3>本周协作流转</h3>
<div class="bars" role="img" aria-label="W29 协作流转:Issue 新增 5 个、关闭 3 个;PR 新增 2 个、合并 0 个、关闭未合并 0 个">
<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">5</span></div>
<div class="bar-row"><span class="bar-label">Issue 关闭</span><span class="bar-track"><span class="bar-fill" style="width:60%"></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:40%"></span></span><span class="bar-value">2</span></div>
<div class="bar-row"><span class="bar-label">PR 合并</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">PR 关闭未合并</span><span class="bar-track"><span class="bar-fill" style="width:0%"></span></span><span class="bar-value">0</span></div>
</div>
<p class="chart-note">Issue 净增 2、PR 净增 2;7 月 23 日快照开放 Issue 21 个、PR 19 个。主分支新增 3 个提交,本期未合并 PR。</p>
</div>
</div>
<p class="risk-note"><strong>主要风险:</strong>开放 Issue 和 PR 中分别有 52.4% 与 52.6% 已超过 30 天,存量治理弱于新增需求识别。</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><a href="https://github.com/iflytek/skillhub/pull/529">PR #529 双语社区 FAQ</a></td>
<td>7 月 17 日合并并部署,沉淀常见部署与使用问题;不计入 W29 合并量。</td>
</tr>
<tr>
<td><span class="status warn">推进中</span></td>
<td><a href="https://github.com/iflytek/skillhub/issues/580">#580</a> / <a href="https://github.com/iflytek/skillhub/pull/581">PR #581 namespace 可见性</a></td>
<td>修复 SUPER_ADMIN 读取边界;需收敛范围并完成门禁。</td>
</tr>
<tr>
<td><span class="status ok">期后完成</span></td>
<td><a href="https://github.com/iflytek/skillhub/issues/582">#582</a> / <a href="https://github.com/iflytek/skillhub/pull/584">PR #584 Hermes 集成</a></td>
<td>7 月 22 日合并并关闭 Issue,不计入 W29 交付量。</td>
</tr>
<tr>
<td><span class="status ok">期后完成</span></td>
<td><a href="https://github.com/iflytek/skillhub/pull/585">PR #585 CLI 通用安装目标</a></td>
<td>随 <a href="https://github.com/iflytek/skillhub/releases/tag/cli-v0.1.9">cli-v0.1.9</a> 发布,不计入 W29 交付量。</td>
</tr>
<tr>
<td><span class="status warn">待设计</span></td>
<td><a href="https://github.com/iflytek/skillhub/issues/579">#579 来源证明、签名与 SBOM</a></td>
<td>方向符合企业 Registry 定位;建议拆为 fingerprint、签名和 SBOM 三阶段。</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="W29 开源生态参与信号:5 位新 Issue 作者、2 位新 PR 作者、0 位合并贡献者;当前可见本期创建 Fork 181 个;SkillHub CLI 在 2026 年 7 月 10 日至 16 日 UTC 日桶下载 541 次">
<div class="ecosystem-signal"><strong>5 / 2 / 0</strong><span>新 Issue 作者 / 新 PR 作者 / 合并贡献者</span></div>
<div class="ecosystem-signal"><strong>181</strong><span>当前可见本期创建 Fork</span></div>
<div class="ecosystem-signal"><strong>541</strong><span>CLI 下载 · 7 个 UTC 日桶</span></div>
<p class="ecosystem-signal-note">以上为独立参与信号,不构成转化漏斗。</p>
</div>
<ul class="ecosystem-list">
<li><strong>社区输入</strong><span>5 位作者提交部署、namespace、Hermes 与供应链议题,需求分布覆盖核心治理和生态接入。</span></li>
<li><strong>本地化与治理</strong><span><a href="https://github.com/iflytek/skillhub/pull/578">韩语本地化</a>与 <a href="https://github.com/iflytek/skillhub/pull/581">namespace 可见性修复</a>进入 Review。</span></li>
<li><strong>期后生态进展</strong><span>双语 FAQ、Hermes 指南和 CLI 通用安装目标在 7 月 17—22 日完成,不计入本期交付量。</span></li>
<li><strong>推广与合作</strong><span>本期尚未收到文章、直播、社区分享或合作项目清单;缺失数据不记为 0。</span></li>
</ul>
</section>
<aside class="next-actions" data-module="next-actions" aria-labelledby="next-title">
<h2 id="next-title">下周关注</h2>
<ol>
<li>收敛并完成 <a href="https://github.com/iflytek/skillhub/pull/581">PR #581</a> 的 Review 与完整门禁。</li>
<li>恢复固定 Release 窗口;若跳过发布,记录明确原因。</li>
<li>批量处理 14 个 <code>needs-info</code> Issue,并清理已实现或被替代的长期 PR。</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 warn">需关注</span></div>
<div class="health-metric">94.2% <small>49/52</small></div>
<p>3 次失败均来自 PR E2E。</p>
<div class="detail">有效成功率只统计实际成功与失败。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">安全流水线</span><span class="status ok">稳定</span></div>
<div class="health-metric">7 / 7 <small>执行成功</small></div>
<p>本期没有等待授权或失败记录。</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>Issue Triage 实际执行 5 次并全部成功。</p>
<div class="detail">Issue Triage 另有 7 次、奖励认领 3 次条件跳过。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">Release 交付</span><span class="status risk">风险</span></div>
<div class="health-metric">0 / 0 <small>应用 / CLI</small></div>
<p>W29 未完成周度 Release 目标。</p>
<div class="detail">应用发布空窗在期末超过 13 天。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">Issue 治理</span><span class="status warn">需关注</span></div>
<div class="health-metric">52.4% <small>11/21 超 30 天</small></div>
<p>14 个开放 Issue 仍带有 <code>needs-info</code>。</p>
<div class="detail">长期积压与信息补充队列需要并行清理。</div>
</article>
<article class="health-card">
<div class="top"><span class="name">PR 治理</span><span class="status warn">需关注</span></div>
<div class="health-metric">52.6% <small>10/19 超 30 天</small></div>
<p>Review 与关闭决策仍是主要瓶颈。</p>
<div class="detail">已实现或被替代的 PR 应优先形成明确处置。</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">统计期内有 62 条 Actions 记录,其中 49 次成功、3 次失败、10 次跳过。</p>
<div class="chart-box" data-module="actions-outcome-chart">
<h3>Actions 结果构成</h3>
<div class="segbar" role="img" aria-label="W29 Actions 共 62 条记录:成功 49,失败 3,条件跳过 10">
<span class="seg-success" style="width:79.03%"></span>
<span class="seg-failure" style="width:4.84%"></span>
<span class="seg-skipped" style="width:16.13%"></span>
</div>
<div class="chart-legend" aria-hidden="true">
<span><i class="seg-success"></i>成功 <b>49</b></span>
<span><i class="seg-failure"></i>失败 <b>3</b></span>
<span><i class="seg-skipped"></i>跳过 <b>10</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">6</td><td class="number">6</td><td class="number">0</td><td class="number">0</td><td class="number">0</td></tr>
<tr><td>PR E2E Tests</td><td class="number">6</td><td class="number">3</td><td class="number">3</td><td class="number">0</td><td class="number">0</td></tr>
<tr><td>Security</td><td class="number">7</td><td class="number">7</td><td class="number">0</td><td class="number">0</td><td class="number">0</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>Issue Triage</td><td class="number">12</td><td class="number">5</td><td class="number">0</td><td class="number">0</td><td class="number">7</td></tr>
<tr><td>Claim Issue Reward</td><td class="number">3</td><td class="number">0</td><td class="number">0</td><td class="number">0</td><td class="number">3</td></tr>
</tbody>
</table>
</div>
<p class="risk-note"><strong>本期薄弱点:</strong>PR E2E 6 次实际形成结论,其中 3 次失败;其余实际执行的工作流均成功。</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 实际执行 7 次并全部成功。仓库保留 CodeQL 定时扫描和 dependency review;公开数据无法确认未修复告警数量。</p>
</article>
<article class="health-note">
<h3>Release 交付</h3>
<p>W29 应用与 CLI 均未发布。<a href="https://github.com/iflytek/skillhub/releases/tag/v0.2.14">v0.2.14</a> 和 <a href="https://github.com/iflytek/skillhub/releases/tag/cli-v0.1.9">cli-v0.1.9</a> 于 7 月 22 日期后补发,不计入 W29。</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="W29 当前开放 Issue 21 个:不足 7 天 5 个,7 到 13 天 3 个,14 到 29 天 2 个,30 天以上 11 个">
<div class="bar-row"><span class="bar-label">&lt; 7 天</span><span class="bar-track"><span class="bar-fill" style="width:45.5%"></span></span><span class="bar-value">5</span></div>
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:27.3%"></span></span><span class="bar-value">3</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:100%"></span></span><span class="bar-value">11</span></div>
</div>
<p class="chart-note">52.4% 已超过 30 天,年龄结构明显偏向长期存量。</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:66.7%" role="img" aria-label="W29 当前开放 Issue 中,14 个带 needs-info 标签,占 21 个开放 Issue 的 66.7%">
<div class="donut-center"><strong>66.7%</strong><span>14 / 21</span></div>
</div>
<div class="donut-copy">
<p><strong>14 个</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="W29 当前开放 PR 19 个:不足 7 天 5 个,7 到 13 天 1 个,14 到 29 天 3 个,30 天以上 10 个">
<div class="bar-row"><span class="bar-label">&lt; 7 天</span><span class="bar-track"><span class="bar-fill" style="width:50%"></span></span><span class="bar-value">5</span></div>
<div class="bar-row"><span class="bar-label">7—13 天</span><span class="bar-track"><span class="bar-fill" style="width:10%"></span></span><span class="bar-value">1</span></div>
<div class="bar-row"><span class="bar-label">14—29 天</span><span class="bar-track"><span class="bar-fill" style="width:30%"></span></span><span class="bar-value">3</span></div>
<div class="bar-row"><span class="bar-label">≥ 30 天</span><span class="bar-track"><span class="bar-fill hot" style="width:100%"></span></span><span class="bar-value">10</span></div>
</div>
<p class="chart-note">52.6% 已超过 30 天;Review 和关闭决策是主要治理瓶颈。</p>
</div>
</section>
<section class="report-section" data-module="observable-response" aria-labelledby="response-title">
<h2 id="response-title">社区响应</h2>
<p>5 个新增 Issue 中,CLI 可见性问题 <a href="https://github.com/iflytek/skillhub/issues/577">#577</a> 在本期关闭;namespace 问题 <a href="https://github.com/iflytek/skillhub/issues/580">#580</a> 形成配对 PR #581。按“关闭或形成配对实现”统计,可观察处置覆盖为 2/5。</p>
<div class="table-wrap">
<table>
<caption>新增 Issue 的首次可观察处置</caption>
<thead><tr><th>Issue</th><th>首次处置</th><th>耗时</th><th>状态</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/577">#577</a></td><td>确认 ClawHub CLI 兼容边界</td><td>未取得</td><td>本期关闭</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/580">#580</a></td><td>形成配对 PR #581</td><td>约 13 小时</td><td>推进中</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/582">#582</a></td><td>期后形成 Hermes 指南 PR #584</td><td>期后</td><td>期后完成</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/579">#579</a></td><td>本期未观察到明确执行结论</td><td>未取得</td><td>待确认</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/583">#583</a></td><td>本期未观察到明确执行结论</td><td>未取得</td><td>待安全评审</td></tr>
</tbody>
</table>
</div>
</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 +5 / -3</strong><span>净增 2 · 7 月 23 日快照开放 21</span></div>
<div class="flow-item"><strong>PR +2 / 合并 0</strong><span>关闭未合并 0 · 净增 2 · 7 月 23 日快照开放 19</span></div>
</div>
<h3>新增 Issue(按价值排序)</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">W29 新增 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/580">#580 SUPER_ADMIN namespace 可见性</a></td><td>企业治理核心体验问题。</td><td>配对 PR #581 仍开放。</td></tr>
<tr><td><span class="value-level value-b">B</span></td><td><a href="https://github.com/iflytek/skillhub/issues/579">#579 来源证明、签名与 SBOM</a></td><td>战略价值高,当前范围过大。</td><td>待拆分设计。</td></tr>
<tr><td><span class="value-level value-c">C</span></td><td><a href="https://github.com/iflytek/skillhub/issues/582">#582 Hermes Skill 集成</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/583">#583 DingTalk OAuth</a></td><td>企业身份接入价值高,需严格审查安全边界。</td><td>与 PR #467 配对,仍待集中评审。</td></tr>
<tr><td><span class="value-level value-d">D</span></td><td><a href="https://github.com/iflytek/skillhub/issues/577">#577 ClawHub visibility 参数</a></td><td>上游 CLI 能力边界问题。</td><td>本期关闭,不进入 SkillHub 实现队列。</td></tr>
</tbody>
</table>
</div>
<h3>新增、合并与关闭 PR</h3>
<div class="table-wrap">
<table>
<caption class="sr-only">W29 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/581">#581 namespace 可见性</a></td><td>价值高、范围较大,需收敛并重跑门禁。</td></tr>
<tr><td>新增</td><td><span class="value-level value-c">C</span></td><td><a href="https://github.com/iflytek/skillhub/pull/578">#578 韩语本地化</a></td><td>扩大本地化覆盖,期后关闭未合并。</td></tr>
<tr><td>本期结果</td><td>—</td><td>合并 0 / 关闭未合并 0</td><td>2 个新增 PR 均在期末保持开放。</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-23 22:00 快照,只列需要明确决策的 A/B 项;其余队列按主题合并,避免把周报变成全量工单导出。</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/596">#596 驳回版本同版本号重传返回 500</a></td><td>发布核心流程确定性错误。</td><td>优先审查配对 PR #601,并回归版本指针。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/580">#580 namespace 可见性</a></td><td>企业治理核心体验,已有成熟实现。</td><td>收敛 PR #581 范围并完成完整门禁。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/516">#516 多 Skill 仓库导入与同步</a></td><td>与 Registry 增长定位高度一致。</td><td>先形成一期验收标准,再做扫描与批量发布。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/518">#518 SemVer 与预发布版本</a></td><td>Registry 基础协议,文档与实现需统一。</td><td>先统一兼容、排序、latest 和 prerelease 规则。</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/597">#597 异步索引可观察性</a></td><td>先补失败指标与 MDC,再决定有界重试。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/583">#583 DingTalk OAuth</a></td><td>围绕 Issue 对 PR #467 做集中安全评审。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/579">#579 来源证明、签名与 SBOM</a></td><td>拆分 fingerprint、签名验证和 SBOM。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/556">#556 合规元数据与审计</a></td><td>审查领域模型、迁移、查询性能和 API 生成。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/issues/452">#452 Skill Evaluation</a></td><td>先做外部执行、SkillHub 接收并展示结果的窄版本。</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/601">#601 修复驳回版本重传 500</a></td><td>直接修复发布核心流程。</td><td>完成 CI 与 Review 后优先合并。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/581">#581 namespace 可见性</a></td><td>用户价值高,但范围继续扩大。</td><td>核对无关变更,rebase 后重跑完整门禁。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/592">#592 标签变更后重建搜索索引</a></td><td>修复真实索引一致性错误。</td><td>确认完整 CI;稳健性问题由 #597 跟踪。</td></tr>
<tr><td><a href="https://github.com/iflytek/skillhub/pull/593">#593 部署与运维 FAQ</a></td><td>低风险,可降低社区支持成本。</td><td>事实校对后合并。</td></tr>
</tbody>
</table>
</div>
<details data-module="cleanup-queue">
<summary>展开:需要清理的长期 PR</summary>
<div class="details-body">
<p><a href="https://github.com/iflytek/skillhub/pull/460">#460</a>、<a href="https://github.com/iflytek/skillhub/pull/457">#457</a>、<a href="https://github.com/iflytek/skillhub/pull/442">#442</a> 已被主干实现或替代;<a href="https://github.com/iflytek/skillhub/pull/437">#437</a> 依赖未推进的父 PR。建议在确认无剩余差异后关闭,减少队列噪音。</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-10 00:00—2026-07-16 23:59,Asia/Shanghai;程序过滤采用等价半开区间 <code>[2026-07-10 00:00, 2026-07-17 00:00)</code>,对应 UTC 为 7 月 9 日 16:00 至 7 月 16 日 16:00。</span></li>
<li><strong>当前快照</strong><span>2026-07-23 22:00;开放 Issue/PR、Stars、Forks 和 Watchers 是期后快照,不回填为 W29 流量。</span></li>
<li><strong>Star 证据</strong><span>109 表示 7 月 31 日 16:35 认证 API 中,<code>starred_at</code> 落入本期且当前仍可见的 Stargazer;它不代表 Star 库存净增长。</span></li>
<li><strong>期后进展</strong><span>7 月 17 日 00:00 及以后发生的合并、关闭和 Release 仅说明后续结果,明确不计入 W29。</span></li>
<li><strong>周期衔接</strong><span>W29 的排他截止与 W30 起始均为 7 月 17 日 00:00,相邻报告无重叠;周四 23:59 后的事件进入下一期。</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>推广数据</strong><span>推广动作由维护者补录;Fork、下载、Issue 作者和 PR 作者是不同信号,不作为转化漏斗。</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>GitHub Actions 与本地 Git</td><td>流水线运行、恢复证据和变更核对</td><td>外部 PR 等待授权时无实际执行样本。</td></tr>
<tr><td>npm Downloads API</td><td><code>@astron-team/skillhub</code> 的 7 个 UTC 日桶</td><td>541 次下载不等同于独立用户,且覆盖范围与 Asia/Shanghai 周期不完全对齐。</td></tr>
<tr><td>维护者人工底稿</td><td>价值排序、推广动作和期后确认</td><td>推广动作尚未提供。</td></tr>
</tbody>
</table>
</div>
<p class="risk-note"><strong>未取得:</strong>GitHub Traffic、Referrers、W29 起止两份可比 Star/Fork 库存快照、私有安全告警,以及生产 SkillHub 实例的可用率、延迟、Skill 数量和扫描成功率。</p>
</section>
</div>
</main>
<footer>
<span>SkillHub Open Source Weekly · 2026-W29</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);
});
var initial = location.hash.replace('#', '');
activate(initial, false, false);
}());
</script>
</body>
</html>