@morehao/dsh-github-trending 0.7.7 → 0.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.7.8] - 2026-11-01
4
+
5
+ > 统一「订阅」口径:这个功能不再叫「发版」,运行记录、概览、设置、订阅页与提示文案一致;顺带修好运行记录里的类型胶囊样式。
6
+
7
+ ### 改进 — 全站口径统一为「订阅」
8
+
9
+ - **运行记录**:类型胶囊与筛选由「发版」改为「订阅」;空态改为「还没有订阅运行记录」,展开说明改为「订阅运行只做订阅检查与变更文档渲染」。
10
+ - **概览 / 设置 / 订阅页**:「发版订阅」统一为「订阅」(速览卡、设置分区、用量卡、分区跳转);速览 KPI「新发版」改为「新版本」,与运行记录里的「新版本」计数一致。
11
+ - **订阅抽屉**:「发版记录」改为「变更记录」,加载与空态文案同步。
12
+ - **英文**:`Releases` 口径统一为 `Subscriptions`;运行记录胶囊用 `Subs`(列宽 56px,完整单词会挤压右侧列)。
13
+ - **Host 提示**:`SUBSCRIBE_FAILED` 的「发版文档」改为「变更文档」;`trending_run` 输出「发版 N 个新版本」改为「订阅 N 个新版本」;配置校验「发版日」改为「订阅检查日」。
14
+ - `README.md` / `docs/dsh-plugin-summary.md` 同步口径;「发布插件到 npm」语义的「发版」保持不变。
15
+
16
+ ### 修复 — 运行记录类型胶囊样式
17
+
18
+ - 订阅行此前只带 `.dshgt-pchip` 基础类,渲染成灰描边小盒子,和日报的「日榜」胶囊不是一套。现补上 `release` 变体,与日/周/月同高、同圆角、同字重,只差色相(暖橙 `#b45309`)。
19
+ - 四个变体的颜色改为从 `--tone` 派生到宿主 token(文字 82% / 描边 30% / 填充 12%),深色主题下不再出现「亮色贴纸」。
20
+ - 胶囊统一由 `kindChip()` 渲染,避免以后新增类型再漏类名。
21
+
3
22
  ## [v0.7.7] - 2026-11-01
4
23
 
5
24
  > 升级核心 `dsh.core.version` 0.8.2 → 0.8.3:修复「英文占比高的仓库被误判为摘要无效、降级为原文」;订阅抽屉遮罩背景色对齐 dsh-skills-console。
package/README.md CHANGED
@@ -47,20 +47,20 @@ dsh plugin --profile <profile> add @morehao/dsh-github-trending
47
47
  ## 用量(token)
48
48
 
49
49
  - **每次运行的 token 总量**与**历史累计总量**都会记录。**只展示总用量,不拆** prompt / completion / cached 等维度。
50
- - 「本次任务总量」= 榜单摘要阶段(`usage.totalTokens`)+ 发版订阅阶段(`releases.usage.totalTokens`),**订阅消耗计入总量**。
50
+ - 「本次任务总量」= 榜单摘要阶段(`usage.totalTokens`)+ 订阅阶段(`releases.usage.totalTokens`),**订阅消耗计入总量**。
51
51
  - 累计 = 历史里全部运行 `tokens` 之和,**读时求和、不落盘**(`history.json` 只存每次的 `tokens`)。
52
52
  - 插件**不做费用估算、不内置定价表**(价格随 provider / 区域变动,易过期):只展示核心回报的 token 真值。
53
- - 展示位置:概览速览块(本次 / 累计 / 新发版 / 订阅仓库数)、运行记录(每行本次 tokens、展开明细、页脚累计)、历史。数据来自契约 `Usage`。旧核心无 `usage` / `releases` 时对应速览块整体隐藏(不铺「—」、不伪造 0)。
53
+ - 展示位置:概览速览块(本次 / 累计 / 新版本 / 订阅仓库数)、运行记录(每行本次 tokens、展开明细、页脚累计)、历史。数据来自契约 `Usage`。旧核心无 `usage` / `releases` 时对应速览块整体隐藏(不铺「—」、不伪造 0)。
54
54
 
55
- ## 发版订阅
55
+ ## 订阅(`releases` 阶段)
56
56
 
57
- - 订阅一组仓库,之后**每周一次**把每个仓库这一周「**新增的 Release**(无 Release 时回退 Tag)」合成一段中文总结,写到 `<output.dir>/releases/<owner>/<repo>-01.md`(每册都带两位序号,超出行数预算后下一次写入开 `-02.md`,最新一周在最上面),与榜单**同分支、同 PR** 一起提交。发版阶段**常开**;没有订阅时不产出,既有榜单产物逐字节不变。跨仓的周汇总(`releases/_weekly/<年>/<ISO周>.{md,json}`)继续生成,供外部 Web 服务的 `GET /api/v2/releases*` 消费。
57
+ - 订阅一组仓库,之后**每周一次**把每个仓库这一周「**新增的 Release**(无 Release 时回退 Tag)」合成一段中文总结,写到 `<output.dir>/releases/<owner>/<repo>-01.md`(每册都带两位序号,超出行数预算后下一次写入开 `-02.md`,最新一周在最上面),与榜单**同分支、同 PR** 一起提交。订阅阶段**常开**;没有订阅时不产出,既有榜单产物逐字节不变。跨仓的周汇总(`releases/_weekly/<年>/<ISO周>.{md,json}`)继续生成,供外部 Web 服务的 `GET /api/v2/releases*` 消费。
58
58
  - **订阅列表随数据仓版本化**:文件在 `<repo>/<OutputRoot(output.dir)>/subscriptions.yaml`,随产物同一次 commit / PR,可审计、可复现。
