DeepSeek Harness Hub
← 返回列表

Shyboy0499/dsh-pr-watch

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

报告你创建的拉取请求自上次检查以来发生的变化——已合并、已关闭或已过期。

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/20 · 已提供中文文档

DeepSeek Harness 插件:报告你创作的拉取请求自上次检查以来的变更——已合并、已关闭或已过期。

综合分
30.8
GitHub 分
30.8
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add Shyboy0499/dsh-pr-watch
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-pr-watch

Status
License
DeepSeek Harness

报告你创建的拉取请求自上次检查以来发生的变化——已合并、已关闭或已过期。

dsh-pr-watch 是一个无依赖的 DeepSeek Harness(dsh)插件,它暴露了一个 agent 工具——pr_watch。它会跟踪你创建的每一个拉取请求,跨所有仓库——包括你从未克隆过的仓库——并且只告诉你自上次查看以来发生的变化。

状态:预发布。 实现已完成:该插件恰好注册
一个工具 pr_watch,整个流水线都由测试
套件覆盖。目前尚未发布到 npm,因此下面的安装命令目前无法
使用。 列出它只是为了明确预期路径,而不是因为它已经
就绪。

- 设计:docs/superpowers/specs/2026-09-10-dsh-pr-watch-design.md
- 计划:docs/superpowers/plans/2026-09-10-dsh-pr-watch.md
- 剩余工作:路线图

目前可用的部分

| 部分                                                        | 状态                                            |
| ----------------------------------------------------------- | ----------------------------------------------- |
| package.json、tsconfig.json、tsdown.config.ts、bundle | ✅ 已就位                                       |
| src/types.ts — PrRecord、Snapshot、Delta、常量      | ✅ 已就位                                       |
| src/delta.ts — 纯 diff 核心                               | ✅ 已就位                                       |
| src/snapshot.ts — 加载、隔离、原子保存                    | ✅ 已就位                                       |
| src/gh-exec.ts — gh 调用与记录映射                      | ✅ 已就位                                       |
| src/tools/watch.ts — 报告渲染器                           | ✅ 已就位                                       |
| src/tools/pr-watch.ts — pr_watch 工具                   | ✅ 已就位                                       |
| src/index.ts — 插件入口(name、inject、apply)      | ✅ 已就位,注册一个工具:pr_watch        |
| CI — typecheck、lint、format、test、build                   | ✅ 每个拉取请求均为绿色                         |
| 已发布到 npm                                                | ⛔ 尚未——安装命令无法使用                       |

今天安装此插件会注册 pr_watch。仍然缺少的是发布本身,而不是工具。

此处有意不列出测试数量。它们在一个拉取请求内就会过时,而 CI 已经按提交报告它们——散文中的数字是没人会重新核对的断言。

为什么
一个 agent 不记得你上次检查的结果,所以每个状态问题都要从头重新推导。对一个 pull request 来说这没问题,对三十个就毫无用处了。真正的摩擦不在于看到你的 pull request——而在于一遍又一遍地重新检查同样的那些,还得记住上次的状态是什么。

pr_watch 通过存储快照并报告增量来弥合这一差距。

功能

已实现,待发布。 以下所有内容均已构建完成,并由测试套件覆盖。
它尚未发布到 npm,因此除了从代码检出安装之外没有其他安装方式——参见安装和
当前可用功能。

| 行为                           | 详情                                                                  |
| ------------------------------ | --------------------------------------------------------------------- |
| 已合并                     | 你提交的一个 pull request 被合并了                                     |
| 未合并即关闭               | 与合并区分开来,不会混为一谈                                          |
| 变为陈旧                   | 14 天无活动(可配置)                                                 |
| 新注意到                   | 出现了一个快照不知道的 pull request                                   |
| 未克隆的仓库               | 通过 owner/repo#number 跟踪,因此永远不需要本地检出                 |
| 报告一次,之后静默         | 合并和陈旧状态在后续检查中不会重复报告                                |

工作原理

朴素的做法——获取打开的 pull request,与快照做 diff——行不通。一个 pull request 一旦合并就离开了打开列表,所以单纯的 diff 无法区分“已合并”和“未合并即关闭”,而且空结果看起来和 gh 调用失败一模一样。

因此 pr_watch 分两个阶段获取:

1. 枚举你提交的每一个打开的 pull request,一次调用完成。
2. 解析每一个离开该集合的快照条目,逐个进行,以了解其最终状态。

只有真正发生变化的 pull request 才会触发第二次调用——通常每次检查为零或一次。

安装

dsh plugin --profile web add dsh-pr-watch

尚未发布,所以这条命令目前无法使用。 这是该包发布后的预期
安装方式。

在此之前,请从代码检出安装。dsh plugin 会将它的参数转发给 profile 目录中的
pnpm,并将相对路径规范锚定到你运行它时所在的
目录,因此本地链接在所有平台上都能工作:

pnpm install && pnpm run build
dsh plugin --profile web add link:.

请从仓库根目录运行。

需要在你的 PATH 中安装并认证 GitHub CLI(gh):

gh auth login

dsh-pr-watch 不存储自己的任何凭据。它完全依赖 gh 自身由密钥环支持的认证。

用法

让 agent 检查你的 pull request,或直接调用该工具。

{
"staleDays": 14,
"all": false
}
典型输出:

✅ Merged (2):
octo/repo#41 — Add Russian locale (last activity 1 day ago)
octo/repo#38 — Fix broken link (last activity 3 days ago)

