# DSH 工作台布局 简体中文 | [English](README.md) 为 DeepSeek Harness Web 提供三栏工作区:左侧导航、中间文件与终端、右侧 DSH 原生对话。 ![DSH 工作台布局:文件目录、编辑器与原生对话](https://raw.githubusercontent.com/lsq-dsh-plugins/dsh-workbench-layout/main/assets/workbench-files-and-chat.png) ![DSH 工作台布局:Git 更改视图、左右对照 Diff 与原生对话](https://raw.githubusercontent.com/lsq-dsh-plugins/dsh-workbench-layout/main/assets/workbench-git-diff.png) ## 概览 DSH 工作台布局在不替换原生对话和输入框的前提下重排官方 AppFrame。文件、Git 状态、编辑器标签和终端跟随所选工作区;聊天仍由当前会话管理。 | 区域 | 提供的功能 | | --- | --- | | 左栏 | 会话、文件目录、Git 更改与提交图、终端列表 | | 中栏 | 多文件标签、Markdown 预览、单文件 Diff、交互式终端 | | 右栏 | DSH 原生对话、任务状态、工具与输入框 | 布局、图标、颜色、菜单、弹窗、悬浮提示和响应式行为都会在官方客户端提供能力时优先复用 DSH 组件与设计变量。 ## 功能 ### 文件与 Markdown - 按需展开目录,并支持新建、重命名和删除文件或文件夹。 - 文件目录和中栏标签使用工作区 Git 状态着色:未跟踪、删除或冲突为红色,新增为绿色,修改和重命名为警告色;未跟踪状态只装饰文件本身,目录聚合其他后代状态中优先级最高的一项。 - 源码编辑器将当前缓冲区与 Git `HEAD` 比较,在可点击的变更边栏中以绿色显示新增、蓝色显示修改、红色标记删除位置,不给代码内容铺设底色。点击标记可打开带上下文、旧/新双行号、`-`/`+` 行及字符级变更强调的局部 Unified Diff,在变更间导航,或仅还原这一块;还原只修改当前草稿并支持撤销。拖动弹层右边缘可调整宽度,也可以聚焦边缘后用方向键微调;宽度会限制在当前视口内,并在切换变更、文件和刷新页面后保留。点击弹层之外会将其关闭。已暂存、未暂存和尚未保存的编辑会合并呈现,并随输入、保存、外部修改和分支切换更新。Markdown 渲染预览保持干净,切换到源码后显示这些标记。 - 在同一标签栏打开多个文件;标签溢出时可在顶栏使用滚轮横向滚动。 - 使用 `Ctrl/Cmd + S` 保存当前文件。写入会检查 DSH 文件版本,避免静默覆盖外部修改。 - 页面可见时约每秒批量检查已打开文件;从其他软件切回页面时立即检查。未编辑的标签会自动更新,未保存草稿遇到外部修改时会提示选择重新加载或保留当前内容。 - 编辑器按 CodeMirror 的规范化文本比较修改状态,并在保存时保持文件原有的 CRLF、LF 或 CR 换行风格,避免仅因换行格式产生黄色未保存标记。 - Markdown 默认以渲染后的预览模式打开,也可以切换到源码编辑。 - 在文件右键菜单复制工作区相对路径或绝对路径。 - 将 DSH 工具产生的文件索引直接打开到中栏。 ### Git 工作区 - 以列表或目录树查看已暂存和未暂存更改。 - 通过明确操作完成暂存、取消暂存、放弃更改和提交;长文件名在静止时使用整行宽度,文件行悬浮后再按一个或两个按钮的实际宽度收缩,直接悬浮按钮时显示圆形底色。 - 将工作区、暂存区、历史提交或比较结果中的每个文件作为独立 Diff 标签打开。 - 使用 CodeMirror MergeView 渲染文本 Diff,包含行号、字符级变更、未修改区域折叠、左右对照/统一/行内三种始终可选的模式和长行换行。 - 从本地与远程引用构建轨道式提交图,展示分支、合并、标签、作者、时间和文件统计;滚动时自动按每页 40 条加载更早提交。 - 在原位置展开提交,按列表或目录树排列文件,并逐个打开。 - 创建、切换、重命名和安全删除本地分支,也可从指定引用或提交创建分支。 - 管理远端,并针对上游或明确指定的远端与分支执行 Fetch、快进 Pull、Push、发布分支和同步。 - 在提交菜单中复制提交号、Cherry-pick、Revert、创建分支或与当前工作区比较。 ### 终端 - 通过 xterm.js 与 `node-pty` 在所选工作区根目录运行交互式终端。 - 在文件和 Diff 标签旁保留多个终端会话。 - 切换标签时保持终端状态,并在中栏宽度稳定后统一适配尺寸。 - 使用宿主机配置的 Shell:Windows 使用 `ComSpec`,类 Unix 系统使用 `SHELL`。 ### 对话与布局 - 右栏继续使用 DSH 原生对话和输入流程。 - 沿用官方 AppFrame 分隔线行为调整中栏与右栏宽度;右栏默认宽度随窗口变化,大屏下可继续向宽处拖动,同时为中栏保留可用空间。 - 可从左栏底部收起中栏;选择文件、Diff 或终端时会自动重新展开。 - 即使工作区会话还没有消息,也能访问该工作区的文件与 Git。 - 对话栏变窄时会适配输入工具栏、菜单、失败信息、Session Log 操作和助手消息统计。 - 收起中栏后,对话会回到官方中间位置和原始表面颜色。 ## 安装 将公开包安装到 DSH Web 配置: ```sh dsh plugin --profile web add @lsq64737/dsh-workbench-layout ``` 如果 DSH Web 正在运行,请在安装后重启。 终端功能依赖原生模块 `node-pty`。如果 pnpm 报错 `ERR_PNPM_IGNORED_BUILDS`,请在 DSH Web 配置目录中运行 `pnpm approve-builds`,批准 `node-pty`,然后重新安装插件或重启 DSH Web。 再次执行相同的 add 命令即可更新。卸载命令: ```sh dsh plugin --profile web remove @lsq64737/dsh-workbench-layout ``` ## 基本使用 1. 选择一个 DSH 工作区。 2. 使用左栏模式切换会话、文件、Git 和终端。 3. 选择文件、Diff、提交文件或终端,将其打开到中栏。 4. 拖动中栏与右栏之间的分隔线,调整编辑区和对话区宽度。 5. 使用左栏底部右侧按钮收起或恢复中栏。 Git 功能要求所选工作区根目录本身就是 Git 仓库。远端操作使用运行 DSH 的机器上已经配置好的 Git 凭据;插件不会索取或保存远端凭据。 ## 安全与隐私 - 宿主接口只解析官方工作区 id 和工作区相对路径,不接受浏览器提供的绝对路径作为文件目标。 - 拒绝访问工作区外路径和符号链接。 - 新建文件采用原子写入,保存检查版本,重命名不会主动覆盖已有项目。 - 外部文件刷新通过官方 DSH 文件系统批量比较版本;有未保存草稿时不会自动替换内容。 - 递归删除文件夹和破坏性 Git 操作需要确认。文件与文件夹删除是永久操作。 - Pull 和同步只允许快进;Cherry-pick 与 Revert 要求工作区干净,Git 报告冲突时会自动中止。 - Git 命令使用固定参数且不经过 Shell,并禁用 Git 操作中的终端凭据提示。 - 日志使用工作区 id 和相对路径,不记录宿主文件路径。 - 终端意味着可以操作运行 DSH 的机器,因此只应向你信任的用户和网络开放 DSH Web。 ## 已知限制 - 已打开标签和未保存草稿只存在于当前页面,刷新后会丢失。 - 文件编辑器只读取文本;二进制文件只显示二进制变更提示,不渲染内容。 - 关闭标签、刷新页面、连接断开、切换工作区或停止插件都会结束终端进程;默认组合最多允许八个终端同时运行。 - DSH 目前没有公开的对话栏位置 API,因此插件通过官方 AppFrame 的稳定标记调整列顺序。未来 AppFrame 重构后可能需要同步更新插件。 - 窗口非常窄时,AppFrame 官方让步规则会暂时关闭中栏,宽度恢复后再自动打开。 ## 开发 需要 Node.js 24 或更高版本,以及兼容的 DSH 开发工作区。 ```sh npm ci npm run typecheck npm test npm run build npm run test:bundle ``` ## 许可证 [MIT](LICENSE)