dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
GitHub-connected visual git panel for DeepSeek Harness - branch switcher, file-level approval cards, PR/issue workspace
DeepSeek Harness 的 GitHub 可视化 Git 管理插件——引导式 GitHub Flow 流程、GitLens 风格提交图谱(带 PR/CI 徽章)、一键 GitHub 登录,以及为 Agent 提供的结构化 Git 操作工具。
面板的呈现方式与 dsh-better-sidebar 同源:每一个颜色、字号角色与动效值都走 DSH 主题令牌;界面是平面的(发丝边框 + 悬停底色,流内没有阴影);纯图标按钮是圆形、透明底、悬停才浮出。明暗主题与任何 dsh-web-ui 皮肤都能直接重绘这个面板——面板内部没有自己的调色板,也没有主题选择器。详见 DESIGN.md。
2.0.0 起由 gitcompass 改名而来:包名、插件行 id(
dsh-git-manager)、HTTP 路由(/gitm/*)与 CSS 前缀(--gm-*)一并迁移。模型侧的工具名(git_status、git_commit、github_pr_*等)刻意保持不变——它们命名的是操作,不是产品。
gh CLI、加密 Token 存储(Windows DPAPI)。git_status、git_diff、git_branches、git_commit、git_push、github_pr_list/read/create/merge/comment/review、github_issue_list/read/create/comment。never 时的 ghost deny,例如 danger-full-access 预设自带 never)不能否决面板卡——任何审批策略下写操作都能走面板审批。面板决定一次性有效且不落盘;无面板在线时快速失败并提示打开面板(或先在面板中预批准),不再静默挂死。dsh-better-sidebar 时,面板把自己注册成它的一个页签并把右栏让给它;没装时保留自己的右栏卡片,且可折叠。详见下文。dsh plugin --profile web add dsh-git-manager
本地开发:
dsh plugin --profile web add link:/path/to/dsh-git-manager
重启 dsh web,打开一个绑定 git 仓库的会话,右侧面板即显示「Git 管理」。
src/
index.ts # Cordis 插件入口:注册路由 + 工具 + 系统提示词
tools.ts # Agent 侧结构化 git/GitHub 工具(写操作审批竞速)
core/types.ts # 共享类型定义
host/
git-service.ts # 以工作区为边界的 git 操作服务
routes.ts # /gitm/* HTTP 路由(含 SSE 事件流 /gitm/events、审批端点)
event-bus.ts # 内存事件总线 + 预批准表 + 面板审批 Broker + 仓库观察器
github-service.ts # GitHub REST 封装(Token 不离开宿主进程)
github-auth.ts # 设备流、DPAPI Token 加密存储、gh CLI 同步
client/
index.ts # 浏览器端入口:选择宿主(better-sidebar 页签 / 独立卡片)
embed.tsx # better-sidebar 页签注册(结构化类型,可选 peer)
shell.tsx # 独立宿主:可折叠的右栏卡片
Panel.tsx # 主面板:分支 / 变更 / 图谱 / PR / 议题 / GitHub / Agent
styles.ts # 全部样式,建立在宿主主题令牌之上(见 DESIGN.md)
api.ts # /gitm/* 路由的类型化 Fetch 封装
events.ts # SSE 订阅 + 页签角标共用的共享事件存储
i18n.ts # 中英文双语词典
icons.tsx # 图标唯一来源(16px 网格、1.5 笔重内联 SVG)
graph.ts # 提交 DAG Lane 布局算法
面板不抢占宿主已经拥有的表面:
dsh-better-sidebar —— 面板注册成它的一个侧栏页签(dsh-git-manager:panel,标题「Git 管理」,单实例幂等),不再自己挂右栏。从侧栏的「新建页签」列表里打开,之后随会话持久化。页签上带实时角标:当前有多少个写操作在等你批准。dsh-better-sidebar —— 面板保留自己的右栏卡片,头部多一个收起把手。收起后只剩头部条,并停止全部轮询(不会在后台继续打 git),状态落 localStorage。探测是运行时的(ctx.get('betterSidebar')),所以 better-sidebar 始终只是可选 peer:没有硬依赖、构建期不 import 它的类型;注册失败也只降级成独立卡片,不会把面板弄丢。也可以用 localStorage['gm.host'] = 'dock' | 'tab' 手动覆盖(默认自动)。
面板还会跟随所属会话的工作区:先取宿主给的 scope.cwd,没有就用"当前选中的会话";你切换会话时它自动切到对应仓库——没见过的仓库会先自动收录(宿主会向上找到最内层的仓库根,所以会话停在一个嵌套仓库里时,选的是那个仓库而不是包着它的工作区)。绝不覆盖你手动选的仓库。
会话的工作区往往只是个容器——D:\Harness 里套着十几个独立仓库——只看会话 cwd 永远不知道你此刻在动哪一个。所以宿主还盯着 tools/execute:取文件类工具(read / write / edit / grep / glob 等)的路径参数,向上找到所属仓库根,把它自动收进下拉框。还不存在的文件也算——观测发生在工具执行之前,write 新建文件恰恰是最该被看见的那一类活动。
auto,下拉框里显示成 名字 · 自动:货架自己长了要看得见,才不会变成一件玄学。repo:auto-added。config.autoRegisterRepos: false——下面的悬挂条仍会显示正在动什么。下拉框下面常驻一条两行悬挂提示,两个问题一眼可答:
会话文件夹 D:\Harness
正在修改 D:\Harness\dsh-learn-wiki
第一行是面板跟随的会话文件夹,第二行是 agent 此刻在动的文件夹(写类工具显示「正在修改」,只读类显示「正在读取」)。当第二行是个已收录、但不是当前选中的仓库时,旁边会出现一个切过去按钮。
pnpm install
pnpm run build
构建产物:lib/(宿主端)和 client/(浏览器端 bundle)。
node scripts/test-activity.mjs # 文件活动自动收录(在临时 home 下跑,不碰真实货架)
MIT