DSH GitHub Panel
在 DeepSeek Harness 的 Web 界面里管理 GitHub:浏览仓库、查看代码、处理 Pull Request,并把当前工作区的改动按规范格式化、提交、推送到 GitHub。
一个纯本地安装的 Harness 插件(Host + Client 两半),不需要额外服务或数据库。
功能
| 模块 | 能力 |
|---|
| 仓库 | 搜索、按更新 / 推送 / 名称 / Star 排序、分页加载;点击卡片直接打开代码视图,行内按钮进入该仓库的 PR;在 GitHub 打开 |
| 仓库管理 | 新建(名称、描述、私有、初始化 README)、改描述与可见性、归档 / 取消归档、删除(需输入 owner/name 全名确认) |
| 代码 | 文件树浏览、面包屑、分支切换、行号代码、图片预览;二进制 / 超 1 MB 文件给出提示并可跳转 GitHub |
| 阅读体验 | README 在根目录列表下方渲染;Markdown 文件「预览 / 源码」切换;代码按语言着色(明暗两套配色);PR 描述按 Markdown 渲染 |
| Pull Request | 按「我创建的 / 待我评审 / 指派给我 / 仓库内全部」筛选,按状态筛选,标题 / 编号 / 仓库 / 作者即时搜索 |
| PR 操作 | 展开详情(分支、增删行数、可合并状态、标签、描述);Squash / Merge commit / Rebase 合并(二次确认)、关闭、重新打开 |
| 提交推送 | /publish 命令或对话触发:格式化 → 校验 → Conventional Commits 提交 → 推送当前分支 |
安装
要求:DeepSeek Harness 桌面版(v0.2.1 或更高),本机已安装 Git。
git clone https://github.com/Shenyou-01/dsh-github-panel.git
然后在 Harness 里安装这个目录(<repo> 是克隆后的绝对路径):
plugin_manager → action: install_bundle → target: <repo>
安装后左侧栏底部会出现 GitHub 图标(Plugins、Schedules 之后的第三个),点击即可打开面板。
也可以用包管理器以外的方式安装:把仓库目录作为本地包链接进 profile 即可,插件本身零依赖、无构建步骤。
首次使用
- 点击左侧栏的 GitHub 图标。
- 在 GitHub 创建 Personal Access Token:
- 经典 Token:勾选
repo(只读浏览可用 public_repo);
- 细粒度 Token:给目标仓库
Contents: Read(需要管理时再加 Administration: Read and write)。
- 粘贴 Token → 「连接」。
Token 只保存在当前浏览器的 localStorage(键 dsh.github.panel.token),不会发送到 DeepSeek,也不会写入插件配置或仓库文件。
提交与推送
在对话里说「提交并推送」,或直接输入:
/publish
/publish feat(panel): add repository management
执行流程(Host 侧):
- 读取会话工作目录所在的 git 仓库、当前分支与远程。
- 拦截危险提交:未解决冲突、
.env / *.pem / id_rsa / credentials.json 等疑似密钥文件、超过 10 MB 的文件。
- 若
package.json 有 format 脚本则先运行(自动识别 pnpm / yarn / bun / npm);格式化失败不提交(可显式 format: false 跳过)。
- 校验提交信息符合 Conventional Commits(
type(scope): summary,类型:feat / fix / docs / style / refactor / perf / test / build / ci / chore / revert)。
git add -A → 提交 → 推送当前分支到 origin,从不 force push。
推送凭据优先使用系统 Git 凭据(Git Credential Manager 等);失败且存在 GITHUB_TOKEN / GH_TOKEN 环境变量时自动用它重试(通过 Git 配置环境传入,不进入命令行参数)。
模型侧还注册了两个工具:
github_workspace_status:查看分支、远程、未提交文件、ahead/behind、最近提交;
github_publish:执行上面的发布流程。
安全设计
- 不注入 HTML:Markdown 被解析为 AST 后生成 React 元素,原始 HTML 只作为文本显示;无需 iframe 沙箱。
- URL 白名单:链接 / 图片只允许
http、https、mailto,javascript:、data: 等一律丢弃;图片带 referrerPolicy="no-referrer"。
- 提交护栏:密钥类文件、超大文件、未解决冲突、detached HEAD、无远程分支都会被拒绝。
- 最小权限:Token 仅存在于浏览器本地;Host 侧不保存任何 GitHub 凭据。
架构
github-panel/
├─ client.js # 浏览器半:面板、仓库 / 代码 / PR 视图、Markdown 与着色
├─ index.js # Host 半:工具、/publish 命令、提示段注册
├─ git.js # 仓库检查、格式化、提交、推送与护栏(node:child_process)
├─ cordis.patch.yml # bundle 入口行
├─ locale/{en,zh}.json# 插件显示名与描述
├─ icon.svg
└─ test/ # 离线测试(假 React + 本地裸远程)
- Client 半通过
main(key github)与 sidebar.panellist(id github)两个 slot 注册,数据直连 https://api.github.com(Contents / Search / Repos API)。
- Host 半注册
tools、commands、systemPrompt,git 操作全部在 Host 进程内执行。
- 样式只使用 Harness 的
--dsw-alias-* 主题 token;代码着色的明暗配色按主题背景亮度切换。
开发与测试
无需构建步骤,纯 ES 模块。
node --check client.js
node --check index.js
node --check git.js
# 客户端:假 React + 桩 API,覆盖渲染、Markdown、着色、仓库管理、CRUD
node test/smoke.mjs
# Host:真实 git 仓库 + 本地裸远程,覆盖格式化 / 提交 / 推送 / 护栏
node test/publish.mjs
test/publish.mjs 会创建并清理临时仓库,需要本机可执行 git 与 npm。
已知限制
- Markdown 支持 GFM 常用子集,不渲染内联 HTML,不支持脚注、数学公式、Mermaid。
- 代码着色是轻量词法实现(JS/TS、JSON、CSS、HTML、Python、Go、Rust、Java、SQL、Shell、YAML、diff),不是 TextMate 语法。
- 私有仓库 README 中的相对图片走 raw 链接、不带 Token,可能无法加载;外链图片正常。
- 面板内的代码浏览是只读的;编辑请用「在 GitHub 打开」,或改完本地文件后用
/publish 提交。
- 新仓库建在个人账号下(
POST /user/repos),暂不支持组织仓库创建。
更新日志
版本变更记录见 CHANGELOG.md。当前版本 v1.0.0(2026-10-18)。
许可
本仓库暂未附带开源许可证。如需复用,请补充 LICENSE(例如 MIT)。
English summary
A DeepSeek Harness plugin that puts a GitHub workspace into the Harness Web UI: browse repositories and files, read Markdown with syntax highlighting, review and merge pull requests, and publish workspace changes with Conventional Commits (format → guard → commit → push). Split into a browser half (GitHub REST API) and a Host half (git tools and the /publish command). No build step, no dependencies.