@morehao/dsh-github-trending 0.7.9 → 0.7.10

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.7.10] - 2026-11-01
4
+
5
+ > 修复 peer / engine 版本区间漏掉 `0.2.2-*` 预发布的问题,让插件在宿主升到 `0.2.2` 线后仍能正常安装。
6
+
7
+ ### 修复 — 预发布版本被静默排除
8
+
9
+ - `package.json` 的 `peerDependencies["@deepseek-ai/dsh-tools"]` 与 `engines.dsh` 由 `>=0.2.1-rc.3 <0.3.0-0` 改为 `>=0.2.1-rc.3 <0.3.0-0 || >=0.2.2-alpha.0 <0.3.0-0`。
10
+ - 原因:node-semver 只有在范围的某个比较符与版本的 `major.minor.patch` 元组一致、且该比较符自身带预发布标签时才放行预发布版。原范围只在 `0.2.1` 元组上带预发布标签,于是 `0.2.2-alpha.2`、`0.2.9-rc.1` 等非 `0.2.1` 元组的预发布版会被静默排除,用户 `npm install` 时撞上 `ERESOLVE`。
11
+ - 补一条 `0.2.2` 元组的显式预发布分支后,已发布的 `0.2.2-alpha.2` 与后续 `0.2.2-*` 均可正常匹配;`0.3.0-*` 仍被排除。
12
+
3
13
  ## [v0.7.9] - 2026-11-01
4
14
 
5
15
  > 内部重构:把重复的通用实现收敛到共享底座 `@morehao/dsh-plugin-kit@^0.3.1`。对外接口与业务语义保持不变。
package/README.md CHANGED
@@ -1,21 +1,61 @@
1
- # dsh-github-trending
1
+ <p align="center">
2
+ <img src="icon.svg" alt="dsh-github-trending logo" width="88" height="88">
3
+ </p>
2
4
 