59
59
  - **插件不直接写仓**:列表经核心 `subscribe` IPC 命令读改——`add` / `remove` 只写 `.git/trendradar-subscriptions.pending`,下一次 `run` 切分支后落盘并随 artifact 提交。插件侧的子进程只做一次 stdin 交互:`RunRequest{command:"subscribe", action, repo?, volume?, configPath}`;核心把 payload 放进结果信封(`subscriptions` / `subscriptionDoc`),旧核心把 `list` 结果逐行打到信封前,插件两种都认。`configPath` 由插件生成(与 `run` 同源的临时配置),保证 `subscribe` 与 `run` 解析到同一个订阅文件;代理模式下 `model.baseURL` 为空,临时配置补一个回环占位端点以通过核心 `config.Load`(订阅命令不调用模型)。
60
- - 界面:「订阅」页管理列表(增删 + 逐仓库状态),可展开某仓库的发版文档(`GET /subscriptions/releases?repo=&volume=`);「设置 → 发版订阅」分区放行为参数与每周触发节奏。
60
+ - 界面:「订阅」页管理列表(增删 + 逐仓库状态),可展开某仓库的变更文档(`GET /subscriptions/releases?repo=&volume=`);「设置 → 订阅」分区放行为参数与每周触发节奏。
61
61
  - 周期:0.7.0 起只支持**每周**(`releases.period=weekly`)——每个 ISO 周、每仓库一条中文摘要,文档按周累积并按行数预算自动分卷;填 `daily`/`monthly` 会被校验拦下并说明原因。
62
- - 每周发版行程与榜单调度**互相独立**:`releases.schedule`(`enabled` / `weekday`(ISO 1=周一…7=周日)/ `time` / `timezone`)驱动 `run --stages releases`——只跑发版阶段,不抓榜单、不渲染 digest、不合并订阅 pending;成功后按 ISO 周(如 `2026-W44`)去重。
63
- - 历史里每条运行记录带 `releases` 摘要(仓库数 / 新发版 / 已摘要 / 降级 / 失败 / 跳过)与本次 `tokens`;旧核心没有 `releases` 块时缺省。
62
+ - 每周订阅行程与榜单调度**互相独立**:`releases.schedule`(`enabled` / `weekday`(ISO 1=周一…7=周日)/ `time` / `timezone`)驱动 `run --stages releases`——只跑订阅阶段,不抓榜单、不渲染 digest、不合并订阅 pending;成功后按 ISO 周(如 `2026-W44`)去重。
63
+ - 历史里每条运行记录带 `releases` 摘要(仓库数 / 新版本 / 已摘要 / 降级 / 失败 / 跳过)与本次 `tokens`;旧核心没有 `releases` 块时缺省。
64
64
 
65
65
 
66
66
 
@@ -118,13 +118,13 @@ dsh plugin --profile <profile> add @morehao/dsh-github-trending
118
118
  | `summarize.batchSize` / `maxRetries` | `10` / `1` | 摘要批量与失败重试(映射核心 `summarize.*`) |
119
119
  | `summarize.enrich` | `none` | `none` / `repo` / `readme`:是否抓取 GitHub topics / README 作为增强上下文;`repo`/`readme` 建议配只读 `GITHUB_READ_TOKEN` |
120
120
  | `summarize.readmeChars` | `800` | README 摘录长度(enrich=readme 时) |
121
- | `releases.includePrerelease` / `includeDrafts` | `false` / `false` | 是否含预发布 / 草稿(发版阶段常开,不提供 `enabled` 开关) |
121
+ | `releases.includePrerelease` / `includeDrafts` | `false` / `false` | 是否含预发布 / 草稿(订阅阶段常开,不提供 `enabled` 开关) |
122
122
  | `releases.fallbackToTags` / `baselineOnFirstRun` | `true` / `true` | 无 Release 时回退 Tag / 首次只记基线 |
123
123
  | `releases.perRepoLimit` / `maxNotesChars` | `10` / `4000` | 文档列出的版本条数(1–20)/ notes 截断(500–20000) |
124
124
  | `releases.summaryMaxChars` / `docMaxLines` | `1200` / `600` | 每仓每周摘要字数(500–2000)/ 文档行数预算(100–2000,超了开新卷) |
125
125
  | `releases.concurrency` / `budgetSeconds` | `auto` / `auto` | 订阅并发(`auto` 或 1–8)/ 模型预算秒(`auto` 或 1–300);`auto` 由插件按订阅数解析 |
126
126
  | `releases.period` | `weekly` | 只支持 `weekly`(每个 ISO 周一条摘要) |
127
- | `releases.schedule.enabled` / `weekday` / `time` / `timezone` | `true` / `1` / `08:00:00` / `Asia/Shanghai` | 每周发版行程(插件自己的 tick;`weekday` 为 ISO 1=周一…7=周日);**不写进核心 YAML** |
127
+ | `releases.schedule.enabled` / `weekday` / `time` / `timezone` | `true` / `1` / `08:00:00` / `Asia/Shanghai` | 每周订阅行程(插件自己的 tick;`weekday` 为 ISO 1=周一…7=周日);**不写进核心 YAML** |
128
128
  | `output.dir` | `trending` | 仓库内相对目录 |
