Back to home@lynkas

dsh-git-merge-lock

No description

Stars
0
Language
JavaScript
Created
Aug 27, 2026
Updated
Aug 28, 2026
GitHub repo

Introduction

dsh-git-merge-lock

dsh (DeepSeek Harness) 的跨 session git 合并互斥插件:整仓库单线程合并, 附侧栏锁状态灯 + 弹窗(持锁详情 / 手动解锁)。

目录结构

dsh-git-merge-lock/
├── plugin/              ← 插件真身(双半边包,被 ~/.dsh 引用)
│   ├── index.mjs        ← host 半边源码(FIFO 队列互斥内核 + git_merge_lock 工具 + RPC 端点)
│   ├── cordis.patch.yml ← 自指向 insert 行(bundle 层挂载声明)
│   ├── package.json     ← dsh.bundle.patch + dsh.client(web)双面声明
│   ├── lib/index.js     ← host 产物(index.mjs 的同步副本;改源码后 cp 覆盖)
│   ├── lib/client.js    ← 浏览器半边(手写 __ModuleLoader__ bundle,无构建步)
│   └── node_modules/    ← cordis / dsh-typert-protocol / zod 的符号链接(指宿主同名实例)
├── tests/
│   ├── harness.mjs      ← 内核语义套件(FIFO/租约/自愈/信箱等)
│   └── endpoints.mjs    ← Typert 端点 + 服务层套件
└── docs/                ← 三份宿主机制调研报告(挂载/RPC/slots 的证据链)

从 npm 安装(普通用户)

dsh plugin --profile web add dsh-git-merge-lock
# 再把下面的 insert 块追加到 ~/.dsh/profiles/web/cordis.patch.yml :
- insert:
    - id: git-merge-lock
      name: dsh-git-merge-lock
# 重启 dsh

npm 包名:dsh-git-merge-lock · 标签:deepseek / deepseek-harness / dsh / dsh-plugin · 在 dsh 0.1.1-rc.2 验证。

生产安装点(勿删)

路径形态作用
~/.dsh/plugins/git-merge-locksymlink → 本目录 plugin/.dsh 插件发现
~/.dsh/profiles/web/node_modules/dsh-git-merge-locksymlink → 同上客户端模块解析(<name>/package.json 双腿解析要求裸包名)
~/.dsh/profiles/web/cordis.patch.yml- insert: [{id: git-merge-lock, name: dsh-git-merge-lock}]组合挂载
~/.dsh/git-merge-lock.json配置(enabled / timeout_s / desktop_notify)每次调用实时读取

回滚:删除上述四项 + 按 ~/.dsh/restart-dsh.sh 重启即可。

运行语义(v2,"方案1")

  • 整仓单线程:同一仓库任意 merge/pull/rebase/cherry-pick/revert/am 完全串行,不看分支。
  • 唯一权威 = web host 进程内存中的 per-repo FIFO 队列;<git-common-dir>/dsh-git-lock/journal.jsonl 只是审计账本(host 重启锁自动清空,历史可追溯)。
  • 租约绑定调用生命周期:等待中被打断即出队;持有中会话中断由 keeper(5s)自动释放; 60 分钟硬上限。没有陈旧锁判定、没有偷锁、没有 fencing 缺口
  • 合并动作仍由各 session 自己执行:插件只管"何时允许开始",不触碰工作区。
  • acquire 时探测 MERGE_HEAD 等"未完成集成现场",警告下一个持有者;release 前同样自检并留痕。

模型工具

git_merge_lock,actions:acquire(FIFO 排队)/ release / force_release(需 confirm=true)/ status / notify(留言进持有者信箱)。

浏览器 UI

侧栏项目行 hover 出现的三图标组最左侧为 🔒(Material Symbols 内联 SVG): 灰色=空闲,金色=有人持锁。点击弹 dialog:状态徽标、holder 卡片(含手动解锁,两段确认, 只释放租约不打断对方 session)、等待队列、journal。文案中英双语,跟随宿主 locale。

RPC(统一信封 POST /api/gitMergeLock/<method>): queryMergeStatus(projectPath) / manualUnlock(projectPath, reason)

开发与测试

# 改 host 半边后:
node --check plugin/index.mjs && cp plugin/index.mjs plugin/lib/index.js   # 然后重启 dsh
# 改 client 半边后:
node --check plugin/lib/client.js                                          # 浏览器硬刷新即可(磁盘直读)
# 回归:
node tests/harness.mjs     # 内核 21 断言
node tests/endpoints.mjs   # 端点 14 断言(依赖真实 git 临时仓)
# 联调实例(独立 DSH_HOME,不碰生产):
DSH_HOME=~/.dsh-gml-test node <dsh>/lib/bin.js --profile test --port 3081

前端若改版导致行选择器([class*="_projectRow"] 等语义类名)失效,见 docs/research-ui-slots.md。