packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
三栏工作区布局,提供文件树浏览、编辑文件、非线性会话导图视图,并且支持手机模式。
English | 中文
此 bundle 将 DeepSeek Harness Web 的根布局替换为左中右三栏:左侧栏(Session / 工作区选择器 + 文件树视图切换)· 中部高亮文件预览与受控编辑器 · 右侧聊天。文件预览栏默认在对话左侧,可在「工作区设置 → 浏览与预览」中切到右侧;文件树不再独占一栏,而是融合进左侧栏,与「会话列表」通过顶部按钮互切。会话头部提供「导图」按钮,可随时进入导图模式:会话分支树在预览区作为标签页打开,右侧聊天保持可见、可继续对话。
插件保留现有侧栏、会话、详情与全局浮层的 Slot 合约,内置的新建会话、会话列表、设置、聊天、工具详情、审批等仍由原插件提供;工具详情以右侧抽屉覆盖在三栏布局上,不额外占用常驻栏位。
![]() | ![]() |
|---|
| # | 能力 | 一句话价值 |
|---|---|---|
| 1 | 🗂️ 工作区文件浏览与预览标签页 | 在对话旁边像 IDE 一样浏览工作区:文件树、按会话恢复的预览标签、14 种编码与 Markdown / HTML / 图片 / PDF / Office 文档渲染视图 |
| 2 | ✏️ 打开即改的内置编辑器 | CodeMirror 6 打开即可编辑,改动全程落在暂存盘草稿,保存时与磁盘三方合并,永不静默覆盖 |
| 3 | 🧭 会话分支导图 | 把一条对话线变成可自由分叉的导图:任意轮次 fork 新分支、分支会话集中管理、流式输出可视化 |
| 4 | 🎯 编辑器上下文注入 | 打开的文件或选中的代码以 <opened_file> / <selection> 注入对话,模型看到的就是你选的那一段 |
cwd 与 Workspace 路径一致时同样识别),目录优先、逐级展开、可手动刷新。展开状态按会话持久化,刷新后自动恢复;点击「刷新」重新列目录后树的滚动位置也会还原(预览标签的垂直滚动位置同样随会话恢复)。·。<img>(静态的与脚本运行时生成的)、srcset、video[poster]、样式表里的 url()、字体 / 媒体、<script src> / <link rel=stylesheet>、页面自己的 fetch() / XHR,以及同目录的其它 HTML;编辑内容实时生效(防抖 400 ms)。图片(png / jpg / jpeg / gif / webp / bmp / ico / svg)直接预览;只读文本可分页浏览完整文件。查看方式按文件切换时重置为该文件的默认视图、不持久化。pdf / office 两类):.pdf 经标准工作区文件接口取原始字节直接预览;.doc / .docx / .ppt / .pptx / .xls / .xlsx 交给 Harness Host 的 officeToPdf 服务在本机用 LibreOffice 转成 PDF 后预览(有界队列 + 按内容摘要缓存,重复打开不再重转)。两者都以 blob URL 交给浏览器自带 PDF 阅读器渲染,因此缩放、翻页、文字选择与打印都可用,且不向产物里塞 PDF 引擎;转换缺字体时在顶部横幅列出字体名。这类标签与图片一样只读、无草稿、不进编辑器上下文,磁盘变更时自动重新转换。Host 未挂载转换服务时给出「当前 dsh 未提供文档转换服务」提示而不是空白。/workspace-studio/api/encodings 为准,请求失败回退内置清单,操作不会中断。dsh-resource://file/... 地址)不再落到 Harness 右侧栏,而是解析为当前会话工作区内的路径,直接在本插件的预览标签页中打开;工作区外的文件转为会话内的只读外部预览标签(标签名标注「工作区外文件」,不写工作区、不落盘),只有「会话没有关联的工作区」才给出明确提示。dsh-resource://plan/... 与 dsh-resource://plan-review/... 地址)同样落在本插件的预览标签页里,以渲染后的 Markdown 显示完整计划;已记录的计划经 Harness 的 plan 资源读取会话历史,临时审阅文本只存在于本次页面(刷新后标签不再恢复)。计划标签是会话内的临时标签,不写入预览持久化。dsh-resource://changes-review/session/... 地址)在本插件的预览标签页里打开该轮的变更审查:左侧列出该轮所有变更文件(含 +/− 行数,二进制与超大文件以标签标注),右侧按 Harness 的 api/changes.summary / api/changes.diff 路由渲染逐文件统一 diff(行号、@@ 段头、新增 / 删除着色,超过 5000 行截断提示),头部可「在编辑器中打开」当前文件(工作区外走只读预览)。标签按索引定位到点击的那一行,同一轮重复点击只会跳转而不新开标签;审查标签是会话内的临时标签,不写入预览持久化。标签内左右两栏(文件列表 / 内容对比)之间可拖拽调宽(也支持键盘 ←/→ 步进),宽度是页面内的临时状态:切换预览标签、切换会话或工作区再切回都不变,刷新后回到默认(与审查标签本身一样不落盘)。py / pyw / sh / bash / zsh / ps1 / psm1 / bat / cmd / exe / com 时(POSIX 上带可执行位的无扩展名文件同样算),预览列变成上下两段——上方仍是原来的代码预览(编辑、保存、搜索、差异色标与滚动条刻度全部不变),下方新增运行控制台。控制条一行给出状态胶囊(未运行 / 运行中计时 / 退出码与用时 / 已中止 / 无法运行)、Host 解析好的命令(解释器与文件是固定的只读前缀,尾部参数可直接编辑、回车即运行)以及运行 / 停止 / 重跑 / 清空 / 复制 / 跟随(自动滚到底部)六个按钮;预览列较窄时按钮组自动换行,绝不裁掉按钮。中间的分隔条可拖动调高(也支持键盘 ↑/↓ 步进、回车或双击复位为 62/38),高度与折叠状态按标签记在页面内存里;文件头新增的「控制台」按钮折叠 / 展开下半段,正在运行的文件无论切到哪个标签,标签栏上都有蓝色脉冲点。输出按行实时显示(stdout 默认色、stderr 红字、运行中末尾闪烁光标),结束时补一行退出摘要(如「· 进程已退出,代码 1 · 用时 1.24 s」);刷新页面不会中断进程,重新打开该文件即可接着看(Host 侧保留 256 KB 环形缓冲与运行记录);同一文件同时只允许一个进程,不同文件可并行(上限 8 个)。.py 指定 / 直接执行),点开即为这一个文件指定解释器的绝对路径(可「测试」取版本号、可清除回到自动检测,还能顺手勾「同时设为 .py 的全局解释器」)。设置 → 工作区设置 → 解释器 里新增「全局自定义解释器」:11 个可运行后缀逐行列出当前生效值(自动检测到的也显示,.zsh 一类找不到的直接标「未找到」),可为每个后缀指定所有工作区共用的解释器,并列出所有文件级覆盖(可逐个或全部清除)。解析优先级固定为 文件 > 全局后缀 > 自动检测;保存时校验「绝对路径 + 文件存在 + 可执行」,不通过就地报错、不写入;事后解释器被卸载 / 移动时,控制台用琥珀条写明「哪一层失效了、失败路径是什么、现在回退到哪一层」,绝不静默回退。自定义解释器的参数按被指定的那个程序判定(-3 只给 py 启动器,指向 python.exe 时不再误拼 python.exe -3)。spawn,从不经过 shell(参数文本没有转义面);解释器只在白名单里按 PATH 解析(Windows 的 py -3 → python、.bat 走 cmd /c、.ps1 走 powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File、.exe 直接执行),首次运行会弹确认框列出实际命令、工作目录、解释器(含来源)与风险说明,可勾选「本工作区不再询问」(该信任标记落在 Host 侧,两端共享);工作目录固定为文件所在目录,路径走与其他接口相同的工作区围栏校验;stdin 关闭(脚本读到 EOF 而不是把面板挂住),子进程环境剥离 DSH_* 变量;「停止」先 SIGTERM(Windows 用 taskkill /T /F)并在 1.5 秒后强杀整个进程树,dsh 退出时也会终止所有由它启动的进程。找不到解释器时给琥珀提示卡(列出已尝试的名字),可就地重新检测或指定解释器绝对路径(同样存在 Host 侧)。.sh:解释器只认 Git for Windows 的 bash(先探 %ProgramFiles%\Git\bin\bash.exe 等三处标准安装位置,再退回 PATH),不使用 Windows 自带的 bash.exe——那是 WSL 启动器,没装分发版时只会打印「安装分发版」的说明,而装了分发版也不能接收本插件传的参数(文件与工作目录都是 Windows 路径)。两者都没有时,控制台给的是「装 Git for Windows 或指定 bash 路径」的提示,而不是一段看不懂的报错。同理,Microsoft Store 那种 0 字节的 python.exe 占位符不会被当成解释器。cmd 里的工具按系统代码页写 GBK 等)。控制台按 BOM → NUL 特征 → 严格 UTF-8 → 系统区域代码页的顺序自动识别(逐流、跨块保持状态),所以中文脚本的中文输出不会变成乱码。A− 100% A+ 步进器,用来调整该标签源码编辑器正文的文字大小:点 A− / A+ 按 10% 一档增减(60%–200%,到边界按钮置灰),点中间的数字可直接输入百分比(只收数字、最多 3 位),回车确认后立刻生效(Esc 取消、点别处=确认);输入超范围会夹到边界并在底部状态栏说明,清空(或输入 0)回车=清除本标签的设置、回到基础字号(输入框里灰字提示的就是基础字号)。生效时底部状态栏回一句「文字大小:150%」。
~/.dsh-plugin/dsh-workspace-studio/drafts/<workspaceId>/,长期留档),源文件全程不被触碰;刷新页面后草稿、快照与编码一并恢复。自动写盘不视为「保存」,· 保留到显式保存;localStorage 只记脏标记,不存内容。Ctrl/Cmd+F、F3);Ctrl+K+J 展开所有已折叠区域,Ctrl+K+1..9 按层级折叠(如 Ctrl+K+2 折叠所有第二层折叠区域),Ctrl/Cmd+S 在任意焦点状态可用(含聊天输入框);每类文件类型组可在设置页选择 10+ 款高亮预设(默认、经典、暖色、冷色、单色、XML (VS Code) 等),按类型记忆。
行号 → 增删改竖条 → 折叠箭头;绿色竖条 = 新增、蓝色竖条 = 修改、红色小三角 = 此处删除了若干行(纯删除落在删除生效处的下一行上沿,删除在文件末尾时贴末行下沿、三角朝上);行底色默认开启(新增铺绿、修改铺蓝,删除位置在行顶画一条红细线),可在设置里关闭或改色。比对的是编辑器里的实时内容(含未保存编辑),因此保存时色标不跳变;基线(Git HEAD / SVN BASE)读不到、文件过大(>2 万行或 >2 MB)、二进制或差异超出计算预算时不上色,底部状态栏用一枚灰色「未计算变更」说明原因。::-webkit-scrollbar-*,Chromium 内核(Chrome / Edge / 桌面端)生效;Firefox 上轨道无法作画,表现为滚动条保持 8px 且无刻度,其余功能不受影响。⌄ / › 文本字形,展开朝下、折叠旋转朝右;静止时半透明,鼠标悬停(或该行已折叠)时全显,热区为整行高。dsh-ws-preview 内,可与其他文件标签页自由切换),右侧聊天保持可见可继续对话;关闭 = 标签页 × 按钮。首次进入时,插件从会话的完整事件日志反向解析全部轮次,把整个会话切成一根提问卡片链,并持久化到 ~/.dsh-plugin/dsh-workspace-studio/mindmap/ —— 该持久化文档是导图的唯一信息源。<opened_file>...</opened_file>、选中文本模式渲染 <selection>...</selection>(无选区时不携带文件字节),灰色发送不附加上下文。/plan <消息> 这类「参数就是提示文本」的斜杠命令走的是 harness 的命令提交事务(claim.submit → commands.execute,不经过 sendSession),插件在该事务上把封套拼到命令参数前;手输整行回车、或从 / 菜单选中命令后再输入参数,两条路径都会注入(后者由 harness 在选命令时就把 token 写进草稿、回车时不再裁决,所以插件在 claim 生成处就完成包装)。因此模型看到的仍是「文件/选区 + 你写的消息」,气泡折叠与标题守卫同样生效;/plan off 这类控制词与裸命令不注入。/goal 目前不在注入清单内(其参数会持久化为目标文本,不适合塞 XML)。| 能力 | 说明 |
|---|---|
| 🧹 文件操作 | 右键新建 / 重命名 / 复制 / 剪切 / 粘贴 / 删除 / 复制名称与路径 / 「在资源管理器中打开」,支持 F2、Ctrl/Cmd+C/X/V、Del;剪切 + 粘贴 = 移动,同名目标自动去重(a.txt → a-1.txt);剪贴板为内存态、按工作区隔离,刷新即失效 |
| 🔎 搜索 | 结果按文件分组,点击文件头折叠 / 展开该文件的匹配条目,点击条目打开文件并跳到对应行;支持区分大小写;大文件仅搜索开头部分时标注「部分」 |
| 🌿 版本控制状态 | 工作区是 Git / SVN 仓库时,变更信息全部直接长在文件树上(不额外占一块面板):行上显示状态徽标(已修改 / 已新增 / 未跟踪 / 已删除 / 已重命名 / 冲突 / 已忽略),目录显示子树变更数,已删除的文件以删除线幽灵行出现在它原本的父目录里(不可预览);树上方一条状态条给出仓库类型、分支(Git)或 r<版本>(SVN)与变更总数,并提供「仅变更」「忽略项」两个开关——「仅变更」时同一棵树只留有变更的文件并自动展开所有含变更的目录(无需逐层点开,会话内有效、刷新恢复)。编辑器里同一套语义还会画在行号右侧(差异色标,见「内置编辑器」),底部状态栏在原有内容之间补一枚 +n ~n −n 摘要(有变更才出现,未计算时说明原因)。状态来自本机 git / svn 命令,只读:不联网、不暂存、不提交、不写 index.lock;未安装命令或读取失败时状态条显式提示(可点击重试),不会静默无状态 |
| 💬 聊天增强 | Think 条与编辑 / 写入 diff 以常驻卡片显示,正文视口行数可调(5–30,默认 10)、可滚动回看、可点击标题收起 |
| 🏃 运行控制台 | 预览可执行文件(脚本 / .exe)时下方给出运行控制台:运行 / 停止 / 重跑 / 清空 / 复制 / 跟随自动滚底,stdout 与 stderr 分色、退出码与用时、可拖动高度、按标签记住折叠;命令不经 shell、首次运行需确认、可中止整个进程树,详见「工作区文件浏览与预览标签页」 |
| 🪟 在外部打开 | 右键标签:HTML 走「在浏览器中打开文件」——Host 把文件的真实路径交给系统默认浏览器,页面因此以 file:// 打开,相对样式 / 脚本 / 图片照常加载(file:// 页面自己的 fetch() / XHR / ES module 仍受浏览器 CORS 限制);Markdown 仍走「在新窗口内打开」,由 Host 渲染成文档(GFM,页面无脚本;链接与图片仅放行 http / https / mailto);其余文本文件同样留在「在新窗口内打开」的浏览器标签页里——不交给系统默认程序,因为那等于直接执行脚本(Windows 上 .js 关联 WScript.exe、.bat / .cmd / .ps1 / .sh 同理),会绕过运行控制台的首次确认;图片 / PDF / Office 标签不提供此项,工作区外的只读标签也没有可打开的文件 |
| 📄 文档预览 | PDF 直接预览;Word / PowerPoint / Excel(.doc/.docx/.ppt/.pptx/.xls/.xlsx)由 Harness Host 在本机转 PDF 后预览,缺字体时给出横幅提示 |
| 📊 Token 统计 | 设置页按标准周 / 自然月(当天、本周、上周、本月、上月、全部)或自定义起止日期统计所有会话日志的 token 用量,可查看总计或按模型明细(输入、缓存读取、输出;缓存写入既不显示也不计价),默认包含已归档会话;面板是左右两栏,两栏是同一种带外框的卡片(左:「模型明细」——「模型筛选」自成一块带边框的输入框,按名称片段过滤、不区分大小写、多个关键词用空格 / 逗号分隔,每行的勾选框就贴在模型名前面(不再单独占一列,那列有三分之二是空档;顶部的「模型」表头与底部的「汇总」也因此顶到格子左边、前面都不留空白);右:「快速计算」——填入输入 / 缓存读取 / 输出单价(每百万 tokens,货币符号可改、每行可单独覆盖)后按当前显示与勾选的模型自动算出金额,没有折叠按钮);两栏标题行右侧都显示同一个「选中 x 个模型」,只算当前可见且被勾选的模型、随勾选框实时变化;两张表逐行对齐:右栏「模型」列与左栏同宽(行首的展开图标占位与左栏复选框一致),数据行同高;两栏各自滚动,中间的间隔条可拖动(或 ←/→ 键)改栏宽、双击恢复默认比例,位置会记住(下次打开还是上次的宽度);面板顶部一行概览卡(调用次数 / 输入 / 缓存读取 / 输出 / 合计 / 金额)——最后的金额卡就是「快速计算」的总价预览,改单价或勾选会立刻跟着变 |
| 🔄 插件更新 | 设置页从 GitHub(yishengjun8/dsh-workspace-studio)main 分支检查新版本,一键下载并替换本端 profile 中的安装文件;生效方式按端提示(Web 端重启进程并刷新页面,桌面端退出并重新打开 App;本地 file: 安装只替换 profile 副本) |
⚡ /init 命令 | 工作区初始化任务入口,弹层固定四行:生成 AGENTS.md(已有该文件时变为「更新 AGENTS.md」,保留现有内容合并更新)、整理项目逻辑(只读分析工作区后写入 docs/interface-audit.md,含「接口 ↔ 实现对照 / 冗余清单 / 架构审查」三节,不改动业务代码)、清理失效内容(删除过时文档、悬空引用、无用注释与设计残留,只做减法;选中后先过一次风险确认才执行,工作区不在版本控制下只出清单)、取消;三个任务都由当前 Agent 执行 |
| 📱 手机模式 | 侧栏底部开关切换为居中的手机竖屏列:侧栏变为左上角鲸鱼开合的悬浮抽屉,会话头部出现「文件内容浏览」按钮可铺满手机列;瞬态状态,刷新后回到桌面布局 |
| 🗂️ 工作区合集 | 侧栏「会话列表」的区块标题变成合集下拉:把工作区按用途编成具名合集(一个工作区可以同时属于多个合集),切换合集后下方只列出该合集持有的工作区;下拉里可新建 / 重命名(就地输入)/ 删除 / 拖拽排序(或 Alt+↑/Alt+↓)、对某个合集「管理成员…」勾选工作区,也可在工作区分组行上右键「加入合集 ▸ / 从当前合集移除」。内置「全部工作区」(可随时点它切回总览;不可改名 / 删除 / 拖拽)作为总览与兜底,紧跟其下还有第二个内置视图「未归属工作区」——只列没有归入任何合集的工作区(是筛选项,不是合集:同样不可改名 / 删除 / 拖拽,也不落盘),用来一眼找出还没分类的工作区;切换合集会自动打开该合集最近更新的会话,侧栏底部回一句提示(再点一次正在显示的那个合集不会跳转,只回一句「当前已在合集」,正在写的会话不会被挪走)。列表里每个工作区分组行右侧有一枚常驻的合集图标(与下拉同一枚 ▤):点击它就等于右键该工作区,菜单里勾选即可自由加入 / 移出任意合集(不在任何合集里时图标半透明,鼠标悬停给出名单或「不属于任何合集 · 点击选择要加入的合集」);+N 胶囊表示在工作区行尾还提示它属于几个别的合集(悬停给名单),正在查看的会话若属于合集外的工作区,那个分组会临时以虚线 + 「不在当前合集」出现(离开即消失);「按工作区树 / 单列表」两种分组方式下合集下拉与过滤全部停用。合集清单存在 Host 侧 ~/.dsh-plugin/dsh-workspace-studio/collections/,因此 Web 端与桌面端共用一份;自建合集上限 50 个 |
| 🌐 中英双语 | 界面语言跟随 Harness「设置 → 通用设置 → 语言」(中文 / English)即时切换,无需重启或刷新 |
| 🔒 安全边界 | 工作区受限读写、路径包含校验、修订版本冲突保护、拒绝符号链接与 Windows 保留名称,详见下文「安全边界」 |
设置页是一叠卡片:顶部吸附条有卡片锚点(维护 / 浏览 / 配色 / 版本控制 / 导图 / 对话 / 解释器)与搜索框(按行文本实时过滤,只留下命中的行与卡片,右侧显示「匹配 N 项」);每张卡片右上角的**「说明」折叠块**装着原来散在各处的大段解释(默认折叠,点开才看),每行「恢复默认 / 重置」统一为行尾的 ↺ 图标(改过的行常显,未改过的行悬停才出现)。
package.json(本地读取、不发网络请求),Host 报不出时(旧版 Host 没有该接口,或离线)退回运行中客户端自带的版本,所以未检查、离线、检查失败时都在;只有点「检查更新」才联网,更新下载完成但还没重启时徽标换成新版本并高亮、状态提示重启生效;Host 用 enableUpdateCheck: false 关闭检查时该行仍保留(只把按钮换成说明)。Token 统计见「其余能力」:索引缓存在 Host 侧持久化,并在每次 dsh 启动后后台预热,首次打开面板即可秒出;后台扫描未完成时先显示部分结果并每 1.5 秒自动刷新(页脚显示「已完成 N / M 个会话」)。.git / .svn 目录(默认隐藏,仅影响显示)、是否自动刷新(默认开,每 20 秒一次,且只在「文件浏览」页可见时),以及状态徽标逐项配色(已修改 / 已新增 / 未跟踪 / 已删除 / 已重命名 / 冲突 / 已忽略,可单项或全部恢复默认)。编辑器的差异显示也归在这一张卡(与文件树徽标共用同一份仓库基线):差异色标(新增 / 修改 / 删除三个颜色,默认绿 #1a7f37 / 蓝 #1a63d8 / 红 #d92f24,可单项或全部恢复默认)、行底色开关(默认开启:在行背景上铺该行的增删改底色),以及滚动条变更刻度(总开关,默认开启;滚动条宽度 10 / 12 / 14 / 16 / 18px 默认 14、刻度铺满轨道(默认关=刻度两端各留 3px)、滑块满宽(默认关=滑块保持 8px 观感居中于加宽后的轨道);关闭总开关则滚动条回到默认 8px;这几项与上面的开关、配色一起随总开关和 Host enableVcsStatus 灰显)。内置 20+ 语言:JavaScript/JSX、TypeScript/TSX、JSON、HTML、CSS/SCSS/Less、Markdown/MDX、Python、SQL、XML/SVG、YAML、C/C++、C#、Java、Rust、PHP、Go、Shell、PowerShell、Ruby、TOML、INI 与 Dockerfile。
Makefile、.gitignore、LICENSE 与未知扩展名以纯文本显示,仍可浏览与编辑。
在 Git Bash、Linux 或 WSL 中执行。先进入本插件所在目录(用你自己的路径替换):
cd <插件目录>
bash ./install.sh # 默认安装到 web profile
bash ./install.sh web # 也可显式指定 profile
示例路径
C:/GreenSoftware/deepseek-harness/deepseek-harness-plugin/dsh-workspace-studio中的deepseek-harness-plugin是作者自定义的插件目录名,不是固定要求。install.sh以插件 目录为基准向上两级解析 Harness 根目录(供 PATH 无dsh时的pnpm --dir回退使用),因此 推荐把插件放在 Harness 根目录下两层的插件目录中(与示例一致);若 PATH 中已有dsh, 插件放在任何位置都可安装。
脚本按 DSH_BIN(若设置)→ PATH 中的 dsh → 当前 checkout 的 pnpm --dir <harness-root> dsh 依次选择可执行文件。安装完成后停止并重启原有 Web 进程(先停止再启动,让插件随 Web 进程重新加载生效),然后刷新 http://127.0.0.1:3080;脚本不会启动第二个服务器。
不依赖本地副本,直接从插件仓库安装。仓库随源码提交了构建产物(lib/client.js、lib/index.js
与 cordis.patch.yml),安装时不需要在用户机上构建,因此 pnpm ≥ 10 不会索要
allowBuilds 放行:
bash ./install.sh --git # 默认安装到 web profile
bash ./install.sh --git web # 也可显式指定 profile
脚本把 git 依赖 spec 解析为当前插件的 GitHub 仓库(可用 GIT_SPEC 环境变量覆盖),并锁定到当前 HEAD 提交(github:<owner>/<repo>#<commit>),因此后续推送不会悄悄改变已安装的代码。
Web / Desktop 的「插件」面板 → 「添加插件」,填入下列任一安装源(装完重启 DSH):
github:yishengjun8/dsh-workspace-studio # 跟随 main
github:yishengjun8/dsh-workspace-studio#<commit> # 锁定提交
https://github.com/yishengjun8/dsh-workspace-studio # 等价写法
💡 只有安装仍带安装期构建脚本的旧提交时,pnpm ≥ 10 才会拦下 git 依赖并要求放行:把 pnpm 打印的 allowBuilds 键复制进该 profile 的
pnpm-workspace.yaml后重试(install.sh --git会自动完成这一步)。 当前版本已不含prepare脚本,无需放行。
桌面端与 Web 端共用同一套 profile 机制和同一份 Web 前端(桌面端就是把 Web 应用放进 Electron 壳, Host 仍是完整 Web 组合),因此本插件没有单独的桌面端构建,也不需要为桌面端改代码。两者的区别只在 「装到哪个 profile」「页面从哪个源加载」和「谁来重启」:
| 维度 | Web 端 | 桌面端 |
|---|---|---|
| profile | $DSH_HOME/profiles/web | $DSH_HOME/profiles/desktop(名称由桌面端独占) |
| 安装方式 | install.sh / 插件面板 | 只走桌面端「插件」页(或桌面端自带的 dsh 命令) |
| 生效方式 | 重启 Web 进程 + 刷新页面 | 重启 App(以插件页提示为准:提示「下次启动生效」就必须重启 App;刷新页面在桌面端无效,它加载的是打包内的前端) |
| 页面源 | http://127.0.0.1:3080 | dsh-app://app(Host 固定监听 127.0.0.1:19387) |
github:yishengjun8/dsh-workspace-studio、
锁定 commit 的写法、file: / 绝对本地路径都可以),装完重启 App。桌面 profile 与 Web profile 是
互相独立的两份安装副本:在一边「插件更新」只替换那一边的副本,另一边不受影响(两边的自更新都从
同一个 GitHub 仓库取包)。file: 安装提示「只替换了
profile 副本」,git 安装提示「lockfile 仍锁定安装时的提交」。pnpm-lock.yaml 仍锁定安装时解析
到的提交,本次更新只换了 node_modules/ 里的目录;之后再从插件页重装或重新解析依赖,pnpm 可能按
lockfile 把插件退回那个提交。要长期停在某个版本,以插件页安装的版本为准。另外,换装只接受位于本端
profile 的 node_modules/ 之下的安装副本:link: 安装(副本即链接目标)或内置安装不在 profile 内,
检查结果会标记为不可更新并在设置页直接说明,下载接口同样拒绝——不会把链接目标或应用自带目录当成安装
副本替换。install.sh 面向 Web profile。bash ./install.sh desktop 只在 PATH 上的 dsh 是桌面端自带的命令
时可用(桌面端「管理 dsh 命令…」→ 安装);registry 版 dsh 会拒绝保留 profile,脚本检测到后会直接
打印上面两条指引并退出,不会留下半成品。$DSH_HOME 配置与 ~/.dsh-plugin/dsh-workspace-studio/
(编辑器草稿、导图文档、更新缓存)是同一份。两端同时开着并编辑同一份导图文档时按最后写入者为准。window.open,而是让 Host 用系统默认程序打开那个文件
(Windows explorer.exe <路径>、macOS open <路径>、Linux xdg-open <路径>,WSL 先 wslpath -w 换路径),
所以两端行为一致、交给浏览器的也是文件的真实路径:桌面端此前只有 /raw 接口 URL,现在 HTML 打开的是
file:///…,相对样式 / 脚本 / 图片随即可用。桌面端窗口只把 http(s) 交给系统浏览器、其余 scheme 一律拒绝,
所以这是唯一能让浏览器拿到本地文件的路子(页面自己 window.open('file://…') 会被浏览器拦掉)。
为什么只对 HTML:把脚本文件交给系统默认程序等于直接执行它(实测 Windows 上 .js 关联
WScript.exe "%1" %*,.bat / .cmd / .ps1 / .sh 同理),一个菜单点击就会绕过运行控制台的首次确认;
其余文本文件交给系统默认程序也只是在记事本 / 编辑器里打开,不如本插件自己的文本标签页。所以它们与 Markdown
一样留在 window.open('/workspace-studio/api/raw…') 这条既有路径上。降级:打开的是系统默认程序,
无法指定「你现在正在用的那个浏览器」;Host 跑在远端(挂载部署)时文件在 Host 那台机器上打开,
与「在资源管理器中打开」同语义。应用 / 编辑 菜单、右上角
原生窗口按钮)画在页面之上,harness 原本由 ui-layout 在自己的根框架里预留这一行——而本插件用根布局
补丁禁用了 ui-layout,所以改由本插件的三栏框架预留同样的 40px 条带,并让条带继续负责拖动窗口、同时
把窗口 chrome 的让位量(--dsh-frame-*)补回给 harness 的浮层(设置弹窗、portalled 菜单因此仍从条带
下方开始)。Web 端没有这一行,不受影响。$DSH_HOME/profiles/desktop/cordis.yml 物化成完整条目树(实测一次禁用后该文件从 223 B 的空根变成 45 KB,同一秒 package.json 的 bundles 也去掉了该插件)。手改 package.json 的 dsh.profile.bundles 虽然也能启用,但会让这份物化结果与清单不一致,后续排查很费劲——统一走「插件」页。git / svn。插件在按名字探不到命令时会再按平台常见安装位置探一次(macOS:/usr/local/bin、/opt/homebrew/bin、/opt/local/bin、/usr/bin;Windows:%ProgramFiles%\Git\cmd、%ProgramFiles%\TortoiseSVN\bin、%ProgramFiles%\Subversion\bin),Windows 上用环境变量拼路径、不写死盘符。两者都探不到时,状态条显示「未检测到 git / svn 命令」(琥珀色,点击可重试),不会假装没有仓库;也可以在 Host 配置里用 gitExecutable / svnExecutable 指定绝对路径——一旦指定就只用它,不再回退。这与 Web 端是同一段代码(能力探测,不是桌面端分支)。.exe 都在运行 Host 的那台机器上执行(Web 端 = 跑 dsh web 的机器,桌面端 = 你本机),两端走同一份 src/host/run.js、同一组 /workspace-studio/api/run* 相对路径接口、同一份 run/policy.json 信任与解释器设置,因此「首次运行确认」「不再询问」「指定解释器路径」在两端共享;输出回看依赖 Host 侧缓冲,页面源变化不影响它。平台差异只在命令解析上(Windows 支持 .bat / .cmd / .exe / .com / .ps1 与 py -3;macOS / Linux 支持 .sh / .bash / .zsh / 带可执行位的文件,.exe 与 .bat 会直接显示「当前系统无法运行该文件」而不是报错),这与 Web 端是同一段能力探测代码,不是桌面端分支。~/.dsh-plugin/dsh-workspace-studio/collections/collections.json,与草稿、导图文档同一层),因此两端读到的是同一份、改一端另一端刷新即见;合集下拉本身是相对 URL 的插件接口 + 客户端 DOM 覆盖层,不涉及端口 / 窗口 chrome,「加入合集」也不弹系统对话框。唯一与环境相关的是分组方式判断:它读 Harness 自己持久化的视图状态(dsh.workspace.view.v5 的 groupBy,见维护者本地文档的开发笔记 §47),两端是同一份前端、同一个键;读不到时按 Harness 的默认值(按工作区)处理,功能照常可用。/workspace-studio/api/* 返回本插件的
响应,客户端侧在
dsh-app://app 源下写入了本插件的界面状态(localStorage)。桌面端内置的 dsh 版本由发行版固定:
若它与你在用的 Web 端版本不同,先按维护者本地文档里的 harness 耦合点清单复核一次即可——那是版本
升级的常规动作,与「桌面端」无关。bash ./uninstall.sh
卸载后同样需要重启 Web 进程;移除 bundle layer 后内置 ui-layout 自动恢复。
cordis.patch.yml 中插件 row 接受:
| 字段 | 默认值 | 说明 |
|---|---|---|
enableEditing | false | 是否启用 Host 写入接口;本 bundle 显式设为 true。 |
maxPreviewBytes | 1048576 | 单文件读取并返回的最大字节(1024–10485760)。 |
maxEditableBytes | 1048576 | 单文件可保存的最大 UTF-8 字节(1024–10485760)。 |
maxExternalUploadBytes | 8388608 | 拖入的非工作区文件上传上限;预览仍按 maxPreviewBytes 截断(1024–268435456)。 |
maxSiteBytes | 33554432 | HTML 预览站点路由单个子资源的最大字节(1024–268435456):截图 / 录像远大于文本预览,所以与 maxPreviewBytes 分开。 |
maxEntryNameBytes | 255 | 新建 / 重命名条目名称最大 UTF-8 字节(1–1024)。 |
maxMutationBodyBytes | 4096 | create / rename 请求最大 JSON 字节(128–65536)。 |
| `maxContextBytes |