Add the experimental forge capability seam: - dsh-experimental-forge: provider-neutral repository and change request references, a provider registry, and shared status polling. Watchers of one change request share one loop; each forge has one batched fetch in flight, and the cadence follows check, mergeability, and lifecycle state. - dsh-experimental-forge-github: GitHub provider that runs the GitHub CLI on the host with a scrubbed environment and reads every due pull request of a host in one GraphQL query. - dsh-experimental-forge-session: a host-only projection derives Session bindings from gh pr create and git push shell results and from plugin:forge-session/binding records; push results trigger head-branch discovery of open pull requests, and Session watchers poll bound change requests through ctx.forge.
5.0 KiB
description, kind
| description | kind |
|---|---|
| 通过宿主上的 GitHub CLI 为实验性 forge 注册表服务 GitHub 主机。 | package-reference |
@deepseek-ai/dsh-experimental-forge-github
English | 中文
概述
借助宿主上已登录的 GitHub CLI,为 ctx.forge 读取 GitHub 与 GitHub Enterprise 的 pull request。每次轮询对每个主机只发一个 GraphQL 查询,读取所有到期 pull request 的状态、检查、评审结论、可合并性与未解决的评审讨论。
目录
使用本包
在 forge 注册表之后挂载提供方,并显式列出每个 GitHub Enterprise 主机。
- name: '@deepseek-ai/dsh-experimental-forge'
- name: '@deepseek-ai/dsh-experimental-forge-github'
config:
hosts: [github.com, ghe.example.com]
即使 Session 在其他执行环境中运行命令,提供方也以宿主进程的形式运行 gh。每个主机执行一次 gh auth login --hostname <host> 完成登录。子进程继承的宿主环境去掉了 DSH_* 变量以及名称包含 KEY、PASSWORD、SECRET 或 TOKEN 的变量,因此 GH_TOKEN 与 GITHUB_TOKEN 不会被转发,gh 使用自己的凭据存储。交互提示、更新提醒、分页器与颜色输出均被关闭。ghCommand、hosts、timeoutMs 与 maxOutputBytes 见配置目录。
当主机在配置中时,提供方服务 https、http、ssh、git 形式的远端 URL,以及 [email protected]:owner/name.git 这类 scp 形式。它服务 https://<host>/<owner>/<name>/pull/<number> 形式的 pull request URL,允许其后附带任意路径、查询或片段,并以去掉这些后缀的形式作为规范 URL。按 head 分支查找时,最多返回 20 个以该分支为 head 的打开状态 pull request,按创建时间从新到旧排列,不包含来自 fork 的 pull request;查找默认分支时返回空结果。
检查运行(check run)在完成前映射为 pending,完成后映射为 success、failure(失败、超时、启动失败或需要操作)、cancelled、skipped 或 neutral。提交状态上下文把 SUCCESS 映射为 success,把 FAILURE 与 ERROR 映射为 failure,其余状态均映射为 pending。GraphQL 的 NOT_FOUND 错误转为 not-found 失败。gh 没有输出 JSON 时,提到身份验证或 gh auth login 的诊断转为 unauthenticated,其他诊断转为 unavailable。
了解实现
实现细节——点击展开
一次读取按主机对引用分组,每个主机发送一个 gh api graphql 查询。查询内联经过校验的 owner、name 与编号,并为每个 pull request 设置别名,因此局部 GraphQL 错误只影响对应的别名。出现局部错误时 gh 以非零状态退出,但仍会输出完整响应;提供方先解析该响应,再检查退出码。
| 源码 | 职责 |
|---|---|
src/index.ts |
配置校验与提供方注册 |
src/provider.ts |
URL 映射、按主机分组与失败分类 |
src/graphql.ts |
构造查询,并校验和映射响应 |
src/gh.ts |
在宿主上执行 gh,清理环境变量并施加限制 |
src/urls.ts |
解析远端 URL 与 pull request URL |
深入探索
模型体验
无:提供方为宿主侧监听方读取 pull request 状态,不贡献模型上下文。
KV Cache 影响
无。提供方的输出只到达宿主侧监听方。
已知限制与待办工作
- 宿主需要 GitHub CLI——必须安装
gh并为每个已配置主机登录;环境变量中的令牌不会被转发。不在hosts中的主机永远不会被读取。 - 前 100 个检查与评审讨论——head 提交的检查超过上限时以
checksTruncated标记;前 100 个之后的未解决讨论不计入。 - 不发现 fork——按 head 分支查找时,不包含 head 位于其他仓库的 pull request。
- 速率限制——每次轮询都会以已登录账号的速率配额为每个主机消耗一次 GraphQL 查询。
开发备注
维护者的工作上下文——点击展开
无。