# @angel-gp/dsh-client-ui-gitpeek [English](README.md) | [中文](README.zh.md) 只读的 GitHub 数据查看面板,作为 DeepSeek Harness(DSH)会话的第三个标签页(紧跟「轨迹」之后),在浏览器中直接调用 GitHub REST API,并排展示 Actions 运行、Commits、Releases 三列数据。 image ## 功能 - 三列并排,各自独立滚动 - 记忆多个仓库地址 + 单个 PAT token:存入前先用 **AES-256-GCM**(Web Crypto)加密,`localStorage` 里不再有明文;密钥留在同一浏览器中 - 加载更多:每列通过 GitHub `Link` 响应头分页,带「加载更多」按钮(每页 30 条 runs / 30 条 releases / 100 条 commits) - 进入自动刷新:打开会话先秒显缓存,再后台自动拉取一次——重启后不会停留在旧数据 - 切换仓库自动刷新:点击已保存的仓库 chip 立即切换并拉取该仓库数据 - 缓存不过期:打开会话直接显示缓存,点「刷新」或进入会话时才重新拉取 - 国际化:界面文案随 DSH 语言偏好(zh / en)切换 - 三列数据并行拉取,任一接口失败单独提示,互不影响 ## 安装 ### 0. 前置条件 - `dsh` 和 `pnpm` 在 PATH 中(DSH Desktop 自带,重新开一个 PowerShell 即可生效)。 - `git` 在 PATH 中且能访问 github.com。`dsh plugin` 内部转发给 pnpm,pnpm 会从 `github:` specifier 克隆仓库——走 HTTPS,或配置好 SSH(`insteadOf` 重写 / 代理)后走 SSH。 - 弄清楚你正在运行的 DSH 用的是哪个 profile。插件装进命令里指定的那个 profile,只有运行**同一个 profile** 的 GUI 才会显示它。**DSH Desktop 默认是 `desktop` profile**,和 `web` 是不同的组合——要么装进你实际运行的 profile,要么把 GUI 切换到你要安装的 profile。 ### 1. 安装插件 **让 Agent 安装(推荐)** 如果当前 Agent 可以执行终端命令,把下面这段话完整发送给它: > 请为 DeepSeek Harness 的 web Profile 安装 gitpeek 插件。 > > 只执行下面两条命令,不要修改其他 Profile: > ``` > dsh plugin --profile web add github:Angel-GP/dsh-gitpeek#main > dsh --profile web --dump-config > ``` > 确认输出中出现 `@angel-gp/dsh-client-ui-gitpeek` 后告诉我安装结果。 > 不要替我关闭或重启正在运行的 DSH;安装完成后提醒我手动重启 DSH Web Host。 把其中的 `web` 换成你的 GUI 实际运行的 profile(DSH Desktop 通常是 `desktop`)。 **手动安装** 也可以自己在 PowerShell 里执行同样的两条命令: ``` dsh plugin --profile web add github:Angel-GP/dsh-gitpeek#main dsh --profile web --dump-config ``` > **DSH Desktop 用户注意**:打包的 `dsh` 命令可能拒绝初始化它还不认识的 profile(报 `ENOENT: lstat .../profiles/`)。遇到时先执行一次 `dsh plugin --profile add <任意包>` 创建 profile,再重复上面的 add;或者让 Agent 直接调用等价的 `dsh` bin。 > **关于 peer 依赖警告**:pnpm 会打印 `[WARN] Issues with peer dependencies found`,因为 `react` 和 `@deepseek-ai/*` 包由 DSH 的符号链接依赖树(`$DSH_HOME/profiles/node_modules`)提供,而不是列在 profile 自己的 `dependencies` 里。这个警告是预期的、无害的——用下面的 `--dump-config` 验证即可。 ### 2. 验证 确认 `--dump-config` 的输出中出现 `@angel-gp/dsh-client-ui-gitpeek`,说明插件已进入组合层: ``` # == @angel-gp/dsh-client-ui-gitpeek - id: gitpeek name: '@angel-gp/dsh-client-ui-gitpeek' ``` ### 3. 重启 手动重启 DSH Web Host。重启后 GitHub 标签页会出现在「轨迹」旁边。 ### 4. 最终验证 在运行中的 GUI 里打开一个会话:会话标签页中应出现 **GitHub** 标签(在「轨迹」旁边),输入仓库(如 `owner/repo`)并点「刷新」后三列数据应正常加载。如果标签页没出现,请确认 GUI 运行的是你安装时的那个 profile(见第 0 步)。 ## 卸载 完全卸载 = 从 profile 移除插件 + 重启使 GUI 生效 + 清除浏览器残留数据。 ### 1. 移除插件依赖 ``` dsh plugin --profile web remove @angel-gp/dsh-client-ui-gitpeek ``` 把 `web` 换成你安装时的 profile。`dsh plugin` 转发给 pnpm;成功后会自动把该包从 profile 的 `dsh.profile.bundles` 列表移除。 > **DSH Desktop 用户注意**:和安装时一样,打包的 `dsh` 命令可能报 `ENOENT: lstat .../profiles/`,遇到时直接调用等价的 `dsh` bin。 验证插件已退出组合层: ``` dsh --profile web --dump-config ``` 输出中应不再出现 `@angel-gp/dsh-client-ui-gitpeek`。 ### 2. 重启 DSH Web Host 手动重启 DSH Web Host。组合层重新解析后 GitHub 标签页消失——这一步才是真正从运行中的 GUI 卸载。 ### 3. 清除浏览器残留数据(手动) 插件把配置和缓存存在浏览器 `localStorage`,卸载后**不会**自动清理: - `dsh.ghwf.config` —— **加密后的 PAT token** - `dsh.ghwf.key` —— 解密所需的 AES-GCM 密钥(务必与 config 一起清除) - `dsh.ghwf.cache` —— 缓存的 Actions / Commits / Releases 数据 在 DSH 网页里打开 DevTools(F12)→ Console 执行: ```js localStorage.removeItem("dsh.ghwf.config"); localStorage.removeItem("dsh.ghwf.key"); localStorage.removeItem("dsh.ghwf.cache"); ``` ### 4.(可选)清理 pnpm store ``` pnpm store prune ``` 删除 pnpm 内容寻址存储里不再被任何 profile 引用的包(包括 gitpeek 及其下载缓存),不影响其他 profile。如果之后还可能重装,可以跳过。 ## 获取 PAT token 插件用 PAT 提升 GitHub API 读取额度(匿名 60 次/小时,带 token 5000 次/小时)。只读查询,权限最小化即可: 1. 打开 https://github.com/settings/personal-access-tokens/new 2. 选 **Fine-grained token** 3. **Repository access** 选 **Only select repositories**,勾选你要查看的仓库 4. **Permissions** 里给: - **Actions → Read-only**(读 workflow runs) - **Contents → Read-only**(读 releases、commits) - **Metadata → Read-only**(通常自动包含) 5. 生成后把 token 粘贴到插件的「PAT」输入框 ### 安全提示 PAT 先经 AES-256-GCM 加密再存储。加密密钥保留在同一个浏览器(`localStorage` 里的随机 32 字节),因此存储值不是明文——但任何能在这台浏览器里运行脚本的东西(扩展、开发者工具、同源脚本)仍能解密它。请: - 只授予「只读 + 选定仓库」的最小权限(见上文); - 不要把这个 token 用于其他服务或账号操作; - 不再需要时,随时在 GitHub 上撤销或轮换它。 ## 持久化(为什么保存的数据会"消失") gitpeek 把已保存的仓库和加密 PAT 存在浏览器 `localStorage`,它按 **origin(协议 + 主机 + 端口)** 隔离。如果 DSH 每次启动监听**不同的端口**,每次启动都会看到空的 `localStorage`,已保存的数据就像"消失"了。 - **`dsh --profile web`(纯 Web 端)**:默认稳定——监听固定端口(未传 `--port` 时为 `3080`),重启后数据仍在。只要每次都使用同一个端口即可。 - **DSH Desktop**:**默认随机端口**(未设置 `dsh-desktop.port` 时每次启动由系统挑选空闲端口),因此每次重启数据都会丢失。 ### DSH Desktop 的修复方法 在 `$DSH_HOME/settings.yaml` 里固定一个端口(若 `3080` 与其他程序冲突可改成别的): ```yaml dsh-desktop: mode: advanced port: 3080 ``` 然后**完全退出并重启 DSH Desktop**。首次重启后 origin 稳定,已保存的仓库 / PAT 就能持久。注意:之前随机端口下保存的数据无法迁移到新端口(浏览器安全限制)——切换后需要重新输入一次仓库和 token。 经验法则:**始终用同一个端口启动 DSH**,数据就会一直在。 ## License MIT