当 DSH 会话多到管不过来:我给 DeepSeek Harness 写了一个「Coding驾驶舱」
介绍下我的开源项目 dsh-coding-workspace——一个把 DeepSeek Harness(dsh)的单会话界面改造成多工作区并行开发驾驶舱的插件。
痛点:AI 编程的「会话泛滥」!
用 AI Coding Agent 干活的第 N 天,我遇到了所有重度用户的共同困境:
- 会话开太多。修一个 bug 开一个会话,写一个特性开一个会话,加上子代理,侧栏里躺着一排「无标题会话」,哪个对应哪个任务全靠记忆。
- 任务和代码对不上号。会话不关心它在改哪个目录、哪条分支——但我在乎。三个会话同时动一个仓库,改完互相覆盖,git status 一片红。
- 切来切去太累。看代码要开 IDE,看 git 状态要开终端,看会话要切回 dsh——工具链断成三截。
git worktree 是并行开发的正解:每个任务一条分支一个目录,物理隔离互不干扰。但 worktree 的管理体验太原始:git worktree add 敲命令、目录散落在磁盘各处、哪个 worktree 上跑着哪个会话全靠脑子记。
既然 dsh 是插件化的,为什么不让它自己长出这层工作台? 于是有了 dsh-coding-workspace。
它长什么样
一句话:以 git worktree 并行开发为地基,把 dsh 的单会话界面变成多工作区驾驶舱。

项目分组侧栏:三级树看清并行任务
侧栏被替换成「项目 → 工作区 → 会话」三级树:
📁 demo-app ← 项目组头(git 主仓)
🌿 main [主要] ← 主工作区(分支名 + TAG)
🌿 feature/login ← worktree(备注/图标/颜色可定制)
🐋 修复登录跳转… ← 会话(鲸鱼图标 + 消息摘要 + 相对时间)
🌿 feature/payment
几个我特别喜欢的设计:
- 一键导入项目:选一个 git 仓,自动枚举主仓 + 全部 worktree 批量注册归组,血缘由
.git指针文件自动推断,零手动配置。 - 状态是「推」出来的,不是「轮」出来的:会话行的运行中(像素矩阵动画)、等待确认(琥珀点)、后台完成(绿色对勾)全部订阅宿主 mux 帧推送,零轮询。
- 子代理自动嵌套:子代理会话折叠到父会话名下,父行一个
▸N胶囊,树再深也不乱。
右缘停靠面板:资源管理器 + Git,不切窗口

面板停靠在右缘真推挤(VSCode 式),两个 TAB 解决「切窗口」问题:
- 资源管理器:文件类型图标、git 状态染色(IDEA 风:修改蓝/新增绿/忽略橙黄,目录聚合整片状态)、右键菜单(默认程序打开、添加到对话、行内重命名、删除)。双击文件直接进编辑器。
- Git Changes:diffstat(
+27 -28挂行尾)、Changelist 分组拖拽、勾选子集做部分提交、hover 一键放弃更改。 - Git Logs:IDEA 风格 lane 拓扑(SVG 贝塞尔连线),任意分支查看,点 commit 的变更文件直接看该提交的 diff。
- AI commit message:按所选文件的 diff + 仓库现有提交风格,流式生成完整的「标题 + 正文」,生成时输入框锁定防手滑。
文件编辑器:编辑器里长出 diff 和「给 AI 的注释」

这是我私心最重的部分:
- 编辑视图内联 diff:打开文件即见改动——HEAD 删除的行以红色删除带内联插在原位,新增行绿底,右缘状态条随敲代码实时刷新。可编辑性一点没少:Ctrl+S、撤回重做、脏标记全保留。
- 行评论(Note for AI):在任意行(或划选一段区间)挂备注,像给同事留 code review 意见一样——然后一键「发送到会话」,格式化好的上下文直接进 AI 的输入框。注释随代码持久化在 sidecar JSON 里,下次打开还在。给 AI 留言这件事,第一次有了「住进代码里」的形态。
- 分栏多分组:文件 TAB 拖到边缘合并成组,多组并存、切离休眠、点击恢复,左边改代码右边看 diff。
- 会话与文件 TAB 顶部混排,中键关闭/归档,滚轮横滚。
技术上有几处可以聊的
如果你也是插件/前端开发者,这几段踩坑或许有价值:
1. Cordis 微内核的 slot 体系。 dsh 基于 Cordis,扩展点全靠 slot:侧栏是 single slot(按 priority 遮蔽,插件直接替换官方工作区列表),浮层走 shell.overlay additive list slot(面板/顶栏/编辑器覆盖层各占一枚 entry)。宿主还通过 slot 的 standardProps 白送 useSessions/useWorkspaces 等响应式快照 hook——插件与宿主共用同一数据源,这是「零轮询」的根基。
2. 「CSS 变量桥」停靠推挤。 面板要真推挤(内容区让位)而不是浮层遮挡,但又不能碰宿主 inline style——解法是插件自己写 CSS 变量,注入 #root { margin-right: var(--panel-width) } 让宿主「自愿」让位;检测到同类冲突插件自动退回浮层。顶栏同理,但只推对话列(_centerCol),否则侧栏 LOGO 会被一起压下去。
3. 逆向 RPC 之死(教训向)。 早期我逆向了宿主前端的内部 RPC(POST /api/workspace.list)拿数据,用得好好的——直到宿主 0.1.2 把 RPC 重组为 Typert Remote 体系,逆向端点全部 404,而 404 响应体是纯文本,被 res.json() 吃掉后报出来的错误是 Unexpected token 'o',完全看不出和 RPC 有关。最终修法是彻底弃逆向、改吃官方快照源。结论:插件消费宿主数据,只走官方出口,逆向能跑一时,跑不过一次升级。
4. diff 是自己写的。 unified diff 的行对齐是一个 LCS 纯函数(LCS 行对齐 + CRLF 归一 + 预算截断),独立单测;语法高亮是移植的 highlight.js,逐行渲染 + 块状态机混合(块注释/模板串整行判定,位置猜法会把单行 JSDoc 误判为未闭合,之后整文件连坐变灰)。168 个单测守着这些纯函数。
安装
dsh plugin --profile <profile-name> add dsh-coding-workspace
发版走 Release CI:打 tag 自动跑 Windows + Ubuntu 双平台测试矩阵,产物自动上传 GitHub Release 并发 npm,三大插件市场(awesome-dsh-plugin / 1024Store / dshfind)均已收录。
- GitHub:Aealen/dsh-coding-workspace
- 中英双语 README 里有完整功能清单、工具说明与 21 条 HTTP 路由文档
如果你也在用 dsh 做多任务并行开发,欢迎试用 + 提 issue;如果觉得有意思,点个 star 是对独立开发者最大的鼓励。