129
129
  | `schedule.enabled` / `time` / `timezone` | `true` / `08:30:00` / `Asia/Shanghai` | 插件自己的 60 s tick 驱动 |
130
130
  | `schedule.periods` | `daily,weekly,monthly` | 定时自动产出的周期:默认三周期全产出(无需勾选),日=每天、周=周日、月=月末触发;旧配置自动升级为三周期 |
package/client.js CHANGED
@@ -56,7 +56,7 @@ var DICT = {
56
56
  "st.auth": "认证",
57
57
  "st.scope": "榜单",
58
58
  "st.summarize": "摘要与用量",
59
- "st.releases": "发版订阅",
59
+ "st.releases": "订阅",
60
60
  "st.schedule": "调度",
61
61
  "card.source.title": "内容来源",
62
62
  "card.source.hint": "唯一来源是本地二进制",
@@ -243,7 +243,7 @@ var DICT = {
243
243
  "shell.digest.dek": "按周期回看日榜 / 周榜 / 月榜;只有保留过预览副本的期数能读。",
244
244
  "shell.runs.dek": "最近 30 次运行;展开看交付物、错误与日志。",
245
245
  "shell.settings.dek": "沿用现有设置页;每个分区独立保存。",
246
- "shell.subscriptions.dek": "仓库发版订阅列表,随数据仓版本化;经核心 subscribe 命令增删。",
246
+ "shell.subscriptions.dek": "仓库订阅列表,随数据仓版本化;经核心 subscribe 命令增删。",
247
247
  "shell.nextRun": "下次运行",
248
248
  "shell.scheduleOff": "定时未开启",
249
249
  "shell.ready": "就绪 {ready} / {total}",
@@ -312,8 +312,8 @@ var DICT = {
312
312
  "runs.filter.dry": "试跑",
313
313
  "runs.type.all": "全部",
314
314
  "runs.type.digest": "日报",
315
- "runs.type.release": "发版",
316
- "runs.release.empty": "还没有发版运行记录",
315
+ "runs.type.release": "订阅",
316
+ "runs.release.empty": "还没有订阅运行记录",
317
317
  "runs.release.status.ok": "成功",
318
318
  "runs.release.status.failed": "失败",
319
319
  "runs.release.status.skipped": "跳过",
@@ -329,7 +329,7 @@ var DICT = {
329
329
  "runs.release.startedAt": "开始",
330
330
  "runs.release.finishedAt": "结束",
331
331
  "runs.release.error": "错误",
332
- "runs.release.note": "发版运行只做订阅检查与文档渲染,不产出日报、也不合并待提交的订阅改动。",
332
+ "runs.release.note": "订阅运行只做订阅检查与变更文档渲染,不产出日报、也不合并待提交的订阅改动。",
333
333
  "runs.pendingPr": "待合并",
334
334
  "runs.prUnknown": "状态未知",
335
335
  "runs.prCreated": "PR 已创建",
@@ -392,15 +392,15 @@ var DICT = {
392
392
  "log.close": "关闭",
393
393
  "run.usage.tokens": "本次任务 tokens",
394
394
  "run.usage.tokensTotal": "累计全部用量",
395
- "run.usage.tokensNote": "只展示总用量,不拆 prompt/completion 等维度;本次任务总量 = 榜单摘要 + 发版订阅阶段(含订阅)。旧核心无数据时显示「—」。",
396
- "run.usage.breakdown": "榜单摘要 {summary} · 发版订阅 {releases} · 合计 {total}",
395
+ "run.usage.tokensNote": "只展示总用量,不拆 prompt/completion 等维度;本次任务总量 = 榜单摘要 + 订阅阶段(含订阅检查的模型调用)。旧核心无数据时显示「—」。",
396
+ "run.usage.breakdown": "榜单摘要 {summary} · 订阅 {releases} · 合计 {total}",
397
397
  "run.usage.breakdownSimple": "榜单摘要 {summary} · 合计 {total}",
398
- "run.usage.releasesOnly": "发版订阅 {releases} · 合计 {total}",
399
- "releases.card.title": "发版订阅(releases 阶段)",
398
+ "run.usage.releasesOnly": "订阅 {releases} · 合计 {total}",
399
+ "releases.card.title": "订阅(releases 阶段)",
400
400
  "releases.card.on": "已开启",
401
401
  "releases.card.off": "未开启",
402
402
  "releases.stat.repos": "仓库",
403
- "releases.stat.new": "新发版",
403
+ "releases.stat.new": "新版本",
404
404
  "releases.stat.summarized": "已摘要",
405
405
  "releases.stat.degraded": "降级",
406
406
  "releases.stat.failed": "失败",
@@ -410,9 +410,9 @@ var DICT = {
410
410
  "releases.badge.summarized": "已摘要",
411
411
  "releases.badge.degraded": "降级为原文",
412
412
  "releases.badge.off": "未启用",
413
- "releases.empty": "本次未启用发版订阅",
413
+ "releases.empty": "本次未启用订阅",
414
414
  "runs.detail.tokens": "本次任务 tokens",
415
- "runs.detail.releases": "发版订阅",
415
+ "runs.detail.releases": "订阅",
416
416
  "runs.detail.tokensNone": "—",
417
417
  "runs.footer.total": "历史累计 tokens:{total}",
418
418
  "card.summarize.title": "摘要与用量",
@@ -429,10 +429,10 @@ var DICT = {
429
429
  "summarize.readmeChars": "README 摘录长度",
430
430
  "summarize.readmeChars.help": "enrich 为 readme 时,每个仓库 README 摘录的最大字符数(超出截断)。",
431
431
  "summarize.enrichNote": "外部增强需要只读 token:enrich=repo/readme 建议配置 GITHUB_READ_TOKEN(独立只读);readme 模式在网络慢时可能因预算耗尽跳过部分仓库(自动降级,不影响运行)。",
432
- "card.releases.title": "发版订阅",
432
+ "card.releases.title": "订阅",
433
433
  "card.releases.hint": "对应核心 releases.*(core 0.5.0+)",
434
434
  "releases.includePrerelease": "含预发布",
435
- "releases.includePrerelease.help": "GitHub 上标记为 pre-release 的版本也计入新发版。",
435
+ "releases.includePrerelease.help": "GitHub 上标记为 pre-release 的版本也计入新版本。",
436
436
  "releases.includeDrafts": "含草稿",
437
437
  "releases.includeDrafts.help": "草稿(draft)Release 也计入;草稿只有写权限的 token 才看得到。",
438
438
  "releases.notesChars": "notes 截断",
@@ -450,11 +450,11 @@ var DICT = {
450
450
  "releases.concurrency.auto": "自动",
451
451
  "releases.concurrency.fixed": "指定",
452
452
  "releases.budget": "模型预算(秒)",
453
- "releases.budget.help": "发版阶段调模型的预算总时长;「自动」按订阅数解析(min(300, 30 + 3×N))。",
453
+ "releases.budget.help": "订阅阶段调模型的预算总时长;「自动」按订阅数解析(min(300, 30 + 3×N))。",
454
454
  "releases.budget.auto": "自动",
455
455
  "releases.budget.fixed": "指定",
456
456
  "subs.title": "订阅",
457
- "subs.desc": "管理发版订阅仓库,查看每周变更记录。",
457
+ "subs.desc": "管理订阅仓库,查看每周变更记录。",
458
458
  "subs.select": "选择",
459
459
  "subs.select.done": "完成",
460
460
  "subs.cmd.placeholder": "搜索 owner/repo,或输入完整仓库名直接添加",
@@ -470,7 +470,7 @@ var DICT = {
470
470
  "subs.meta.match": "匹配 {matched} / {total}",
471
471
  "subs.meta.lastWeek": "上周 {from} ~ {to} · {changed} 个仓库有变化",
472
472
  "subs.meta.thisWeek": "本周 {from} ~ {to} · {changed} 个仓库有变化",
473
- "subs.meta.lastCheck": "上次发版检查 {time}",
473
+ "subs.meta.lastCheck": "上次订阅检查 {time}",
474
474
  "subs.add": "添加",
475
475
  "subs.add.title": "添加订阅仓库",
476
476
  "subs.add.exists": "{repo} 已在订阅列表中",
@@ -534,14 +534,14 @@ var DICT = {
534
534
  "subs.empty.clear": "清除搜索",
535
535
  "subs.loading": "加载订阅列表…",
536
536
  "subs.input.invalid": "请输入 owner/repo 形态,例如 vercel/next.js",
537
- "subs.drawer.title": "发版记录 · {repo}",
537
+ "subs.drawer.title": "变更记录 · {repo}",
538
538
  "subs.drawer.close": "关闭",
539
539
  "subs.drawer.updated": "最近更新 {date}",
540
540
  "subs.drawer.volume": "第 {index} 册 / 共 {total} 册",
541
541
  "subs.drawer.prevVolume": "上一册",
542
542
  "subs.drawer.nextVolume": "下一册",
543
- "subs.drawer.loading": "读取发版记录…",
544
- "subs.drawer.empty": "这个仓库还没有发版记录,第一周检查后会出现在这里",
543
+ "subs.drawer.loading": "读取变更记录…",
544
+ "subs.drawer.empty": "这个仓库还没有变更记录,第一周检查后会出现在这里",
545
545
  "subs.drawer.retry": "重试",
546
546
  "subs.drawer.warn.rate_limited": "本周未更新(限流),下次运行会重试",
547
547
  "subs.drawer.warn.failed": "本周未更新(失败),下次运行会重试",
@@ -553,13 +553,13 @@ var DICT = {
553
553
  "weekday.5": "周五",
554
554
  "weekday.6": "周六",
555
555
  "weekday.7": "周日",
556
- "subs.param.hint": "阶段行为参数(每仓上限、回退 Tag、周期等)在设置页「发版订阅」分区调整。",
557
- "subs.param.link": "前往设置 → 发版订阅",
556
+ "subs.param.hint": "阶段行为参数(每仓上限、回退 Tag、周期等)在设置页「订阅」分区调整。",
557
+ "subs.param.link": "前往设置 → 订阅",
558
558
  "overview.tokens.title": "Token 用量",
559
559
  "overview.tokens.thisRun": "本次任务",
560
560
  "overview.tokens.total": "累计全部",
561
- "overview.releases.title": "发版订阅",
562
- "overview.releases.new": "新发版",
561
+ "overview.releases.title": "订阅",
562
+ "overview.releases.new": "新版本",
563
563
  "overview.releases.repos": "仓库",
564
564
  "overview.tokens.note": "概览一屏带出「这次任务共花了多少 token / 历史上累计多少 / 订阅仓库有几个新版本」;只给总用量,不拆维度;本次任务总量已含订阅阶段消耗。旧核心无数据时对应小块整体隐藏,不留 0。",
565
565
  "about.title": "关于",
@@ -585,7 +585,7 @@ var DICT = {
585
585
  "st.auth": "Auth",
586
586
  "st.scope": "Scope",
587
587
  "st.summarize": "Summary & usage",
588
- "st.releases": "Releases",
588
+ "st.releases": "Subscriptions",
589
589
  "st.schedule": "Schedule",
590
590
  "card.source.title": "Content source",
591
591
  "card.source.hint": "one source: the local binary",
@@ -772,7 +772,7 @@ var DICT = {
772
772
  "shell.digest.dek": "Look back per period — daily / weekly / monthly; only issues with a saved preview copy can be read.",
773
773
  "shell.runs.dek": "The last 30 runs; expand one for artifacts, errors and logs.",
774
774
  "shell.settings.dek": "The existing settings page; each section saves on its own.",
775
- "shell.subscriptions.dek": "Repo release subscription list, versioned in the data repo; add or remove via the core subscribe command.",
775
+ "shell.subscriptions.dek": "Repo subscription list, versioned in the data repo; add or remove via the core subscribe command.",
776
776
  "shell.nextRun": "Next run",
777
777
  "shell.scheduleOff": "Schedule off",
778
778
  "shell.ready": "Ready {ready} / {total}",
@@ -841,8 +841,8 @@ var DICT = {
841
841
  "runs.filter.dry": "Dry run",
842
842
  "runs.type.all": "All",
843
843
  "runs.type.digest": "Digest",
844
- "runs.type.release": "Release",
845
- "runs.release.empty": "No release runs yet",
844
+ "runs.type.release": "Subs",
845
+ "runs.release.empty": "No subscription runs yet",
846
846
  "runs.release.status.ok": "OK",
847
847
  "runs.release.status.failed": "Failed",
848
848
  "runs.release.status.skipped": "Skipped",
@@ -858,7 +858,7 @@ var DICT = {
858
858
  "runs.release.startedAt": "Started",
859
859
  "runs.release.finishedAt": "Finished",
860
860
  "runs.release.error": "Error",
861
- "runs.release.note": "A release run only checks subscriptions and renders documents; it produces no digest and does not merge pending subscription changes.",
861
+ "runs.release.note": "A subscription run only checks subscriptions and renders change documents; it produces no digest and does not merge pending subscription changes.",
862
862
  "runs.pendingPr": "Pending merge",
863
863
  "runs.prUnknown": "State unknown",
864
864
  "runs.prCreated": "PR created",
@@ -921,11 +921,11 @@ var DICT = {
921
921
  "log.close": "Close",
922
922
  "run.usage.tokens": "This run tokens",
923
923
  "run.usage.tokensTotal": "All-time total",
924
- "run.usage.tokensNote": 'Only total usage is shown, not split into prompt/completion; this run total = board summary + releases stage (subscriptions included). Old core with no data shows "—".',
925
- "run.usage.breakdown": "Board {summary} · Releases {releases} · Total {total}",
924
+ "run.usage.tokensNote": 'Only total usage is shown, not split into prompt/completion; this run total = board summary + subscriptions stage (including the model calls of the subscription check). Old core with no data shows "—".',
925
+ "run.usage.breakdown": "Board {summary} · Subscriptions {releases} · Total {total}",
926
926
  "run.usage.breakdownSimple": "Board {summary} · Total {total}",
927
- "run.usage.releasesOnly": "Releases {releases} · Total {total}",
928
- "releases.card.title": "Releases stage",
927
+ "run.usage.releasesOnly": "Subscriptions {releases} · Total {total}",
928
+ "releases.card.title": "Subscriptions stage",
929
929
  "releases.card.on": "On",
930
930
  "releases.card.off": "Off",
931
931
  "releases.stat.repos": "Repos",
@@ -939,9 +939,9 @@ var DICT = {
939
939
  "releases.badge.summarized": "Summarized",
940
940
  "releases.badge.degraded": "Degraded to original",
941
941
  "releases.badge.off": "Disabled",
942
- "releases.empty": "Releases were not enabled for this run",
942
+ "releases.empty": "Subscriptions were not enabled for this run",
943
943
  "runs.detail.tokens": "This run tokens",
944
- "runs.detail.releases": "Releases",
944
+ "runs.detail.releases": "Subscriptions",
945
945
  "runs.detail.tokensNone": "—",
946
946
  "runs.footer.total": "All-time tokens: {total}",
947
947
  "card.summarize.title": "Summary & usage",
@@ -958,7 +958,7 @@ var DICT = {
958
958
  "summarize.readmeChars": "README excerpt chars",
959
959
  "summarize.readmeChars.help": "Max README characters excerpted per repo when enrich=readme (longer text is truncated).",
960
960
  "summarize.enrichNote": "Enrich needs a read-only token: enrich=repo/readme is best paired with GITHUB_READ_TOKEN (separate, read-only). In readme mode slow networks may skip some repos when the budget runs out (auto-degrades; the run is unaffected).",
961
- "card.releases.title": "Releases",
961
+ "card.releases.title": "Subscriptions",
962
962
  "card.releases.hint": "Maps to core releases.* (core 0.5.0+)",
963
963
  "releases.includePrerelease": "Include pre-releases",
964
964
  "releases.includePrerelease.help": "Releases marked as pre-release on GitHub also count as new releases.",
@@ -979,11 +979,11 @@ var DICT = {
979
979
  "releases.concurrency.auto": "Auto",
980
980
  "releases.concurrency.fixed": "Fixed",
981
981
  "releases.budget": "Model budget (s)",
982
- "releases.budget.help": "Overall budget for model calls in the releases stage; “Auto” resolves by subscription count (min(300, 30 + 3×N)).",
982
+ "releases.budget.help": "Overall budget for model calls in the subscriptions stage; “Auto” resolves by subscription count (min(300, 30 + 3×N)).",
983
983
  "releases.budget.auto": "Auto",
984
984
  "releases.budget.fixed": "Fixed",
985
985
  "subs.title": "Subscriptions",
986
- "subs.desc": "Manage release-subscription repos and review weekly change records.",
986
+ "subs.desc": "Manage subscribed repos and review weekly change records.",
987
987
  "subs.select": "Select",
988
988
  "subs.select.done": "Done",
989
989
  "subs.cmd.placeholder": "Search owner/repo, or type a full repo name to add it",
@@ -999,7 +999,7 @@ var DICT = {
999
999
  "subs.meta.match": "Match {matched} / {total}",
1000
1000
  "subs.meta.lastWeek": "Last week {from} ~ {to} · {changed} repos changed",
1001
1001
  "subs.meta.thisWeek": "This week {from} ~ {to} · {changed} repos changed",
1002
- "subs.meta.lastCheck": "Last release check {time}",
1002
+ "subs.meta.lastCheck": "Last subscription check {time}",
1003
1003
  "subs.add": "Add",
1004
1004
  "subs.add.title": "Add a repository",
1005
1005
  "subs.add.exists": "{repo} is already subscribed",
@@ -1063,14 +1063,14 @@ var DICT = {
1063
1063
  "subs.empty.clear": "Clear search",
1064
1064
  "subs.loading": "Loading subscriptions…",
1065
1065
  "subs.input.invalid": "Enter owner/repo form, e.g. vercel/next.js",
1066
- "subs.drawer.title": "Release record · {repo}",
1066
+ "subs.drawer.title": "Change log · {repo}",
1067
1067
  "subs.drawer.close": "Close",
1068
1068
  "subs.drawer.updated": "Updated {date}",
1069
1069
  "subs.drawer.volume": "Volume {index} of {total}",
1070
1070
  "subs.drawer.prevVolume": "Previous volume",
1071
1071
  "subs.drawer.nextVolume": "Next volume",
1072
- "subs.drawer.loading": "Reading the release record…",
1073
- "subs.drawer.empty": "This repo has no release record yet; it appears here after the first weekly check.",
1072
+ "subs.drawer.loading": "Reading the change log…",
1073
+ "subs.drawer.empty": "This repo has no change log yet; it appears here after the first weekly check.",
1074
1074
  "subs.drawer.retry": "Retry",
1075
1075
  "subs.drawer.warn.rate_limited": "Not updated this week (rate limited); the next run retries.",
1076
1076
  "subs.drawer.warn.failed": "Not updated this week (failed); the next run retries.",
@@ -1082,12 +1082,12 @@ var DICT = {
1082
1082
  "weekday.5": "Fri",
1083
1083
  "weekday.6": "Sat",
1084
1084
  "weekday.7": "Sun",
1085
- "subs.param.hint": "Stage behaviour parameters (per-repo limit, tag fallback, period, etc.) are adjusted in the settings page Releases section.",
1086
- "subs.param.link": "Go to Settings → Releases",
1085
+ "subs.param.hint": "Stage behaviour parameters (per-repo limit, tag fallback, period, etc.) are adjusted in the settings page Subscriptions section.",
1086
+ "subs.param.link": "Go to Settings → Subscriptions",
1087
1087
  "overview.tokens.title": "Token usage",
1088
1088
  "overview.tokens.thisRun": "This run",
1089
1089
  "overview.tokens.total": "All-time",
1090
- "overview.releases.title": "Releases",
1090
+ "overview.releases.title": "Subscriptions",
1091
1091
  "overview.releases.new": "New",
1092
1092
  "overview.releases.repos": "Repos",
1093
1093
  "overview.tokens.note": 'The overview surfaces "how many tokens this run spent / all-time accumulated / how many new versions across subscribed repos"; total only, not split by dimension; this run total already includes the subscriptions stage. With an old core that has no data, the corresponding tile is hidden entirely, never shown as 0.',
@@ -1382,9 +1382,13 @@ var CSS = `
1382
1382
 
1383
1383
  /* ——— 周期标签 / 分段 ——— */
1384
1384
  .dshgt-pchip{display:inline-flex;align-items:center;justify-content:center;height:20px;padding:0 8px;border-radius:999px;font-size:11px;font-weight:600;line-height:18px;white-space:nowrap;border:1px solid var(--gt-border);color:var(--gt-muted);background:var(--gt-bg);}
1385
- .dshgt-pchip.daily{color:#2563eb;border-color:#dbeafe;background:#eff6ff;}
1386
- .dshgt-pchip.weekly{color:#7c3aed;border-color:#ddd6fe;background:#f5f3ff;}
1387
- .dshgt-pchip.monthly{color:#0f766e;border-color:#99f6e4;background:#f0fdfa;}
1385
+ /* 周期 / 订阅同族:同一套尺寸与「填充 + 同色描边 + 同色文字」,只差色相。
1386
+ 色值从 --tone 派生到宿主 token,深色主题下不会变成刺眼的浅色贴纸。 */
1387
+ .dshgt-pchip.daily{--tone:#2563eb;}
1388
+ .dshgt-pchip.weekly{--tone:#7c3aed;}
1389
+ .dshgt-pchip.monthly{--tone:#0f766e;}
1390
+ .dshgt-pchip.release{--tone:#b45309;}
1391
+ .dshgt-pchip.daily,.dshgt-pchip.weekly,.dshgt-pchip.monthly,.dshgt-pchip.release{color:color-mix(in srgb,var(--tone) 82%,var(--gt-fg));border-color:color-mix(in srgb,var(--tone) 30%,var(--gt-bg));background:color-mix(in srgb,var(--tone) 12%,var(--gt-bg));}
1388
1392
  .dshgt-period-seg{display:inline-flex;border:1px solid var(--gt-border);border-radius:9px;padding:3px;background:var(--gt-card);gap:3px;}
1389
1393
  .dshgt-period-seg button{display:inline-flex;align-items:center;gap:7px;border:0;background:none;height:30px;padding:0 12px;border-radius:7px;font:inherit;font-size:13px;color:var(--gt-muted);cursor:pointer;}
1390
1394
  .dshgt-period-seg button:hover{color:var(--gt-fg);}
@@ -3464,6 +3468,9 @@ function prStatus(t, state, record) {
3464
3468
  }
3465
3469
  return { label: t("runs.prCreated"), kind: "ok" };
3466
3470
  }
3471
+ function kindChip(text, tone) {
3472
+ return h("span", { className: `dshgt-pchip ${tone}` }, text);
3473
+ }
3467
3474
  function LogDrawer(props) {
3468
3475
  const { t, runId } = props;
3469
3476
  const [loading, setLoading] = import_react.default.useState(true);
@@ -3577,7 +3584,7 @@ function RunsView(props) {
3577
3584
  },
3578
3585
  h("span", { className: `dshgt-lamp ${record.ok ? record.skipped || record.kind === "dry-run" ? "warn" : "ok" : "err"}` }),
3579
3586
  h("span", { className: "dshgt-run-date" }, shortTime(record.at)),
3580
- h("span", { className: `dshgt-pchip ${record.period ?? "daily"}` }, t(`period.${record.period ?? "daily"}`)),
3587
+ kindChip(t(`period.${record.period ?? "daily"}`), record.period ?? "daily"),
3581
3588
  h(
3582
3589
  "span",
3583
3590
  { className: "dshgt-run-what" },
@@ -3608,7 +3615,7 @@ function RunsView(props) {
3608
3615
  detailItem(t, "run.usage.branch", record.branch === void 0 ? "—" : h("span", { className: "dshgt-mono" }, record.branch)),
3609
3616
  detailItem(t, "runs.detail.coreModel", `${record.coreVersion || "—"} · ${record.model?.model ?? "—"}`),
3610
3617
  detailItem(t, "runs.detail.date", record.date ?? "—"),
3611
- detailItem(t, "runs.detail.period", h("span", { className: `dshgt-pchip ${record.period ?? "daily"}` }, t(`period.${record.period ?? "daily"}`))),
3618
+ detailItem(t, "runs.detail.period", kindChip(t(`period.${record.period ?? "daily"}`), record.period ?? "daily")),
3612
3619
  detailItem(
3613
3620
  t,
3614
3621
  "run.usage.pr",
@@ -3736,7 +3743,7 @@ function ReleaseRunItem(props) {
3736
3743
  },
3737
3744
  h("span", { className: `dshgt-lamp ${lamp}` }),
3738
3745
  h("span", { className: "dshgt-run-date" }, shortTime(run.startedAt)),
3739
- h("span", { className: "dshgt-pchip" }, t("runs.type.release")),
3746
+ kindChip(t("runs.type.release"), "release"),
3740
3747
  h(
3741
3748
  "span",
3742
3749
  { className: "dshgt-run-what" },
@@ -327,7 +327,7 @@ function validateSettings(settings, providers = CORE_PROVIDERS) {
327
327
  problems.push({
328
328
  field: "releases.period",
329
329
  code: "CONFIG_INVALID",
330
- message: "\u672C\u7248\u672C\u53EA\u652F\u6301\u6BCF\u5468\uFF08weekly\uFF09\u53D1\u7248\u6458\u8981\uFF0C\u8BF7\u628A releases.period \u6539\u4E3A weekly"
330
+ message: "\u672C\u7248\u672C\u53EA\u652F\u6301\u6BCF\u5468\uFF08weekly\uFF09\u8BA2\u9605\u6458\u8981\uFF0C\u8BF7\u628A releases.period \u6539\u4E3A weekly"
331
331
  });
332
332
  }
333
333
  if (!Number.isInteger(releases.perRepoLimit) || releases.perRepoLimit < 1 || releases.perRepoLimit > 20) {
@@ -349,7 +349,7 @@ function validateSettings(settings, providers = CORE_PROVIDERS) {
349
349
  problems.push({ field: "releases.budgetSeconds", code: "CONFIG_INVALID", message: "budgetSeconds \u5FC5\u987B\u662F auto \u6216 1\u2013300 \u7684\u6574\u6570" });
350
350
  }
351
351
  if (!Number.isInteger(releases.schedule.weekday) || releases.schedule.weekday < 1 || releases.schedule.weekday > 7) {
352
- problems.push({ field: "releases.schedule.weekday", code: "CONFIG_INVALID", message: "\u53D1\u7248\u65E5\u5FC5\u987B\u662F ISO \u661F\u671F 1\u20137\uFF081=\u5468\u4E00\uFF09" });
352
+ problems.push({ field: "releases.schedule.weekday", code: "CONFIG_INVALID", message: "\u8BA2\u9605\u68C0\u67E5\u65E5\u5FC5\u987B\u662F ISO \u661F\u671F 1\u20137\uFF081=\u5468\u4E00\uFF09" });
353
353
  }
354
354
  if (!TIME_RE.test(releases.schedule.time)) {
355
355
  problems.push({ field: "releases.schedule.time", code: "CONFIG_INVALID", message: "\u65F6\u95F4\u683C\u5F0F\u5FC5\u987B\u662F HH:MM \u6216 HH:MM:SS" });
@@ -2407,7 +2407,7 @@ function nextReleaseOccurrence(now, cfg) {
2407
2407
  const candidate = zonedTimeToUtc(year, month, day, hour, minute, second, cfg.timezone);
2408
2408
  if (candidate.getTime() > now.getTime()) return candidate;
2409
2409
  }
2410
- throw new Error(`\u65E0\u6CD5\u8BA1\u7B97\u4E0B\u4E00\u6B21\u53D1\u7248\u8FD0\u884C\u65F6\u523B\uFF08weekday=${String(cfg.weekday)}\uFF09`);
2410
+ throw new Error(`\u65E0\u6CD5\u8BA1\u7B97\u4E0B\u4E00\u6B21\u8BA2\u9605\u8FD0\u884C\u65F6\u523B\uFF08weekday=${String(cfg.weekday)}\uFF09`);
2411
2411
  }
2412
2412
  function isReleaseDue(now, cfg) {
2413
2413
  if (isoWeekdayOf(now, cfg.timezone) !== cfg.weekday) return false;
@@ -4183,10 +4183,10 @@ async function dispatch(method, pathname, url, request, deps) {
4183
4183
  { store: deps.store, env }
4184
4184
  );
4185
4185
  if (!result.ok) {
4186
- throw new IpcError("SUBSCRIBE_FAILED", result.error?.message ?? `\u8BFB\u53D6 ${repo} \u7684\u53D1\u7248\u6587\u6863\u5931\u8D25`);
4186
+ throw new IpcError("SUBSCRIBE_FAILED", result.error?.message ?? `\u8BFB\u53D6 ${repo} \u7684\u53D8\u66F4\u6587\u6863\u5931\u8D25`);
4187
4187
  }
4188
4188
  if (result.doc === void 0) {
4189
- throw new IpcError("SUBSCRIBE_FAILED", `\u6838\u5FC3\u6CA1\u6709\u8FD4\u56DE ${repo} \u7684\u53D1\u7248\u6587\u6863`);
4189
+ throw new IpcError("SUBSCRIBE_FAILED", `\u6838\u5FC3\u6CA1\u6709\u8FD4\u56DE ${repo} \u7684\u53D8\u66F4\u6587\u6863`);
4190
4190
  }
4191
4191
  return { ...result.doc };
4192
4192
  }
@@ -4505,7 +4505,7 @@ function createTrendingRunTool(runner) {
4505
4505
  if (summary.tokens !== void 0) {
4506
4506
  const parts = [`\u672C\u6B21 tokens ${summary.tokens.toLocaleString("en-US")}`];
4507
4507
  if (summary.releases !== void 0 && summary.releases.enabled) {
4508
- parts.push(`\u53D1\u7248 ${summary.releases.newReleases} \u4E2A\u65B0\u7248\u672C / ${summary.releases.repos} \u4E2A\u4ED3\u5E93`);
4508
+ parts.push(`\u8BA2\u9605 ${summary.releases.newReleases} \u4E2A\u65B0\u7248\u672C / ${summary.releases.repos} \u4E2A\u4ED3\u5E93`);
4509
4509
  }
4510
4510
  lines.push(`\xB7 ${parts.join(" \xB7 ")}`);
4511
4511
  }
package/lib/index.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  createTrendingRunTool,
9
9
  createUpdateService,
10
10
  readPluginInfo
11
- } from "./chunk-RB6W2PK7.js";
11
+ } from "./chunk-HYVMRVGP.js";
12
12
  import "./chunk-R7BK7SJK.js";
13
13
 
14
14
  // src/index.ts
package/lib/internal.js CHANGED
@@ -26,7 +26,7 @@ import {
26
26
  tools_exports,
27
27
  update_exports,
28
28
  version_exports
29
- } from "./chunk-RB6W2PK7.js";
29
+ } from "./chunk-HYVMRVGP.js";
30
30
  import {
31
31
  exec_exports
32
32
  } from "./chunk-R7BK7SJK.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morehao/dsh-github-trending",
3
- "version": "0.7.7",
3
+ "version": "0.7.8",
4
4
  "description": "GitHub 趋势日报插件:每天定时 spawn 本地 trendradar 核心,抓取 Trending、生成中文简介与总结,提交到你的仓库并自动合并 PR。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",