3
- [![check](https://github.com/morehao/dsh-github-trending/actions/workflows/check.yml/badge.svg)](https://github.com/morehao/dsh-github-trending/actions/workflows/check.yml)
4
- [![npm version](https://img.shields.io/npm/v/@morehao/dsh-github-trending.svg)](https://www.npmjs.com/package/@morehao/dsh-github-trending)
5
+ <h1 align="center">dsh-github-trending</h1>
5
6
 
6
- > GitHub 趋势榜的 **DSH 入口**:按日/周/月周期定时 spawn 本地 [`trendradar`](https://github.com/morehao/trendradar) 核心,抓取 Trending、生成中文简介与周期总结,提交到你自己的仓库并自动合并 PR。
7
+ <p align="center">
8
+ GitHub 趋势榜的 DeepSeek Harness 插件
9
+ </p>
7
10
 
8
- **状态:0.3.0。** 插件侧(配置、调度、核心调用、状态与工作台、两个工具)已完成。核心二进制走 **GitHub Release**:首次运行按 `os/arch` 下载、用 `checksums.txt` 校验 sha256、缓存到插件数据目录,之后离线复用。核心仓库打 tag 出资产之前,运行会明确报 `CORE_NOT_DOWNLOADED` / `CORE_UNAVAILABLE` 并给出下载地址——不会写空文件,也不会退回旧内容。
11
+ <p align="center">
12
+ <a href="https://github.com/morehao/dsh-github-trending/actions/workflows/check.yml"><img alt="check" src="https://github.com/morehao/dsh-github-trending/actions/workflows/check.yml/badge.svg"></a>
13
+ <a href="https://www.npmjs.com/package/@morehao/dsh-github-trending"><img alt="npm version" src="https://img.shields.io/npm/v/@morehao/dsh-github-trending.svg"></a>
14
+ </p>
9
15
 
10
- ## 它做什么
16
+ GitHub 趋势榜的 **DeepSeek Harness 插件**:按日 / 周 / 月周期定时生成趋势日报,交给本地 [`trendradar`](https://github.com/morehao/trendradar) 核心抓取 Trending、写中文简介与周期总结,并自动提交到你自己的仓库、开 PR 合并。你在工作台里看状态、读榜单、管理订阅,不用盯命令行。
11
17
 
12
- - 按你设定的时间(IANA 时区)每天跑一次;从侧栏入口进入工作台,点「立即运行」
13
- - 一次运行 = **spawn 一次本地核心**:抓取 → 模型总结 → 渲染 → commit → push → PR → 合并,全部由核心完成
14
- - 插件只负责:收集配置、调度、传配置与密钥、展示结果与错误、记录最近 90 次运行
15
- - 内容按核心产出的成品**原样**落地(canonical),插件不改写、不重排、不二次调用模型
16
- - 工作台分「概览 / 榜单 / 运行记录 / 设置」:概览回答下次运行、就绪检查与上次交付;榜单按周期(日 / 周 / 月)分别回看;运行记录可展开交付物、按周期筛选并看只读日志
18
+ ## 定位
17
19
 
18
- **它不做什么**:不抓 GitHub、不解析 HTML、不调模型(回环代理模式除外)、不渲染内容、不执行 git。这些只有核心一处实现,避免两份实现漂移。
20
+ - **它是入口,不是引擎**。抓取、解析、模型总结、渲染、git 与 PR 全在本地 `trendradar` 核心一处实现;插件只负责**配置、调度、spawn 核心、展示结果**,避免两份实现漂移。
21
+ - **成品原样落地**。内容按核心产出的 canonical 逐字节写入,插件不改写、不重排、不二次调用模型。
22
+ - **本地运行、无遥测**。核心在你的机器上跑;插件没有云端账号,密钥只经运行时通道交给核心,不写配置文件、不进日志。
23
+
24
+ > 需要什么、配置项、错误码、订阅阶段、实现细节等深入内容见 **[docs/reference.md](docs/reference.md)**。
25
+
26
+ ## 功能说明
27
+
28
+ 工作台从侧栏「GitHub 趋势」或 `设置 → GitHub 趋势` 进入,分五个视图:
29
+
30
+ ### 概览
31
+
32
+ 一屏回答「下次什么时候跑、四项就绪检查是否齐、上次交付了什么」。顶部是插件身份条(版本 / 包名 / 检查更新),右侧常驻下次运行与就绪 N/4。
33
+
34
+ ![概览](docs/images/overview.png)
35
+
36
+ ### 榜单
37
+
38
+ 按周期(日榜 / 周榜 / 月榜)回看历史榜单,直接渲染 Markdown(标题、列表、表格、链接),也可切「原文」。只有保留了预览副本的期数能读;失败 / 无变更 / 试跑 / 旧记录各有空状态。
39
+
40
+ ![榜单](docs/images/digest.png)
41
+
42
+ ### 运行记录
43
+
44
+ 最近 30 次运行,按成功 / 失败 / 试跑筛选;展开某条看交付物(提交、内容哈希、分支、PR 链接)与只读日志,页脚给累计 token。
45
+
46
+ ![运行记录](docs/images/runs.png)
47
+
48
+ ### 设置
49
+
50
+ 内容来源 / 模型 / 仓库 / 认证 / 榜单 / 调度 六个分区,每个分区独立保存与校验;某分区有未保存改动时左侧对应项显示黄点。
51
+
52
+ ![设置](docs/images/settings.png)
53
+
54
+ ### 订阅
55
+
56
+ (可选)订阅一组仓库,每周把每个仓库当周新增的 Release 合成一段中文摘要,与榜单同分支、同 PR 一起提交;订阅列表随数据仓版本化,可审计、可复现。
57
+
58
+ ![订阅](docs/images/subscriptions.png)
19
59
 
20
60
  ## 安装
21
61
 
@@ -23,173 +63,25 @@
23
63
  dsh plugin --profile <profile> add @morehao/dsh-github-trending
24
64
  ```
25
65
 
26
- 装完重启宿主,在「设置 → GitHub 趋势」或侧栏入口进入。
66
+ 装完重启宿主,从侧栏「GitHub 趋势」或 `设置 → GitHub 趋势` 进入。
27
67
 
28
- ## 三步上手
68
+ ### 三步上手
29
69
 
30
70
  1. **选仓库**:填本地 git 仓库的绝对路径(插件不替你 `git init`,不是仓库就报 `REPO_NOT_GIT`)。
31
71
  2. **填模型**:点「沿用 DSH 配置」从宿主 provider 目录里挑 provider 与模型;可导出密钥的直接传给核心,OAuth 类凭据走本机回环代理。
32
72
  3. **试跑一次**:「试跑(不提交)」只抓取与渲染,不写文件、不提交。
33
73
 
34
- > **重新生成(忽略缓存)**:手动「重新生成」会忽略核心持久化的摘要缓存,强制重新抓取与总结,并让榜单页以本次结果为准。若重新生成后内容与分支上已有产物逐字节相同,核心仍按 append-only 语义**不新增提交**(面板提示「内容无变化,未新增提交」);内容有变化才追加一个提交。定时运行永不强制重跑。
35
-
36
- > 设置页分「内容来源 / 模型 / 仓库 / 认证 / 榜单 / 调度」六个 tab;**除「内容来源」(只有状态与核心操作,没有可保存字段)外,每个 tab 独立保存与校验**;某个 tab 有未保存改动时,左侧对应 tab 会显示黄点。
37
-
38
- ## 榜单预览与按周期回看
39
-
40
- - 运行成功后,Host 从核心本次返回的 `outcome.files` 里挑当天的 `.md`(优先 `YYYY-MM-DD.md`,否则只有一个 `.md` 时用它),**只读**复制到 `$DSH_HOME/github-trending/previews/<runId>.md`:路径必须在 `repo.path` 内(词法 + realpath 各判一次)、不超过 512 KB、sha256 与契约声明一致;失败不阻断运行,只是这次没有预览。
41
- - 预览副本 0600、临时文件 + rename、最多保留 90 份;`state.json` / `history.json` 只存 `file` / `bytes` / `sha256` 元数据,不存正文。
42
- - `GET /preview?id=<runId>` 只接受历史里出现过的 id、不接路径参数;返回 `{ text, truncated }`。客户端渲染 Markdown 子集(标题 / 段落 / 列表 / 引用 / 代码块 / 表格(GFM 管道表,含列对齐)/ 粗体 / 行内代码 / 链接 / 分隔线),**只生成 React 文本节点**,链接仅放行 http(s),不渲染图片或原始 HTML;也可以切「原文」。
43
- - 榜单视图按周期分三段(日榜 / 周榜 / 月榜),各周期一条独立时间线:日榜列最近 30 天有记录的日期、每天一条;周榜按 ISO 周、月榜按月。同一期多次运行只保留一条(优先成功且有预览的)。默认打开当前周期最近一期有预览的期数;失败 / 无变更 / 试跑 / 旧记录 / 副本被清理都有各自的空状态,不用示例内容兜底。
44
- - 预览是运行结束时的派生副本:你在仓库里事后编辑 canonical 文件,不会改变这次记录。
45
- - 工作台顶部第一行是插件身份条:名称 / 版本 / 完整包名(点击复制)/ GitHub 外链 / 检查更新(就地状态);第二行是横向 tab(概览 / 榜单 / 运行记录 / 订阅 / 设置),右侧常驻下次运行与就绪 N/4。点版本号可打开「关于」弹层。包名 / 版本 / GitHub 来自 `/state.plugin`(`repository` 由 `package.json` 规范化),仓库缺失时隐藏外链。
46
-
47
- ## 用量(token)
48
-
49
- - **每次运行的 token 总量**与**历史累计总量**都会记录。**只展示总用量,不拆** prompt / completion / cached 等维度。
50
- - 「本次任务总量」= 榜单摘要阶段(`usage.totalTokens`)+ 订阅阶段(`releases.usage.totalTokens`),**订阅消耗计入总量**。
51
- - 累计 = 历史里全部运行 `tokens` 之和,**读时求和、不落盘**(`history.json` 只存每次的 `tokens`)。
52
- - 插件**不做费用估算、不内置定价表**(价格随 provider / 区域变动,易过期):只展示核心回报的 token 真值。
53
- - 展示位置:概览速览块(本次 / 累计 / 新版本 / 订阅仓库数)、运行记录(每行本次 tokens、展开明细、页脚累计)、历史。数据来自契约 `Usage`。旧核心无 `usage` / `releases` 时对应速览块整体隐藏(不铺「—」、不伪造 0)。
54
-
55
- ## 订阅(`releases` 阶段)
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*` 消费。
58
- - **订阅列表随数据仓版本化**:文件在 `<repo>/<OutputRoot(output.dir)>/subscriptions.yaml`,随产物同一次 commit / PR,可审计、可复现。
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=`);「设置 → 订阅」分区放行为参数与每周触发节奏。
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` 块时缺省。
64
-
65
-
66
-
67
- - 顶部身份条的「检查更新」与「关于」弹层都会显示当前版本与 npm 上的最新版:首次挂载静默检查一次(Host 侧缓存 5 分钟),也可以点「检查更新」强制重查;有新版时身份条就地显示「有新版本 vX」+「更新到 vX」。只跟随 npm 的 `latest` 稳定版。
68
- - 确认后由宿主 `pluginManager` 重装本插件(`installBundle`;已装同 spec 时走 `removeBundle → installBundle`,失败会尝试装回原版本),完成后需要重启 DSH 生效。
69
- - 本地安装(`link:` / `file:` / `workspace:`)**不提供一键更新**:那会把开发链接换成 npm 版。此时只显示 `dsh plugin --profile <name> add @morehao/dsh-github-trending@latest` 供复制。
70
- - 更新引擎来自共享包 [`@morehao/dsh-plugin-kit`](https://www.npmjs.com/package/@morehao/dsh-plugin-kit)(`./update` + `./update/client`),本仓只做上下文与 `execCapture` 接线;`GET /update` / `POST /update` 与其它路由一样要求自定义头、`no-store`,业务失败返回 409 + `UPDATE_FAILED` + `updateCode`。
71
-
72
- ## 它需要什么 / 它访问哪里 / 它不上传什么
73
-
74
- **需要什么**
75
-
76
- - DSH `0.2.1-rc.3` 以上(`engines.dsh`),Node.js `^22.20.0 || >=24.0.0`(`.nvmrc` 钉 22 线;CI 与发布跑 22)
77
- - 一个本地 **git 仓库**(提交目标)与可写的远端
78
- - 模型:provider + 模型 ID + 密钥(或用宿主已配置的 provider;OAuth 类凭据不需要密钥)
79
- - Git 与 GitHub 凭据(本机 `gh` 登录态 / PAT),仅 push 与开 PR 需要
80
- - 核心二进制:首次运行从 `github.com/morehao/trendradar/releases` 下载(按 `os/arch`,sha256 校验后缓存);之后离线复用。开发/排障时可用 `TRENDING_DIGEST_CORE`(或设置里的「核心路径」)指向一个可执行的 `trendradar`,此时完全不下载
81
-
82
- **访问哪里**
83
-
84
- - 本地核心进程(一次性的 `run` 子进程)
85
- - `github.com/morehao/trendradar/releases`:仅首次运行(或点「下载核心」)时下载二进制与其 `checksums.txt`;之后不再联网
86
- - 你配置的模型端点(由**核心**发起,插件不代发)
87
- - `api.github.com`(由**核心**发起 push/PR;插件本身不发 GitHub 请求)
88
- - 本机 `127.0.0.1` 上的临时回环代理(仅当宿主 provider 的凭据不可导出时,端口随机、一次性 token、运行结束即关闭)
89
-
90
- **不上传什么**
91
-
92
- - 不向作者控制的任何服务器发送数据;插件没有遥测、没有云端账号
93
- - 不读取、不上传与你配置无关的仓库内容;核心只在目标仓库里写 `output.dir` 下的文件;插件唯一的仓库读取是运行成功后按清单复制当天 `.md` 预览副本(见上节),只读、不 commit、不改工作树
94
- - 密钥与 token 只经 `ctx.credentials` 解析、只经运行时通道交给核心:**不写配置文件、不进日志、不进 argv**
95
-
96
- ## 配置
97
-
98
- 设置写在 `$DSH_HOME/github-trending/settings.json`(0600),**不含任何密钥**。
99
-
100
- | 键 | 默认 | 说明 |
101
- |---|---|---|
102
- | `model.provider` | `deepseek` | `deepseek` / `openai-compatible`(以核心 `version --json` 的 `supportedProviders` 为准) |
103
- | `model.mode` | `direct` | `direct` = 密钥直传核心;`proxy` = 本机回环代理转发宿主模型 |
104
- | `model.baseURL` | 空 | 空则用 provider 默认端点;代理模式由插件注入 |
105
- | `model.model` | 空 | 必填,不设隐式默认 |
106
- | `model.apiKeyRef` | `TRENDING_MODEL_KEY` | 指向 `ctx.credentials` 的引用名 |
107
- | `model.temperature` / `maxTokens` | `0.2` / `2048` | 单次调用参数 |
108
- | `model.allowDegraded` | `true` | 模型失败时核心是否退回原文(会标记 degraded) |
109
- | `repo.path` | 空 | 本地仓库绝对路径,必填 |
110
- | `repo.baseBranch` | 读取仓库默认分支 | 只读展示,不允许手改(以 `origin/HEAD` 为准) |
111
- | `repo.remote` | `origin` | 固定 `origin`,界面不展示 |
112
- | `repo.commitMode` | `branch` | `branch`(分支 + PR)/ `direct` |
113
- | `pr.enabled` / `autoMerge` | `true` / `true` | |
114
- | `pr.titleTemplate` | `chore(trending): add {date} digest` | 默认规则,界面不展示 |
115
- | `github.authMode` | `gh` | `gh`(本机 gh 登录态)/ `pat` |
116
- | `github.tokenRef` | `GITHUB_TOKEN` | `ctx.credentials` 引用名(`pat` 用) |
117
- | `trending.since` / `languages` / `topN` | `daily` / `all,typescript,python,go,rust` / `25` | `since` 是单次运行周期(`daily`/`weekly`/`monthly`,抓取窗口=标的周期由核心保证);实际支持范围由核心决定 |
118
- | `summarize.batchSize` / `maxRetries` | `10` / `1` | 摘要批量与失败重试(映射核心 `summarize.*`) |
119
- | `summarize.enrich` | `none` | `none` / `repo` / `readme`:是否抓取 GitHub topics / README 作为增强上下文;`repo`/`readme` 建议配只读 `GITHUB_READ_TOKEN` |
120
- | `summarize.readmeChars` | `800` | README 摘录长度(enrich=readme 时) |
121
- | `releases.includePrerelease` / `includeDrafts` | `false` / `false` | 是否含预发布 / 草稿(订阅阶段常开,不提供 `enabled` 开关) |
122
- | `releases.fallbackToTags` / `baselineOnFirstRun` | `true` / `true` | 无 Release 时回退 Tag / 首次只记基线 |
123
- | `releases.perRepoLimit` / `maxNotesChars` | `10` / `4000` | 文档列出的版本条数(1–20)/ notes 截断(500–20000) |
124
- | `releases.summaryMaxChars` / `docMaxLines` | `1200` / `600` | 每仓每周摘要字数(500–2000)/ 文档行数预算(100–2000,超了开新卷) |
125
- | `releases.concurrency` / `budgetSeconds` | `auto` / `auto` | 订阅并发(`auto` 或 1–8)/ 模型预算秒(`auto` 或 1–300);`auto` 由插件按订阅数解析 |
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** |
128
- | `output.dir` | `trending` | 仓库内相对目录 |
129
- | `schedule.enabled` / `time` / `timezone` | `true` / `08:30:00` / `Asia/Shanghai` | 插件自己的 60 s tick 驱动 |
130
- | `schedule.periods` | `daily,weekly,monthly` | 定时自动产出的周期:默认三周期全产出(无需勾选),日=每天、周=周日、月=月末触发;旧配置自动升级为三周期 |
131
- | `corePath` | 空 | 等价于 `TRENDING_DIGEST_CORE`(仅开发/排障,界面不提供入口,用环境变量或直接改 `settings.json`;设了就完全不下载) |
132
- | `coreAutoDownload` | `true` | 缓存缺失时是否自动下载核心;关掉后只报 `CORE_NOT_DOWNLOADED`,由你在设置页点「下载核心」 |
133
-
134
- ## 两个工具
135
-
136
- | 工具 | 参数 | 返回 |
137
- |---|---|---|
138
- | `trending_run` | `{ dryRun?: boolean, date?: string, period?: 'daily'\|'weekly'\|'monthly', force?: boolean }` | 结构化摘要:文件数、commit/分支、PR、内容哈希、错误码与下一步 |
139
- | `trending_history` | `{ limit?: number }` | 上次/下次运行、最近 N 条记录、核心版本、模型、未合并 PR |
140
-
141
- 工具名是稳定对外接口:**只新增不改名**。
142
-
143
- ## 错误码
144
-
145
- | 码 | 含义 | 下一步 |
146
- |---|---|---|
147
- | `CORE_NOT_DOWNLOADED` | 核心还没下载(缓存为空,且自动下载被关或尚未触发) | 设置页点「下载核心」,或指向可执行的 `trendradar` |
148
- | `CORE_CHECKSUM_MISMATCH` | 下载内容的 sha256 与 `checksums.txt` 不符(已被丢弃) | 重试;仍失败则手动下载放到缓存目录(代理可能改写内容) |
149
- | `CORE_UNAVAILABLE` | 下载失败 / 版本还没发布(404)/ 平台不在矩阵 / 覆盖路径无效 | 按提示里的 URL 与发布顺序处理 |
150
- | `CORE_INCOMPATIBLE` | 核心 `ipcSchema`/`digestSchema` 与插件不一致 | 升级插件(含平台包)到同一版本 |
151
- | `CORE_TIMEOUT` / `CORE_CANCELLED` | 超时 / 用户取消 | 不提交任何状态,也留不下半成品 |
152
- | `IPC_INVALID` | 核心 stdout 不是约定的结果信封 | 升级插件与核心 |
153
- | `MODEL_KEY_MISSING` / `MODEL_UNAUTHORIZED` / `MODEL_NOT_FOUND` / `MODEL_RATE_LIMITED` | 模型侧 | 设置页「模型」区红字 + 重新选择 |
154
- | `GIT_NOT_INSTALLED` / `REPO_NOT_GIT` / `REPO_DIRTY` | 本机 git / 仓库状态 | 装 git ≥ 2.30、换仓库、先提交改动 |
155
- | `GIT_OPERATION_FAILED` | 核心执行 git 失败(含 push 被拒) | 核心对 `trending/` 日期分支只追加提交、普通 fast-forward 推送;被拒时自动 fetch + rebase 重试一次。若报 `stale info`:在仓库执行 `git fetch --prune origin` 后重试(升级核心后不再出现) |
156
- | `GITHUB_AUTH` / `PUSH_FAILED` / `PR_FAILED` / `NOT_MERGEABLE` | 推送与 PR | 本地 commit 已保留,修好后重试即可复用 |
157
- | `FETCH_FAILED` / `FETCH_RATE_LIMITED` | 抓取 | 检查网络/代理或稍后重试 |
158
-
159
- 核心只在 stderr 给出 `error: <CODE>: ...` 文本;插件优先取核心自己的码,取不到时按稳定文本特征归类,并在结果里标 `inferred: true`(界面会注明「错误码由插件推断」)。
160
-
161
- 运行结果还会带 `skipReason`(`merged` / `pr-closed` / `unchanged`)与 push 失败的 `reason`(`stale-lease` / `non-fast-forward` / `auth` / `protected` / `hook` / `pathspec`)。定时运行(`TRENDRADAR_TRIGGER=schedule`)尊重人工关闭的 PR,不重建分支;手动运行才会重开。
162
-
163
- ## 与本地 CLI 共存
164
-
165
- - 插件**永远使用自带的平台包**,不从 `PATH` 解析核心
166
- - 运行前探测 `PATH` 上的 `trendradar`,版本/协议不一致只**提示**,不切换、不接管它的 cron/launchd
167
- - 首次可在设置页「从本机 CLI 导入」一次性导入非敏感字段;**密钥不导入**
168
- - 别让两套定时同时开着:内容侧靠 `contentHash` 与 PR 复用兜底,模型消耗无法兜底
169
-
170
- ## 实现说明(0.3.0)
171
-
172
- 1. **结果信封**:核心 `run --config <path> --json` 输出契约 v2 `RunResult`(`ipcSchema=2`,可选 `branch/commit/prUrl/contentHash`);插件只解析这一种形状,旧核心的 `runOutput` 不再兼容。
173
- 2. **密钥传输**:POSIX 上配置经 **FIFO** 交给核心(文件系统里不出现明文);Windows 无 FIFO,退化为 0600 临时文件并在读完后立即删除。
174
- 3. **GitHub token** 经子进程环境变量传给核心(核心只认 `GITHUB_TOKEN`/`GH_TOKEN`);不进 argv、不进配置、不进日志。
175
- 4. **调度**用插件自己的 60 s tick(宿主 `schedule` 是会话本地提醒,覆盖不到无人值守场景)。按 `schedule.periods` 分别触发:日榜每天、周榜周日(ISO 周末)、月榜月末;去重键含周期与本地日期,同一周期当天只成功一次。
176
- 5. **二进制改为下载**(2026-10-30 决策 B):不再随包发 npm 平台分包。首次运行需要能访问 GitHub Release;断网环境请用 `TRENDING_DIGEST_CORE` 指向本地核心。核心版本由 `package.json` 的 `dsh.core.version` 固定(用 `node scripts/set-core-version.mjs <x.y.z>` 写入)。
177
- 6. **核心版本固定**:`package.json` 的 `dsh.core.version` 是首次运行下载哪个核心 Release 的唯一来源(用 `node scripts/set-core-version.mjs <x.y.z>` 写入);下载失败会给出下载地址与错误码,不会退回旧内容。
178
- 7. **预览副本是派生数据**:不是第二份真相;仓库里的 canonical 文件才是。旧记录没有 `preview` 元数据,日报里只能看到对应的空状态,不承诺回填。
74
+ 环境要求:DSH `0.2.1-rc.3` 以上、Node.js `^22.20.0 || >=24.0.0`、本地 git ≥ 2.30 与可写远端、git/GitHub 凭据(仅 push 与开 PR 需要)。核心二进制首次运行从 GitHub Release 下载并按 sha256 校验,之后离线复用。
179
75
 
180
76
  ## 开发与发版
181
77
 
182
78
  ```bash
183
79
  npm install
184
- npm run check # typecheck + 契约校验 + 构建 + 全部测试
185
- node scripts/ac/run.mjs # AC-P-01…13 的机械部分
80
+ npm run check # typecheck + 契约校验 + 构建 + 全部测试
81
+ node scripts/ac/run.mjs # AC-P 机械检查
186
82
  ```
187
83
 
188
- 发版走 **tag 触发的 CI**(Trusted Publishing / OIDC,不需要 npm token):合并 PR → 在 `main` 打注记 tag `vX.Y.Z` → CI 发 npm 并用注记正文建 Release。细节见 [docs/publishing.md](docs/publishing.md)。
189
-
190
- - 契约来源:类型与校验器来自 npm 包 `@morehao/trendradar-contract`(`dependencies` 精确锁定;wire `ipcSchema=2` / `digestSchema=2`);本地不再保留 `contract/` 快照与生成器;`npm run check:contract` 校验包版本与 wire 版本
191
- - 核心下载与缓存:`src/core/release.ts`(`ensureCore`),缓存位置 `$DSH_HOME/github-trending/core/v<version>/`
192
- - 宿主半 `src/`(tsup → `lib/`),客户端半 `client/`(esbuild → `client.js`,`window.__ModuleLoader__.load`)
84
+ 发版走 **tag 触发的 CI**(Trusted Publishing / OIDC):合并 PR → 在 `main` 打注记 tag `vX.Y.Z` → CI 发 npm 并用注记正文建 Release。细节见 [docs/publishing.md](docs/publishing.md)。
193
85
 
194
86
  ## 许可
195
87
 
package/client.js CHANGED
@@ -47,7 +47,7 @@ module.exports = __toCommonJS(index_exports);
47
47
  var DICT = {
48
48
  zh: {
49
49
  "section.title": "GitHub 趋势",
50
- "section.subtitle": "每天定时把 GitHub Trending 抓取、总结并提交到你的仓库;内容全部由本地核心产出。",
50
+ "section.subtitle": "按日 / 周 / 月定时抓取、总结 GitHub Trending 并提交到你的仓库;内容全部由本地核心产出。",
51
51
  "tab.settings": "设置",
52
52
  "tab.runs": "运行",
53
53
  "st.source": "内容来源",
@@ -576,7 +576,7 @@ var DICT = {
576
576
  },
577
577
  en: {
578
578
  "section.title": "GitHub Trending",
579
- "section.subtitle": "Fetch, summarize and commit GitHub Trending into your own repo on a daily schedule. All content comes from the local core binary.",
579
+ "section.subtitle": "Fetch, summarize and commit GitHub Trending (daily / weekly / monthly) into your own repo on a schedule. All content comes from the local core binary.",
580
580
  "tab.settings": "Settings",
581
581
  "tab.runs": "Runs",
582
582
  "st.source": "Source",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@morehao/dsh-github-trending",
3
- "version": "0.7.9",
4
- "description": "GitHub 趋势日报插件:每天定时 spawn 本地 trendradar 核心,抓取 Trending、生成中文简介与总结,提交到你的仓库并自动合并 PR。",
3
+ "version": "0.7.10",
4
+ "description": "GitHub 趋势日报的 DeepSeek Harness 插件:按日 / 周 / 月周期定时 spawn 本地 trendradar 核心,抓取 Trending、生成中文简介与周期总结,并可选把订阅仓库的新 Release 合成中文摘要,一起提交到你的仓库、自动开 PR 合并;内置概览 / 榜单 / 运行记录 / 订阅 / 设置工作台。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -39,10 +39,10 @@
39
39
  ],
40
40
  "engines": {
41
41
  "node": "^22.20.0 || >=24.0.0",
42
- "dsh": ">=0.2.1-rc.3 <0.3.0-0"
42
+ "dsh": ">=0.2.1-rc.3 <0.3.0-0 || >=0.2.2-alpha.0 <0.3.0-0"
43
43
  },
44
44
  "peerDependencies": {
45
- "@deepseek-ai/dsh-tools": ">=0.2.1-rc.3 <0.3.0-0"
45
+ "@deepseek-ai/dsh-tools": ">=0.2.1-rc.3 <0.3.0-0 || >=0.2.2-alpha.0 <0.3.0-0"
46
46
  },
47
47
  "peerDependenciesMeta": {
48
48
  "@deepseek-ai/dsh-tools": {