🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Git 仓库图谱 Athosoo/dsh-git-graph-sidebar

DeepSeek Harness
Athosoo11 天前有提交已提供中文文档扫描:含敏感能力

在侧栏浏览工作区所有仓库并查看提交泳道图

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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 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 画布、缩放、提交详情卡)及其语言键。
预览分享卡片长什么样 ↓Athosoo/dsh-git-graph-sidebar
分享 · DeepSeek Harness Hub
Athosoo/dsh-git-graph-sidebar

在侧栏浏览工作区所有仓库并查看提交泳道图

这是你的仓库?认领条目

回到顶部