Skip to content

dsh-git-idea

Verified

dsh-git-idea · v0.1.0 · MIT · Web UI

A git panel inside the DSH session: a repository chip in the composer, a panel with the branch tree, commit graph, working tree and commit detail, a Settings page, and 8 git model tools.

Install

dsh plugin add dsh-git-idea

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Creators

Readme

dsh-git-idea

把 Git 的日常操作搬进 DSH 会话:输入框左侧的仓库 chip,挂在它上面的浮层面板(分支树 / 提交历史 + 图 / 变更与提交 / 提交详情),一个 Settings 页,以及 8 个模型可调用的 git 工具。

A git panel for DeepSeek Harness: a repository chip in the composer, a branch tree / commit graph / working tree / commit detail panel, a settings page, and 8 git tools for the model.

仓库:https://github.com/mays-hi/dsh-git-idea


功能

  • 仓库 chip:会话输入框左侧显示当前仓库、分支和改动数;点它开面板。鼠标停在上面弹出分支切换卡片(可关)。
  • 分支树:按 HEAD / 本地 / 远程 分组,支持搜索、收藏,行尾 是分支可执行的动作。
  • 提交历史 + 图:一次分页 200 条,列表底部「加载更多」;虚拟化只渲染视口内的行。筛选支持正则 .*、区分大小写 Cc分支:作者:。开启筛选时提交图按真实 DAG 排道,跨过被筛掉的提交画虚线。
  • 提交详情:选中提交后显示作者、时间、引用、提交信息和文件列表。
  • 变更与暂存:分「变更」和「新增的文件」两组,可切树 / 平铺两种视图;勾选框暂存或取消暂存,分组标题的框对整组生效;未跟踪目录折叠成一行,展开才读取,勾选整目录等于 git add <dir>
  • 文件差异:在变更树或提交详情里单击文件,patch 直接占满正文,可返回、重读、暂存 / 取消暂存。四种状态:stagedworktreeuntrackedcommit;二进制只显示提示,不打印乱码。
  • 引导页:工作区还不是仓库时,显示「打开这个目录」和「在此初始化仓库」。
  • 跟随会话沙箱:所有 git 命令按当前会话解析出的 sandbox policy 发出——会话只读,插件就只读;会话可写,插件就能写它被指到的仓库。

面板是挂在输入框上方的浮层,不是可停靠的工具窗。


安装

要求 DSH 0.1.5-rc.1 及兼容版本(peer:@deepseek-ai/dsh-tools ^0.1.5-rc.1@deepseek-ai/cordis ^4.0.2)。

# 从 npm(发布后)
dsh plugin --profile web add dsh-git-idea

# 或直接从 GitHub
dsh plugin --profile web add github:mays-hi/dsh-git-idea

# 本地开发
dsh plugin --profile web add /path/to/dsh-git-idea

装完重启 dsh web(bundle 在启动时读取)。若报 ERR_PNPM_ADDING_TO_ROOT,在包名前加 -w

如果 DSH 里已经跑着旧版动态插件(<DSH_HOME>/dsh-git-idea 那个桥),先停掉它再装,否则模型工具会重名。


使用

面板打开时停在历史页;变更 页签上带未提交文件数。

手势(和 IDEA 的树一致):

单击 双击 / 点三角
目录行(分支树、变更树、提交文件树) 只选中 展开 / 折叠
未跟踪目录(git 折叠成一行的那种) 只选中,不发读取 读取并展开
分支行 只选中 把历史切到该分支
分组标题(HEAD / 本地 / 远程) 只选中 展开 / 折叠
文件行 打开差异
分组标题最左的复选框 整组进 / 出索引

仓库范围:看的是会话工作区它自己——只检查 <dir>/.git,不向上查找父目录,也不看子目录。


设置

Settings → dsh-git-idea配置。分两层。

插件级(写入 $DSH_HOME/dsh-git-idea.json,默认 ~/.dsh/dsh-git-idea.json,换浏览器一致):

默认 说明
初始化仓库的默认分支 main 引导页「在此初始化仓库」执行 git init -b <值>;留空用 git 自己的默认值
cherry-pick 时记录来源(-x 提交时是否带上 -x

浏览器级(只写当前浏览器的 localStorage):

默认 说明
后台监测仓库变化并自动刷新 关掉后下面的节奏选项一并失效
面板打开时每 N 秒检查 3(1–120)
只有按钮时每 N 秒检查 15(2–600)
面板关着时也监测 让 chip 上的分支名和改动数保持实时
悬停弹出分支切换卡片 鼠标停在 Git 按钮上弹出,点一下切换
面板尺寸 跟随输入框宽度 / 74vh 可恢复默认
变更页视图 或平铺列表
切换器记忆 可清除最近使用与收藏

模型工具

注册 8 个工具,都是结构化返回;破坏性操作需要显式 confirm: true

工具 作用
git 任意 git 命令的逃生舱,参数是 token 数组,没有白名单;破坏性命令需 confirm: true
git_status 分支、detached、upstream、ahead/behind,以及 staged / unstaged / untracked / unmerged 文件列表
git_log 提交历史:hash、短 hash、作者、ISO 时间、标题、引用;支持范围、路径、条数上限
git_diff 两个状态之间的差异;mode 为 worktree / staged / commit / range,超过 maxFiles 回退为原始 unified patch
git_commit 暂存并提交;默认提交已暂存内容,可用 paths 指定路径或 all: true 全量暂存
git_branch 列出 / 新建 / 切换 / 删除 / 重命名分支;强删需 confirm: true
git_stash stash 的 list / push / pop / apply / show / drop / clear;drop、clear 需 confirm: true
git_sync fetch / pull / push 和远端的增删改;保护分支(main / master)不可强推,任何强推需 confirm: true

结构化工具拒绝以 - 开头的值(修订号、远端、分支名等),避免被 git 读成选项。


开发

源码按功能拆成片段,构建就是按顺序拼接,没有转译、打包或压缩。改代码请改 src/

node build-package.mjs          # 生成正式包:lib/index.js + client/client.js
node build.mjs                  # 生成动态桥:host.js + client.js
node test/run-all.mjs           # 全部断言(676 条)
node build.mjs --check && node build-package.mjs --check   # 检查产物是否最新
node test/bench.mjs             # 基准:200 条提交的历史列表
node test/bench-branch.mjs      # 基准:300 个分支的切换器

test/run-all.mjs 在跑任何断言之前会先检查两份产物和测试文件是否落后于源码。

目录结构

package.json          npm / DSH manifest(dsh.bundle patch + dsh.client web)
cordis.patch.yml      bundle 层插入的插件行
lib/index.js          构建产物:Host 半侧(ESM,8 个工具 + 同源 RPC 路由)
client/client.js      构建产物:Client 半侧(__ModuleLoader__ bundle)
src/host/*.js         Host 源码片段(13 个)
src/client/*.js       Client 源码片段(23 个)
src/pkg/*.js          正式包的 prelude / postlude(harness shim、host.call)
build-package.mjs     正式包构建
build.mjs             动态桥构建
host.js client.js     构建产物:动态桥读取的两个半侧(旧运行方式,保留)
test/                 断言套件与性能基准

Host 与 Client 的片段各自共享一个作用域:一个片段可以使用它上面的片段定义的东西,反之不行。


许可

MIT