为 DSH 提供类 VS Code 的右侧栏+底部双工作台:文件编辑、真实终端、Git、嵌入浏览器与后台任务;按会话隔离,并向其他插件开放页面与文件预览器注册。
- 语言
- TypeScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add github:omdsh-dev/DSH-better-sidebar在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
一句话定位
为 DeepSeek Harness (DSH) 的 Web 端提供一个 VS Code 风格的右侧栏 + 底部面板双工作台,自带文件浏览/编辑、真实终端、Git 面板、内嵌浏览器与后台任务视图,按会话隔离,并把 ctx.betterSidebar 服务开放给其他插件注册新页面与文件预览器。
核心能力
- 浏览与编辑会话工作区内的文件:可缩进的目录树(含软链接识别、失效链接标红)+ CodeMirror 编辑器,支持 14+ 语言的语法高亮、搜索替换、撤销重做;可直接预览图片 / PDF / Markdown / HTML(沙箱 iframe),Office 需安装推荐插件
- 在侧边栏运行真实终端:xterm.js 渲染 + node-pty 后端 shell,断线重连会回放上次 transcript;切换标签页或刷新页面 shell 不退出
- 暂存 / 提交 / 还原 / 检出 / 历史与差异查看(diff 走专属 diff tab),支持 cherry-pick / revert
- 内嵌浏览器:以独立 tab 多开网页,内容走沙箱 iframe;外部链接可按协议拦截到侧边栏(HTTP 默认开,HTTPS 默认关)
- 后台任务面板:子代理拓扑 + 后台任务的退出码、实时输出与强制终止
- 把
ctx.betterSidebar服务开放给任意第三方插件,通过registerTab/registerFileViewer挂入新的侧边栏页面和文件类型预览器,能力与内置功能对等
技术实现
- 语言: TypeScript(ESM);前端用 React 18,后端用 Node 20+,同时为 host 和 client 两个 half 打包
- 关键依赖:
node-pty(真实终端 shell);@xterm/xterm+@xterm/addon-fit(终端前端);@codemirror/*(代码编辑器全家桶);ws+rxjs+schemastery(终端 WebSocket、状态响应式、设置 schema 校验) - 架构模式: 双半宿主插件(dual-half)。host half(
src/index.ts)注册/sidebar/api/*JSON 接口、/sidebar/file媒体、/sidebar/html沙箱预览、/sidebar/ws/terminal终端 WebSocket、/sidebar/ws/agent-terminals推送,全部走和/api同源的 Host-header trust fence;client half(src/client/index.tsx)用ctx.provide('betterSidebar', service)把注册表服务暴露给所有挂载顺序在后的插件 - 入口文件: host
src/index.ts(导出apply/Config/Context),clientsrc/client/index.tsx(导出apply/inject),挂载声明在cordis.patch.yml+package.json#dsh.bundle.patch
适用场景
当 DSH 用户需要在浏览器内"看见并操作"AI 协作产生的项目文件——比如手动修改一段代码、跑几个 shell 命令查看中间产物、对比两次修改的差异——而不想离开 DSH 切去 VS Code 或系统终端。另一个典型场景是插件作者要为自己的插件添加专属侧边栏页面和文件预览器,DSH-better-sidebar 提供注册表服务让插件之间水平扩展,免去重复造一套面板、tab 栏、分栏、终端与状态管理。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness (DSH) | 0.1.0-rc.6 | 全部 @deepseek-ai/dsh-* 与 @deepseek-ai/cordis 均锁在 ^0.1.0-rc.6,pre-release dist-tag 需对齐(见 package.json 84-104 行) |
| Node.js | >=20 | engines.node 字段声明(package.json:39-41) |
| 平台 | macOS / Windows / Linux | macOS 由 CI 每日验证,Linux/Windows 由单元测试覆盖;node-pty 优先用预编译二进制,否则需在本机准备构建工具链(macOS Xcode CLT / Linux make+g+++python3 / Windows VS Build Tools) |
| 原生模块 | node-pty ^1.1.0 | 仅终端功能依赖;缺失时插件其余能力照常可用(0.12.3 引入的懒加载 + 降级,见 issue #140) |
| 代码包 | pnpm >=10 | pnpm 11 默认拦截 build 脚本;首次装需要在 ~/.dsh/profiles/web 里 pnpm approve-builds --all 放行 node-pty |
安装方式
dsh plugin --profile web add github:omdsh-dev/DSH-better-sidebar
配置项
本插件分两类配置:宿主管道配置(写在 ~/.dsh/profiles/web/cordis.patch.yml,少改),以及用户偏好(在 DSH 设置页 → 侧边栏卡片,多改)。
宿主管道配置(defaults of Config schema)
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
readLimit | number | 单文件文本读取字节上限(超出标记为截断) | 524288 (512 KB) |
mediaLimit | number | 图片/PDF/HTML 预览的最大字节数 | 20971520 (20 MB) |
listLimit | number | 文件树单层目录最多列出的行数 | 1000 |
terminalsPerSession | number | 单个会话最多同时打开多少个 UI 终端 | 3 |
reconnectGraceMs | number | 终端 WebSocket 断线后保留 shell 进程的宽限时长(ms),方便刷新/切 tab 后无感重连 | 30000 |
shell | string | UI 终端与 agent 终端统一使用的 shell(绝对路径或可执行名);空 = 自动探测(POSIX 用 $SHELL/登录 shell,Windows 依次探测 pwsh → PowerShell 5.1) | "" |
用户偏好(在 DSH 设置 → 侧边栏卡片)
| 偏好 | 类型 | 说明 | 默认值 |
|---|---|---|---|
openByDefault | boolean | 新建会话时是否默认展开侧边栏 | false |
defaultWidthPercent | number (20–60) | 侧边栏宽度占窗口的百分比 | 35 |
autoOpenSubagent | boolean | 当前会话派生子代理时是否自动展开侧边栏并跳到子代理页 | true |
autoOpenJobs | boolean | 新增后台任务时是否自动展开侧边栏并跳到任务页 | true |
agentTerminalTools | boolean | 是否给模型注入 terminal_create/list/send/read/wait_for/resize/signal/close 这些工具;关闭时已创建的 agent 终端一并释放 | false |
bottomPanelAutoTerminal | boolean | 当前会话首次展开底部面板时是否顺便开一个终端 tab | true |
terminalFontFamily | string | 终端字体栈,留空跟随主题(--ds-font-family-code) | "" |
terminalFontSize | number (9–32) | 终端字号(px) | 13 |
interceptOpenPath | boolean | 聊天里点文件路径(工具行、生成文件、文本引用)时是否拦截到侧边栏编辑器(与编辑器自身的总开关同时开启才生效) | true |
editorExplorer | boolean | 编辑器是否合并模式(顶部路径输入框 + 可停靠树面板);关闭时回到老的独立编辑器 | true |
titleBarCompat | boolean | 顶部预留原生标题栏空间的兼容模式(仅 Windows 无边框窗口需要) | false |
titleBarStripPx | number (0–120) | 上述兼容模式预留的高度 | 40 |
htmlViewerNoSandbox | boolean | HTML 预览是否取消沙箱(不推荐,仅用于完全可信本地内容) | false |
htmlViewerDefaultUnsafe | boolean | HTML 预览默认就是无沙箱状态(每页可用顶部状态行一键恢复) | false |
browserNoSandbox | boolean | 浏览器 tab 是否取消沙箱(不推荐,仅用于完全可信站点) | false |
browserInterceptLinks | boolean | 是否把 GUI 内的外链点击拦截到侧边栏(总闸) | true |
browserInterceptHttp | boolean | HTTP 外链默认拦截到侧边栏 | true |
browserInterceptHttps | boolean | HTTPS 外链默认拦截到侧边栏(多数 HTTPS 站拒绝 iframe,默认关闭) | false |
tabsEnabled | object | 按 tab id 单独禁用(如 {"editor": false}),缺省 = 启用 | {} |
viewersEnabled | object | 按 file viewer id 单独禁用(如 {"code": false}),缺省 = 启用 | {} |
pluginSettings | object | 各第三方插件自有的设置 blob(key = 描述符 id,给 settings.pluginToggles 用) | {} |
常见问题
Q: 安装后页面上出现两个侧边栏怎么办?
A: 这说明同时走了两条挂载通道(npm bundle + 手写 patch),或在切到 bundle 通道前没清掉手写的挂载行。删除 ~/.dsh/profiles/web/cordis.patch.yml 里的手写 - insert: ... better-sidebar ... 行,让 npm 通道独占即可(README_EN.md:117-119)。
Q: 终端提示"node-pty failed to load"或终端根本打不开怎么办?
A: 这是 node-pty 没正确加载。0.12.3 之后(issue #140)插件不会因此崩溃:UI 终端 tab 会显示一条可复制的修复命令、agent 终端工具会被自动跳过。你只需在 ~/.dsh/profiles/web 里跑 pnpm approve-builds --all && pnpm rebuild node-pty,重启 DSH,回到终端 tab 点"Retry"。
Q: 它要求什么 Node 与 DSH 版本?为什么我换 Node 老版本就装不上?
A: 强约束:engines.node: ">=20";所有 @deepseek-ai/dsh-* 与 @deepseek-ai/cordis 都被锁在 ^0.1.0-rc.6(package.json:84-104)。升 DSH 或 Node 后遇到装载失败,先核对发行 dist-tag 与 lockfile 是否同步。
Q: 别的插件怎么向它注册新页面和文件预览器?
A: 在你的插件 client half 用 ctx.betterSidebar.registerTab({...}) / registerFileViewer({...})——和内置 6 tabs + 6 viewers 走的是同一套 API。务必用 ctx.effect(() => register(...)) 包一层,disposer 由 Cordis 在 HMR 时自动调用,避免反复装载报"already registered"。全文指南见仓库 AGENTS.md / docs/external-plugin-guide.md。
Q: 浏览 / 编辑 / 终端的数据存在哪?会话之间会不会串?
A: 布局、tab 列表、面板几何等 UI 状态存在浏览器 localStorage 并以 sessionId 隔离;宿主侧的文件读写、Git 操作、终端进程、媒体/HTML 预览路径全部限定在当前会话的 cwd 下,不会越界读其他会话的工作区。卸载插件会清掉 UI 状态,磁盘上的项目文件与 .git 完全不受影响。
Q: 我能完全卸载吗?
A: 能。~/.dsh/profiles/web/package.json 的 dependencies 里去掉 "dsh-better-sidebar" 行,pnpm install 后重启 dsh web,硬刷新浏览器即可。该插件不写入 home 目录、不依赖后台进程,没有"残留物"。
Q: 内嵌浏览器能登录 GitHub 之类的站点吗?
A: 浏览器与 HTML 预览默认跑在沙箱里(opaque-origin iframe,allow-same-origin 关闭),无法承载第三方 cookie / 登录态,需要登录的站点会自动开系统浏览器;站点被 X-Frame-Options 或 CSP frame-ancestors 拒绝嵌入时,侧边栏会显示原因并提供"在浏览器打开"按钮。需要登录的站可以在设置里临时关掉沙箱,但这样浏览内容会获得与 GUI 同源的权限,仅在可信站点上用。
Q: 移动端能用吗?
A: 右侧栏在窄屏(<768px)下会自动合并为全宽抽屉,照常能用;底部面板在窄屏不可用,浏览器面板里的 tab 会被并入右栏一次;切回宽屏后这些 tab 不会自动回到右栏,需要手动拖回。这是 README 已记录的已知行为。
上手难度
入门 — 单条 dsh plugin add + 硬刷新即可用;想要的就是右侧栏 + 文件编辑 + 内置终端/HTTP 外链浏览。再往深一点调的是:在设置里挑选要启用的预览器、调整面板宽度、决定 agent 终端工具是否注入、决定 HTML/浏览器沙箱是否取消等。
已知问题与限制
- Git 没有 push/pull/fetch:内置 Git 面板覆盖
status / diff / stage / commit / branch / checkout / log / cherry-pick / revert / discard / show;push/pull/fetch 需要装推荐插件dsh-git-remotes - 没有文件 watcher:文件树不会自动刷新,需要手动点刷新按钮
- 工具行内联"打开文件"按钮无法被拦截:只有经过
ctx.workspaces.openPath的路径(即"在生成文件"、文本引用等)会被interceptOpenPath拦截 - 把终端 tab 拖到别的 pane 时会重启:跨 pane 移动 terminal tab 会重新挂载(remount),shell 进程不跨 pane 保留
- Office 三件套预览已迁到推荐插件:0.12 起
.docx/.xlsx/.pptx不再内置,需安装"Add Plugins"弹窗里的 Office 预览插件;没装时这些文件会落到下载按钮或代码兜底 - 浏览器沙箱无登录态 + 部分站拒绝嵌入:需要登录的页面请在浏览器里完成;拒绝嵌入的站会在侧边栏给"在浏览器打开"
- HTML 预览只显示已保存的文件:未保存的编辑器修改不会反映到预览
- 移动端无底部面板:宽
<768px时底部面板不可用,tab 会并入右栏一次;切回宽屏后这些 tab 不会自动回到右栏(README 已记录,README_EN.md:226) node-pty加载失败已降级(issue #140):终端 tab 会显示修复 banner,agent 终端工具自动跳过,插件其余功能不受影响- 双重挂载会得到两个侧边栏:同时启用 npm bundle + 手写 patch(或同时挂 npm bundle + plugin-registry)必须保留一条通道;详情见上文"常见问题"
- 透明/玻璃质感皮肤的处理(issue #90):终端与编辑器面板会主动回退到不透明底色,避免文字叠在皮肤画上滚动;非面板表面仍跟随主题
右侧栏 + 底部面板双工作台,并把
ctx.betterSidebar 服务开放给所有插件——通过
registerTab / registerFileViewer 注册新的侧边栏页面与文件预览器。
✨ 功能一览
- 🗂️ 文件工作台:资源管理器(懒加载目录树;软链接按目标类型展示——目录软链接可展开、失效链接标红)+ CodeMirror 编辑器;图片 / Markdown(含 Mermaid 图表,strict 安全渲染 + 点击放大)/ HTML / PDF / Office 内联预览
- 🌐 内嵌浏览器:多开网页 tab,后退 / 前进 / 刷新;内容运行在沙箱 iframe;外链默认按协议分流——HTTP 在侧边栏打开、HTTPS 走系统浏览器(设置页可分别调整)
- 💻 真实终端:xterm.js + node-pty 真实 shell,断线重连回放;可选为模型注入
terminal_*工具 - 🌿 Git 面板:真 diff + VSCode 式 diff tab、历史、右键暂存 / 提交 / 还原
- 🧩 后台任务页:subagent 拓扑 + 后台任务(退出码 / 实时输出 / 强制终止)
- 🪟 双工作台:右侧栏 + 底部面板;拖 Tab 拆分 / 合并分栏(可跨面板),移动端自动合并全宽抽屉
- 🔁 会话隔离:布局 / Tab / 面板按会话持久化,陈旧状态自动净化
- ⚙️ 声明式设置:设置页「侧边卡片」逐项独立开关,二级设置经齿轮弹窗
- ⚡ 按需加载:启动只拉 ~325KB 核心,终端 / 编辑器 / Mermaid 图表等重依赖用到才按需拉取(设计文档)
- 🌏 多语言:界面文案跟随 DSH 语言(zh / en)实时切换
🔌 核心理念:服务优先——内置的 7 tab + 6 viewer 与第三方插件通过同一套
ctx.betterSidebarAPI 注册,能力完全对等;官方不再内置、可由生态提供的功能,交由生态插件实现。接入文档见下方「🔌 服务化」与 外部插件接入指南。
🆕 最近更新
v0.13.0
✨ 新功能
- 📁 文件窗口与资源管理器二合一(#151):新
editorExplorer设置(默认开,编辑器卡齿轮)——文件 tab 增加路径输入框头部 + 可开关的右侧停靠文件树(每 tab 记忆展开/宽度,左缘拖拽调宽 160~480px,全局文件名搜索走 hostfs.search路由,预算封顶并跳过.git/ 符号链接目录);合并模式下树点击 / 输入框 Enter 原地切换当前 tab,独立模式按路径新开;新会话默认 seed 空文件窗口(Files)替代 explorer tab,无路径窗口在合并模式为带 chrome 的空文件窗口、独立模式为纯资源管理器;树右键提供「在新 Tab 中打开」「在侧边打开」(split) - 🎛️ 声明式设置 select 行(#151):设置项新增
type: 'select'(options支持 value/title/desc/icon,multi多选存数组);带图标的选项渲染大图标选项卡、收起态同样显示图标;editorExplorer改为图标化下拉(合并 / 独立);能力清单新增settingSelect - 🔀 与 dsh-web-ui 家族右侧面板互斥(#181):读取
aionui-panel设置命名空间的提供方选择——当选择「使用 aionui-panel」时,整个 better-sidebar(右侧栏 / 底部面板 / 浮动入口 / 各类接管)不再挂载;选择 DSH-better-sidebar(或未安装 aionui)时正常。设置页保存后实时生效(settings-document 推送),无需刷新
📝 其他
- 安装 / 更新命令统一为
dsh-better-sidebar@latest(双语 README 同步)
v0.12.3
✨ 新功能
- 🎨 皮肤兼容(令牌驱动):全面消费 DSH 设计令牌,与 dsh-web-ui 皮肤中心 10 款皮肤兼容,换肤自动跟随;终端/编辑器表面在透明/半透明玻璃值下回退不透明底色,文字不叠在皮肤背景上(#110,修复 #106 #105 #90 #60,附带 #52 #57 #92)
- 🗂️ 统一路径处理:UNC 路径 / 软链接分类(目录软链接可展开、失效链接标红)、HTML 路由平台守卫(#134,#65 #67 #43 #79 #115)
- 🖥️ 终端 shell 可配置:设置项自定义 shell,Windows 自动探测 pwsh(#95)
- 📝 编辑器新增语言:C# / Kotlin / Swift 语法高亮(#120)
- 🧭 设置页导航图标:设置页导航图标与布局优化(#114)
- ➕ 推荐插件目录新增:
dsh-git-remotes——Git 远程 Tab(分支/上游/ahead-behind、fetch 可 prune、ff-only pull、确认后才 push,不替换内置暂存/提交)(#91);dsh-video-preview——视频内联预览(.mp4/.webm/.mov/.mkv/.avi 等,自带 /video 宿主路由支持 HTTP Range 206 拖进度条,不受 20MB mediaLimit 限制)(#126)
🐛 修复
- 🔧 xterm 依赖迁移:弃用的 xterm 迁移至
@xterm/xterm(Closes #122,#128) - 📝 Markdown 编辑器:选区转对话弹窗恢复可用(#24)
- 🐛 node-pty 加载失败不再拖垮 server(#140):宿主半改为懒加载 node-pty,缺失时插件照常挂载,终端以修复提示横幅(可复制命令 + 重试按钮)呈现,agent 终端工具自动跳过
- 🧪 测试工程:单元测试拆分(#141)+ smoke 偶发失败修复
🚀 工程
- 接入 GitHub Release 自动发版 npm(Trusted Publishing,产物带 provenance),本版起打 tag 即自动发布(#148)
v0.12.2
- 📐 位置兼容模式:设置页新增开关:为 Windows 右上角原生标题栏预留顶部空间,侧边栏按钮与内容整体下移(默认关闭);下移距离可在齿轮弹窗中自定义(0–120px)
- 🔌 服务化基座:完整类型导出 +
version/features能力探测、状态订阅(getSnapshot/subscribeState)、tab 角标、onOpen/onActivate/onClose生命周期回调、updateTab/activateTab/openFile、定向打开、meta跨刷新持久化、插件自有设置(pluginToggles/render)、外链点击目标认领(urlTarget) - ➕ 添加插件:设置页「推荐插件目录」+ 一键复制安装命令;内置 Office 预览迁至推荐插件
- 🖱️ 标签页滚轮:标签页栏支持鼠标滚轮横向滚动
- 🐛 修复:远程访问 403(信任栅栏改用
trustedHosts)、侧边栏崩溃 #31、Windows 下 HTML 预览盘符路径
v0.12.1
- 🔌 服务化基座:完整类型导出 +
version/features能力探测、状态订阅(getSnapshot/subscribeState)、tab 角标、onOpen/onActivate/onClose生命周期回调、updateTab/activateTab/openFile、定向打开、meta跨刷新持久化、插件自有设置(pluginToggles/render) - ➕ 添加插件:设置页「推荐插件目录」+ 一键复制安装命令;内置 Office 预览迁至推荐插件
- 🖱️ 标签页滚轮:标签页栏支持鼠标滚轮横向滚动
- 🐛 修复:远程访问 403(信任栅栏改用
trustedHosts)、侧边栏崩溃 #31、Windows 下 HTML 预览盘符路径
📝 说明:0.12.0 正式版因 npm 判定版本已发布无法复用,正式发布改用 0.12.1,两者内容一致。
v0.12.0
- 🔌 服务化基座:完整类型导出 +
version/features能力探测、状态订阅、tab 角标、生命周期回调、定向打开、meta跨刷新持久化、插件自有设置 - ➕ 添加插件:设置页「推荐插件目录」+ 一键复制安装命令;内置 Office 预览迁至推荐插件
- 🖱️ 标签页滚轮:标签页栏支持鼠标滚轮横向滚动
- 🐛 修复:远程访问 403(信任栅栏改用
trustedHosts)、侧边栏崩溃 #31、Windows 下 HTML 预览盘符路径
🚀 安装
前置:已装好 DSH(dsh web 能正常运行),Node.js ≥ 20、pnpm ≥ 10。
dsh plugin --profile web add dsh-better-sidebar@latest
装完硬刷新浏览器(Cmd/Ctrl+Shift+R)即可看到侧边栏(DSH 对 client 改动热加载,无需重启;仅 host 半更新时需要重启)。
更新
dsh plugin --profile web add dsh-better-sidebar@latest
也可把 ~/.dsh/profiles/web/package.json 里的版本号改高后 pnpm install。改完硬刷新浏览器(Cmd/Ctrl+Shift+R)即可(client 改动无需重启 DSH)。
常见问题
| 现象 | 原因与解决 |
|---|---|
报 Ignored build scripts | pnpm 11 拦截构建脚本。在 profile 目录(~/.dsh/profiles/web)跑 pnpm approve-builds --all。 |
报 minimum release age / 版本不足 24h | 装的版本发布不足 24 小时。等 24h 或重跑一次(pnpm 会自动补 minimumReleaseAgeExclude)。 |
| 报「找不到 profile 目录」 | 先跑一次 dsh web,让它初始化 ~/.dsh/profiles/web。 |
| 页面出现两个侧边栏 | 双挂载:~/.dsh/profiles/web/cordis.patch.yml 还留着旧的手动挂载行,删掉那段 - insert: ... better-sidebar ...。 |
| Windows 下终端无法使用 | node-pty 依赖预编译二进制;若当前 Node 版本没有对应产物,需装编译工具链(VS Build Tools)。主流 Node 版本一般已有预编译。 |
| 终端提示「node-pty 加载失败」 | node-pty 安装缺失/损坏(如 pnpm 拦截了构建脚本)。终端横幅会给出修复命令:复制到 DSH 所在环境的终端/cmd 执行(在 ~/.dsh/profiles/web 下 pnpm approve-builds --all && pnpm rebuild node-pty),完成后重启 DSH 并点重试。插件与 DSH 核心使用同一 node-pty@^1.1.0,修复后两者同步恢复。 |
提示 dsh: command not found | 先安装 DSH;或直接用 npx -y --package @deepseek-ai/dsh dsh plugin --profile web add dsh-better-sidebar@latest。 |
从源码安装 / 开发(可选,替代 npm 方式)
调试本地改动或跟随开发分支时,把依赖指向本地克隆并自行构建:
1. git clone https://github.com/omdsh-dev/DSH-better-sidebar.git ~/Code/DSH-better-sidebar
cd ~/Code/DSH-better-sidebar && pnpm install && pnpm build
2. ~/.dsh/profiles/web/package.json 的 dependencies 写 "dsh-better-sidebar": "link:<克隆目录绝对路径>"
3. ~/.dsh/profiles/web/cordis.patch.yml 追加挂载行:
- insert:
- id: better-sidebar
name: 'dsh-better-sidebar'
4. 在 ~/.dsh/profiles/web 执行 pnpm install
5. 硬刷新浏览器(Cmd/Ctrl+Shift+R)即可看到效果(client 改动无需重启 DSH;host 半改动才需重启)
更新:git pull && pnpm install && pnpm build → 硬刷新浏览器即可(client 改动热加载生效,无需重启 DSH;host 半改动才需重启)。切回 npm 通道时,把依赖改回 "dsh-better-sidebar": "^0.13.0" 再 pnpm install。
通过 plugin-registry 安装(可选,与上述二选一)
前置:DSH 已集成 plugin-registry(dsh registry 可用)。同时启用两个通道会双挂载(Node 半挂两次、页面两个侧边栏)。
git clone https://github.com/omdsh-dev/DSH-better-sidebar.git && cd DSH-better-sidebar
pnpm install && pnpm build
node scripts/package-registry.mjs # 组装 registry/ 暂存(含清单 + 产物 + README,不入库)
dsh registry install ./registry # 安装(默认禁用)
dsh registry enable dsh-external/dsh-better-sidebar
更新:git pull && pnpm install && pnpm build → node scripts/package-registry.mjs → dsh registry uninstall/install/enable。切换通道前先移除另一通道的挂载。
⌨️ 快捷键
| 操作 | 按键 |
|---|---|
| 保存编辑 | Ctrl/Cmd + S |
| Git 提交 | Ctrl + Enter |
| 关闭 Tab | 鼠标中键 |
| 拆分/合并分栏 | 拖 Tab 到分栏边缘 / 中间 |
| 引用文件到输入框 | 悬浮行尾 @文件 按钮 |
| 复制文件路径 | 右键行 → 复制相对/绝对地址 |
🔌 服务化:注册 tab 与文件预览器
从 v0.4.0 起暴露 ctx.betterSidebar 服务,其他插件可注册侧边栏页面与文件预览器(内置 7 tab + 6 viewer 亦通过同一服务注册):
import type {} from 'dsh-better-sidebar' // 触发 ctx.betterSidebar 类型合并
export const inject = ['betterSidebar']
export function apply(ctx: Context) {
ctx.effect(() => ctx.betterSidebar.registerTab({
id: 'my-plugin:db', title: 'Database', component: ({ scope }) => <DbView sessionId={scope.sessionId} />,
}))
}
v0.12.1 补齐基座能力(完整类型导出、能力探测、状态订阅、tab 角标、生命周期回调、定向打开、插件自有设置等),详见下方接入文档。
完整接入文档:
AGENTS.md——仓库内维护的接入文档(全字段、匹配算法、HMR 陷阱、声明式设置、版本探测);docs/external-plugin-guide.md——面向外部插件开发者的接入指南(含完整最小示例)。
➕ 添加插件(推荐插件目录)
设置页「侧边卡片」两个网格末尾的虚线卡片分别打开 Tab / 预览插件弹窗:声明扩展点、「在 GitHub 上浏览更多插件」按钮(GitHub topic dsh-better-sidebar)、推荐插件目录(名字 / 仓库 / 简介 / 安装脚本),每个条目「跳转」直达仓库、「复制」把安装命令写入剪贴板。
收录新插件:向 src/client/plugins-tabs.ts(Tab 注册)或 src/client/plugins-viewers.ts(文件预览注册)追加一条 PluginEntry,并把仓库打上 dsh-better-sidebar topic;数据完整性由 tests/plugin-list.spec.ts 守护。
🛠️ 开发与构建
pnpm install # @deepseek-ai/* 已发布到 npm(^0.1.0-rc.6),直接解析、无需令牌
pnpm typecheck # tsc --noEmit
pnpm build # → lib/index.js + lib/invariant.js + lib/client.js + lib/client-registry.js + lib/types
pnpm test # vitest(含 manifest 一致性守卫,需先 build)
pnpm watch # tsdown --watch
架构:单 npm 包、host/client 双半结构——host(src/index.ts):/sidebar/api/* JSON API、/sidebar/file 媒体路由、/sidebar/html 预览路由、/sidebar/ws/terminal WebSocket(fs / git / pty / 预览,全部会话级 + 信任围栏);client(src/client/index.tsx):portal 侧边栏 + 各视图 + 拦截;状态按会话持久化 localStorage。插件按 DSH 官方规范组织(无 default 导出、双 client bundle),运行期不依赖 npm / checkout(@deepseek-ai/* 由 web profile 提供)。
🔐 安全
- 路由受 Host 头信任围栏保护(与
/api一致);fs.write原子写入;媒体/预览路由仅限会话 cwd 内文件;git 只调 CLI、绝不设置身份 - HTML 预览与浏览器 tab 的内容在不透明源沙箱 iframe 中渲染(无
allow-same-origin/allow-top-navigation、no-referrer、权限策略全禁);/sidebar/html路由带 CSPsandbox+ 大小/路径边界;地址栏拒绝javascript:/data:/file:与 localhost 等本机地址 - 界面实时显示沙箱状态(关闭时红色警示),可临时解锁当前页面;设置页可按功能关闭沙箱(默认关闭该设置,带警告文案)——关闭后内容与界面同源,仅建议对完全可信内容使用
⚠️ 已知限制
- Git 无 push/pull/fetch;无文件 watcher(手动刷新);工具行内文件打开按钮不可拦截
- 终端 Tab 拖到另一分栏会重挂载(shell 重开)
- Office 三件套预览(.docx/.xlsx/.pptx)已移至「推荐插件」(Office 预览插件,见设置页「添加插件」弹窗);未安装时此类文件走代码/下载查看兜底
- 浏览器沙箱无登录态/第三方 Cookie 受限,部分站点登录需走弹窗;被
X-Frame-Options/frame-ancestors拒绝嵌入的站点(如 arxiv.org)显示原因面板(含「在浏览器中打开」);iframe 内部跳转不进后退栈 - HTML 预览渲染的是已保存文件(不反映未保存草稿)
- 移动端(<768px)无底部面板:进入窄屏时其标签页一次性并入右侧栏(迁移后回桌面仍保留在右侧栏),桌面端的底部面板只在宽视口下可用;移动端底部首展自动开终端不触发
🖥️ 平台支持
Windows / Linux / macOS 三平台适配(macOS 日常验证;其余经单元测试覆盖);node-pty 优先预编译二进制,失败需编译工具链(Windows VS Build Tools / Linux make+g+++python3 / macOS Xcode CLT)。
🔗 友情链接
- dsh-tianshu-tui:DeepSeek Harness 交互式终端 UI 插件(渲染核心由自研 harness agent Tianshu-Tui 演进而来),在官方基础上增加 TDD 与证据门等工作流
- dsh-TUI:Claude Code 风格全屏交互终端插件——像素鲸鱼顶栏、实时工作状态行、思考流式展开、双击 Esc 回滚、上下文进度条 + TPS 仪表,npm 一键安装
- dshfind 插件超市:三方插件市场——GitHub topic
dsh-plugin下的公开仓库清单,每日同步 star、贡献者与增长数据 - DeepSeek Harness Desktop:为 DeepSeek Harness 生态打造的现代化桌面端——无需配置 Node.js 或执行命令即可启动和管理本地 Harness 服务;官网