在侧栏浏览工作区所有仓库并查看提交泳道图
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Athosoo/dsh-git-graph-sidebar该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 75 处,展示前 32 条)
- 读取本地文件lib/index.js:1126
if (existsSync(target)) return { - 写入本地文件lib/index.js:1149
await mkdir(repoWorktreesDir(root), { recursive: true }); - 读取本地文件lib/index.js:1188
canonical = await realpath(worktreePath); - 读取本地文件lib/index.js:1200
canonicalHome = await realpath(repoWorktreesDir(root)); - 读取本地文件lib/index.js:1220
if (await realpath(item.path) === canonical) { - 读取本地文件lib/index.js:1285
if (resolved.exitCode === 0) return resolved.stdout.split("\n").map((line) => line.trim()).filter((line) => line !== "").some((markerPath) => existsSy - 读取本地文件lib/index.js:1289
if (markerPath !== "" && existsSync(resolve(root, markerPath))) inProgress = true; - 写入本地文件lib/index.js:2570
await mkdir(dirname(path), { - 写入本地文件lib/index.js:2573
await writeFile(temporary, JSON.stringify({ - 写入本地文件lib/index.js:2578
await rename(temporary, path); - 删除本地文件lib/index.js:2580
await rm(temporary, { - 写入本地文件lib/index.js:2801
if (slash > 0) await mkdir(join(root, doc.slice(0, slash)), { recursive: true }); - 写入本地文件lib/index.js:2802
await writeFile(docPath, body, "utf8"); - 删除本地文件lib/index.js:3043
await rm(hookPath, { force: true }).catch(() => {}); - 删除本地文件lib/index.js:3044
await rm(checkerPath, { force: true }).catch(() => {}); - 读取本地文件lib/types/index.js:40
canonical = await realpath(path); - 发起网络请求src/client/api.ts:33
response = await fetch(path, { - 发起网络请求src/client/sse-leader.ts:97
void locks.request('dsh-sse:' + key, { signal: abort.signal }, () => { - 发起网络请求src/client/telemetry.ts:139
void fetch(ENDPOINT, { - 读取本地文件src/host/conventions.js:681
parsed = JSON.parse(readFileSync(path, "utf8")); - 读取本地文件src/host/conventions.js:1582
const status = conventionStatusOf(readFileSync(path, "utf8")); - 读取本地文件src/host/conventions.js:1629
if (conventionIsPointer(readFileSync(path, "utf8"))) continue; - 读取本地文件src/host/conventions.js:1673
const body = readFileSync(found.path, "utf8"); - 读取本地文件src/host/conventions.js:2519
if (info.size > 0 && info.size <= CONVENTION_DOC_MAX_BYTES) body = readFileSync(docPath, "utf8"); - 读取本地文件src/host/git-service.ts:334
if (existsSync(target)) { - 写入本地文件src/host/git-service.ts:351
await mkdir(repoWorktreesDir(root), { recursive: true }) - 读取本地文件src/host/git-service.ts:378
canonical = await realpath(worktreePath) - 读取本地文件src/host/git-service.ts:387
canonicalHome = await realpath(repoWorktreesDir(root)) - 读取本地文件src/host/git-service.ts:400
if (await realpath(item.path) === canonical) { - 读取本地文件src/host/git-service.ts:462
return markerPaths.some((markerPath) => existsSync(resolve(root, markerPath))) - 读取本地文件src/host/git-service.ts:472
if (markerPath !== '' && existsSync(resolve(root, markerPath))) inProgress = true - 读取本地文件src/index.ts:63
canonical = await realpath(path)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 的 Git 提交图与多仓库浏览:输入框里加分支标签,侧边栏新增标签页,自动发现工作区目录下所有仓库,并用 SVG 泳道画布绘制提交图。
README
由 DeepSeek 最新模型翻译生成dsh-git-graph-sidebar
一个给 DeepSeek Harness(DSH)用的 Git 浏览插件:输入框旁的分支徽章,以及 dsh-better-sidebar 里的仓库图谱页——把当前工作区目录往下发现的每个 Git 仓库列出来,并把选中仓库的提交图渲染成 SVG 泳道画布。
仓库图谱页,深色主题
功能
仓库图谱页(better-sidebar)
它把会话的工作目录当作一个容器:目录下面所有 Git 仓库都能直接访问,不需要把每个仓库单独注册成 DSH 工作区。
- 多级仓库发现——工作区根目录本身,加上最多 3 层以内的嵌套仓库。每个条目带当前分支、短 head、脏文件数与冲突数。
- 仓库树——根目录、中间目录、每个仓库按层级排开,层级关系直接看得见,而不是靠路径去猜。
- SVG 提交图——一次提交一行,一条分支一条彩色泳道,父提交在别的泳道时画曲线连接,合并提交画成菱形,带 ref 徽章与相对时间。
- 缩放——默认双行;− / + 收成紧凑单行或展开。
- 提交详情卡——点击某一行,固定显示完整 hash、主题、作者、时间与父提交数。
- 刷新——按需重新扫描;宿主对一次扫描结果缓存 60 秒。
分支徽章(输入框)
沿用上游插件的徽章:空白会话里可以切换或新建分支,并打开交互式提交图对话框与 worktree 管理器。
展开完整文档(README 剩余 1 节)
dsh-git-graph-sidebar
一个给 DeepSeek Harness(DSH)用的 Git 浏览插件:输入框旁的分支徽章,以及 dsh-better-sidebar 里的仓库图谱页——把当前工作区目录往下发现的每个 Git 仓库列出来,并把选中仓库的提交图渲染成 SVG 泳道画布。
仓库图谱页,深色主题
功能
仓库图谱页(better-sidebar)
它把会话的工作目录当作一个容器:目录下面所有 Git 仓库都能直接访问,不需要把每个仓库单独注册成 DSH 工作区。
- 多级仓库发现——工作区根目录本身,加上最多 3 层以内的嵌套仓库。每个条目带当前分支、短 head、脏文件数与冲突数。
- 仓库树——根目录、中间目录、每个仓库按层级排开,层级关系直接看得见,而不是靠路径去猜。
- SVG 提交图——一次提交一行,一条分支一条彩色泳道,父提交在别的泳道时画曲线连接,合并提交画成菱形,带 ref 徽章与相对时间。
- 缩放——默认双行;− / + 收成紧凑单行或展开。
- 提交详情卡——点击某一行,固定显示完整 hash、主题、作者、时间与父提交数。
- 刷新——按需重新扫描;宿主对一次扫描结果缓存 60 秒。
分支徽章(输入框)
沿用上游插件的徽章:空白会话里可以切换或新建分支,并打开交互式提交图对话框与 worktree 管理器。分支操作在宿主进程中执行;活跃会话上徽章自动隐藏。
运行要求
| 项目 | 值 |
| DSH | >=0.2.1-rc.2 <0.3.0-0 |
| Node(宿主运行时) | ^22.19.0 \|\| >=24.0.0 |
| dsh-better-sidebar | 只影响图谱页——没装时插件照常加载、徽章照常工作,只是不注册这个页 |
安装
从 最新 Release 下载预构建包 dsh-git-graph-sidebar.tgz(无需构建),当成插件 bundle 安装:
- 桌面版(desktop profile 由 Electron 应用独占,CLI 会拒绝):在应用的插件页里安装这个 .tgz。
- CLI 管理的 profile:
dsh plugin --profile <profile> add github:Athosoo/dsh-git-graph-sidebar
或用已下载的 tarball
dsh plugin --profile <profile> add ./dsh-git-graph-sidebar.tgz
装完需要重启 DSH。 宿主那一半在启动时注册 /git/ HTTP 路由,首次安装仅刷新页面不够;升级到新构建同样要重启进程才会被加载。
图谱页需要 dsh-better-sidebar;没装它时,分支徽章、图谱对话框、worktree 全部照常工作,只是没有那个侧栏页。
仓库发现规则
| 规则 | 值 |
| 扫描深度 | 工作目录往下 3 层(某层命中仓库后不再向下钻) |
| 数量上限 | 单次最多 200 个仓库,超出后结果标记为截断 |
| 跳过的目录名 | node_modules、dist、build、out、coverage、target、vendor,以及所有点开头目录 |
| 仓库判定 | 存在 .git 条目(目录、文件或符号链接都算,因此 worktree 与 submodule 都能识别) |
| 单条状态预算 | 5 秒;git status 超时的条目仍会列出,只是没有分支元信息 |
| 缓存 | 按基路径缓存 60 秒,并发请求共用一次扫描;面板上的刷新按钮会绕过缓存 |
HTTP 路由
由宿主半边注册在 /git 下,除 /git/events 是 SSE 事件流外,其余都返回 JSON({ok:true,value} / {ok:false,error})。
| 路由 | 用途 |
| /git/repos | 多级仓库发现({path, refresh?}) |
| /git/status | 分支、head、脏文件/未跟踪/冲突数量 |
| /git/branches | 分支列表(标出当前分支) |
| /git/graph | 提交列表与父提交、refs({path, limit?}) |
| /git/switch | 切换分支 |
| /git/create-branch | 新建并切换 |
| /git/worktrees | worktree 列表 |
| /git/worktree-add | 创建 worktree |
| /git/worktree-remove | 删除 worktree |
| /git/events | 变更通知(界面轮询) |
每个路由都会先 realpath 解析请求路径,只有在某个已注册工作区内部时才放行;嵌套仓库目录会被接受,工作区之外的路径返回 workspace-unknown。
已知限制
- 图谱页是只读的。 切换分支、worktree 操作目前仍在徽章的对话框里,还没有搬进这个页。
- 不要和 @linxin666/dsh-client-ui-git-graph 同时安装。 两者都占用 /git 这个路由前缀,重复注册会冲突,二选一。
- 超过 3 层的仓库不会被列出;位于被跳过目录名(node_modules、dist 等)里的仓库同样不会列出,这是设计如此。
- 宿主半边是构建产物。 lib/index.js 是直接改的(新增部分在带标记的 //#region 块里);lib/client.js 由 src/client/graph/SidebarTab.js 拼接生成。细节见 DEVELOPMENT.md。
开发
npm run build # 把 src/client/graph/SidebarTab.js 拼进 lib/client.js
npm run check # 对两个 bundle 跑 node --check
npm run validate # 校验每个 t("…") 键在两套语言字典里都存在
npm run preview # 不启动 DSH,直接渲染出 preview/.html
npm run preview 会写出独立的 HTML(深色与浅色各一份),用示例仓库与提交展示这个页,改完布局可以直接在浏览器里看,不用装进 DSH。
归属与许可
Apache-2.0——见 LICENSE 与 NOTICE。
本项目是 linxin666 的 @linxin666/dsh-client-ui-git-graph 0.4.8(同为 Apache-2.0)的分叉:分支徽章、提交图对话框、worktree 管理器与宿主 git 服务来自上游。本分叉的改动:重命名包、把工作区校验从「路径完全相等」放宽到「位于工作区内」、新增 /git/repos 发现路由、新增 better-sidebar 图谱页(仓库树、SVG 画布、缩放、提交详情卡)及其语言键。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Athosoo/dsh-git-graph-sidebar
在侧栏浏览工作区所有仓库并查看提交泳道图
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目