⏳ Became stale (1):
octo/repo#29 — docs: clarify install steps (last activity 21 days ago)

🆕 Newly noticed (1):
octo/repo#44 — Add MCP server entry (last activity today)

再运行一次,只会出现真正的变化。今天报告过的合并永远不会再次报告。

参数

| 参数        | 类型      | 描述                                                                                                                               |
| ----------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| staleDays | number  | 拉取请求在多少天无活动后算作过期。默认为 14。                                                            |
| all       | boolean | 列出所有打开的拉取请求,而不是只列出发生变化的部分。在首次运行时很有用,此时所有内容都是“新注意到的”。默认为 false。 |

配置

v1 通过上面这两个工具参数暴露所有配置。它不读取任何
设置文件,因此目前没有其他可配置的内容。

| 设置       | 默认值                            | 在 v1 中可设置                    | 用途                                                                |
| ------------- | ---------------------------------- | --------------------------------- | ---------------------------------------------------------------------- |
| staleDays   | 14                               | 是 — 工具参数              | 拉取请求在多少天无活动后被报告为过期          |
| pruneDays   | 90                               | 否 — 编译时常量        | 丢弃在这么久之前达到终态的条目               |
| 快照路径 | $DSH_HOME/pr-watch/snapshot.json | 否 — 从环境派生 | 当 DSH_HOME 未设置时回退到 ~/.dsh/pr-watch/snapshot.json |

设计文档中还出现了另外两个键——
ignoreRepos 和用户可设置的 snapshotPath——但它们推迟到 v2
且尚未实现。要支持它们,需要一个尚不存在的设置加载器,
而且 ignoreRepos 还需要一条规则来从快照中移除被忽略的条目:
一个从枚举中移除但仍保留在快照中的条目将永远无法解决,
因此每次检查都会永远将其报告为 unresolved。完整推理请参见
计划中的细化部分。

行为说明

- 过期在状态转换时触发,且仅触发一次。 一个已经过期数周的拉取请求会在首次越过阈值时被报告,之后便保持安静。如果它出现新的活动,过期计时器会重置,之后可以再次被报告。
- 抓取失败不会写入任何内容。 如果 gh 中途失败,快照会保持原样,因此待处理的更改不会被静默标记为已见。
- 快照以原子方式写入(先写临时文件,再重命名),因此中断的写入绝不会留下一个被读取为“一切消失”的截断文件。
- 损坏的快照会被隔离,绝不会被丢弃。 它会被移动到 snapshot.json.corrupt-,并且工具会在其输出中说明这一点。另一种做法——静默重置——会丢失待处理的更改,且无法将其与“什么都没发生”区分开来。

已知限制

在两次检查之间打开并合并的拉取请求是不可见的。 它不在打开集合中(它已经合并),也不在快照中(拍摄快照时它还不存在),因此两个阶段都看不到它。这是按当前状态而非按活动窗口枚举的直接后果,并且只有在你检查不频繁时才可能发生。修复方案——活动窗口查询——已作为 v2 候选记录在设计文档中。

新评论和审查不会被报告。 “已合并”这样的结果与“维护者回复要求更改”并不相同,而后者往往才是应该改变你下一步行动的依据。这是被推迟而非被忽视:它需要单独的数据源和每个条目的评论游标。

CI 状态不会被报告。

每个 GitHub 身份一个快照。 在第二个账户下运行会共享一个快照,并产生虚假的“新注意到”条目。

路线图

设计已完成,工作被拆分为十五项任务,见
实现计划。

| 状态 | 任务                                                                |
| ----- | -------------------------------------------------------------------- |
| ✅    | 1–3 — 脚手架、类型、测试夹具                              |
| ✅    | 4–7 — 纯 delta.ts 核心                                       |
| ✅    | 8–10 — snapshot.ts:路径解析、加载、隔离、原子保存 |
| ✅    | 11–12 — gh-exec.ts:调用、记录映射、错误处理     |
| ✅    | 13–14 — renderWatch() 和 pr_watch 工具,然后注册   |
| 🔜    | 15 — 构建接线、README、发布准备                       |

剩余工作是发布,而不是功能:该包尚未发布,因此 dsh plugin --profile web add dsh-pr-watch 还无法解析。

开发

pnpm install
pnpm run build        # tsdown → lib/
pnpm test             # vitest — no network access
pnpm run lint         # oxlint
pnpm run typecheck    # tsc --noEmit
pnpm run format       # prettier --write .

测试套件不发起网络请求,也从不运行 gh。delta.ts 和
tools/watch.ts 是纯的——没有文件系统、没有网络、没有时钟——并且每个 IO
模块都将其依赖项作为参数,因此整个流水线由
使用 fixtures 和注入的 executors,而不是 mocks。

要检查构建产物而不是源代码,请运行 pnpm run build,然后加载 lib/index.js:它必须导出 name、inject、apply,以及一个恰好包含一个条目的 tools 数组。pnpm pack 应生成一个 tarball,其中仅包含 lib/index.js、cordis.patch.yml、package.json、README.md、LICENSE 和 SECURITY.md。

在 Windows 上,pnpm 使用符号链接来组织 node_modules,这需要开发者模式或提升权限的 shell;否则,安装会失败并报 EPERM。npm 缓存和存储通过 .npmrc 重定向到仓库内部,因此不会在检出目录之外写入任何内容。

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(Shyboy0499)的其他插件

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群