dsh-personal-workbench
Đã xác minh@dely0/dsh-personal-workbench · v1.16.5 · MIT · Giao diện web
DSH 个人工作台:日历 + 层级任务 + AI 澄清/拆解/执行/复盘 + AI 智能排序/日报周报 + 桌面提醒
Cài đặt
dsh plugin add @dely0/dsh-personal-workbench Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Thẻ
Tác giả
Readme
dsh-personal-workbench
A personal workbench plugin for DeepSeek Harness (DSH) Web. Turn your DSH into a calendar + task list + AI assistant workbench.
English · 简体中文
中文
这是什么
dsh-personal-workbench 是一个 DSH 个人工作台插件:
- 📅 日历(周/月可切换)+ 任务列表(树状层级)
- ✨ 自然语言快速录入,AI 澄清后自动生成任务
- 🧠 每个任务可关联多个 AI 会话:澄清 / 咨询 / 拆解 / 执行 / 复盘
- 🎯 AI 会话前可勾选本机已安装的 Skill,提示词自动注入“加载这些技能”的指令
- ✅ 任务执行采用“AI 申请完成 → 用户验收”闭环
- 🗂️ 每个任务一个 AI 会话工作区(默认工作区 + 任务名文件夹)
- 📝 Markdown 任务描述、复盘记录、变更历史
- ⏰ 到期提醒(页内横幅)
- 🗄️ 归档区、任务恢复
数据完全存储在本地 ~/.dsh/workbench,不上传任何服务器。
截图
以下截图来自 v1.14.58 + DSH 0.1.5-rc.1(2026-09-13 实机拍摄)。 面板走官方槽位路径:侧栏入口由宿主渲染,面板从侧栏右侧铺开、不覆盖左侧导航。
| 今日(任务 + 今日容量) | 今日排序 | 任务列表 |
|---|---|---|
![]() |
![]() |
| 日历 | 知识库 | 点子 |
|---|---|---|
![]() |
![]() |
![]() |
| 快速录入 | 微信接入 |
|---|---|
![]() |
![]() |
功能清单
任务
- 任务字段:标题、Markdown 描述、类型、状态、优先级、截止时间、AI 策略、提醒、工作区
- 无限层级子任务;今日 / 日历 / 列表三种视图
- 任务页筛选/排序:关键词(标题/描述)+ 状态/优先级/类型下拉多选可组合筛选;支持截止时间/优先级/创建时间/标题升降序;筛选保留父子层级,归档列表共用
- 任务类型、状态、优先级全部由字典表驱动,可自行扩展(设置页“字典管理”已支持新增/编辑/停用类型、状态、优先级、点子类型,默认项受保护)
- 任务资料夹(1.15.1 起的新口径):任务没填工作区时,资料夹名用
<任务ID>-<标题片段>而不是标题 —— 改标题不再留下孤儿目录、同名任务不再挤同一目录、标题里的特殊字符也不再直接变成目录名。 判定只看 ID 前缀;用户手填的工作区永不改写(老口径的标题型路径仍能被识别为自动路径, 见docs/releases/v1.15.1.md第 1 节) - 已完成 / 已取消任务不可再次执行
AI
- 快速录入澄清:一句话 → 官方会话区进行需求澄清 → 生成待确认草稿。 可同时附带图片(PNG/JPEG/WebP/GIF,最多 10 张)与 PDF / DOCX(最多 4 份、单份 ≤ 5MB, 正文由服务端抽取后随提示词一起交给 AI);也能直接粘贴或拖入。 拖入不支持的文件、超过大小/份数上限时逐条给出中文原因,不会静默丢弃
- 模型选择器(快速录入内):为本次澄清会话选模型(含 reasoning effort)。 宿主目录里没有模型的"收不收图"信息,所以由工作台补一张能力对照表: 选中未声明 image 的模型还带了图,会在发送前给出可读中文拒绝 (否则宿主会把图片悄悄换成一行占位文字,AI 根本看不到图)
/workbench斜杠命令:在官方输入框打/就能看到 workbench(走宿主原生命令注册, 因此进原生/菜单);执行后当前会话直接进入澄清流程。 命令侧会先按<任务ID>-<标题片段>建好任务资料夹,并把同一个 id 写进提示词- AI 咨询:对任务提问、要建议(不执行)
- AI 拆解:生成子任务提案树,确认后落库
- AI 执行:任意节点(含父任务)且 AI 策略为“可执行”时均可执行;AI 完成后提交验收申请,用户验收后才算完成;父任务验收通过时未完成子任务会级联完成
- 验收「暂存」:验收弹窗除「验收通过 / 驳回」外新增「暂存(先验证)」——草稿仍是待确认状态,但不再自动弹窗打断你;你先去跑回归测试,之后从「待处理」弹窗的「已暂存」段点「继续验收」唤回。仅验收类草稿(完成验收申请 / 复盘草稿)支持暂存
- 驳回有痕、AI 可见:驳回或暂存都会写入任务事件与任务共享记忆;
workbench_request_completion支持feedback参数,返回里会告知「本次是第几次提交、上次被驳回/暂存于何时、原因」,AI 不必等你口头转述 - 草稿通知推送微信:AI 提交草稿(验收申请 / 复盘 / 日报周报 / 知识 / 点子提案)时可经微信推送,复用任务提醒同一条通道与策略(静默时段、小时/日上限、汇总、熔断、未装 dsh-im 静默降级);默认只开「验收申请」与「复盘草稿」,可在设置页按类型开关
- Skill 选择器(AI 会话前加载技能):发起 AI 执行/协助/拆解/复盘/排序/报告等会话前,提示词弹窗内可直接勾选本机已安装的 DSH Skill(支持按名称/描述搜索、多选、点击标签移除);选中项会以“请加载这些技能”的指令注入到提示词开头,技能正文由 AI 通过
skill工具按需加载。技能目录来自宿主skills注册表(GET /api/workbench/skills),宿主未安装该服务时选择器自动隐藏、行为与旧版完全一致 - 状态聚合:所有子任务完成后父任务自动完成(递归到根);直接完成父任务会级联完成后代
- 任务共享记忆:同一任务/子树下的多个 AI 会话共享上下文,父任务会话自动加载整棵子树记忆,避免跨会话失忆
- 存量修复:提供
pnpm repair/POST /api/workbench/maintenance/repair-parents幂等补齐历史父任务完成状态 - AI 智能排序(任意日期):今日/日历任一日期一键生成执行顺序提案,确认后应用(不修改任务字段)
- AI 日报/周报:基于任务事件与完成记录自动生成报告草稿,确认后保存并可回看、删除
- 系统级桌面提醒:任务到期时在浏览器已授权的情况下发送系统通知(页面可最小化)
- 重复任务:任务可设置每天/每周/每月重复,到期自动生成实例(模板归档即停止)
- 个人知识库 / 错题集:经验教训、决策、笔记、片段沉淀为可搜索知识条目,复盘一键沉淀,AI 可提交知识草稿
- 点子文件夹:点子按「文件夹」组织——AI 可自动关联成文件夹,也能手动新建空文件夹、改名、删除、合并(A 并入 B),并把点子归入/移出一个或多个文件夹(多对多);「未归类」区收散点子,文件夹可整体转成任务树
- 今日容量:今日页顶部把当天要做的事按
estimatedMinutes × 优先级摊成一条时间轴,并与你设置的「每天可投入时长」(默认 6.5 小时,点击数字即可改)对比,一眼看出今天塞不塞得下 - 会话标题栏入口:通过 DSH 官方槽位
conversation.session.header.actions在每个会话标题栏注册「工作台」按钮(切换开关,再点收起);DSH 侧栏入口同时保留 - 知识库增强(AI 总结本地文档 + 文件链接):知识库页面支持弹窗浏览选择本地文件,也可直接填写本地文档路径或
file://;后端读取文档内容并让 AI 总结为知识草稿;知识条目可保存file_link并一键调用系统默认程序打开/追溯本地文件 - 点子 / 点子王:灵感卡片快速记录;AI 自动找关联生成“点子王”;AI 头脑风暴后可确认转为任务
- AI 复盘:已完成任务一键复盘,结论确认后写回任务
- 同一任务只保留一个复盘会话;重复复盘进入同一会话
数据与安全
- SQLite(
~/.dsh/workbench/workbench.db)+ 每日 JSON 备份规划 - 所有工作台 API 均挂载在
/api/workbench/*且仅允许 loopback 访问 - 请求围栏只有一份实现(
src/api/http.ts:loopback 判定 + 响应 + 体积上限在流式读取途中拦截), 并有源码扫描测试证明"不存在第二处实现"(原先四份逐字相同的副本,改一处就会漏掉另外三处) - 所有工作台响应带
cache-control: no-store与x-content-type-options: nosniff(返回的是用户私有数据,不该被缓存;也不该让浏览器按内容猜 MIME) - 附件解析带解压炸弹护栏:解压前按声明值拦、解压时
maxOutputLength、解压后复核实际长度; base64 走 canonical 校验(宽松解码会静默丢弃非法字符) - 不读取、不上传 DSH 之外的任何数据
安装
前置条件
- DeepSeek Harness 0.1.5-rc.1 及以上 Web 版 (这是硬边界:低于它面板整块不启动,理由见「兼容性与已知限制」)
- Node.js
^22.19.0或>=24.0.0 - pnpm
>=11.7.0 <12 - 网络可访问 npm registry(或使用镜像)
⚠️ 装完必须重启
dsh web,刷新页面不够。 客户端 bundle 由dsh-client-modules在宿主启动时读进内存 Map (bundleResource()只查那张 Map),所以"装好了 → 刷新浏览器"拿到的是旧代码, 连 URL 上的rev都对不上。同理,升级/回退之后也都要重启。
从 npm 安装(推荐)
dsh plugin --profile web add @dely0/dsh-personal-workbench
或使用 npm 直接安装到项目:
npm install @dely0/dsh-personal-workbench
从 GitHub 安装
dsh plugin --profile web add git+https://github.com/Dely0/dsh-personal-workbench.git
或安装 Release tarball:
dsh plugin --profile web add file:/path/to/dsh-personal-workbench-<version>.tgz
安装后重启 dsh web,浏览器硬刷新(Ctrl+Shift+R)。
从源码开发
git clone https://github.com/Dely0/dsh-personal-workbench.git
cd dsh-personal-workbench
pnpm install
pnpm check # 类型检查 + 构建
pnpm test # 最小回归测试(使用构建产物)
以开发模式挂载:
pnpm build
dsh plugin --profile web add link:/path/to/dsh-personal-workbench
开发模式修改代码后需要重新
pnpm build并重启dsh web。
参与开发:先读这份 skill
本仓库自带一份给 AI 编码助手用的开发规范 skill:
.dsh/skills/dsh-plugin-change/。
它在 DSH 的项目级 skill 根下,clone 下来即自动被发现(优先级高于用户级 skill), 所以你和你的 AI 助手在改这个仓库时,会按同一套规矩走。内容包括:
- 架构硬约束:两半两入口、依赖方向(哪些模块不许 import React / 不许碰 DOM)、 允许写哪些 DOM 的白名单、文件规模红线、数据库写入契约, 以及一张"不许做 / 必须做 / 谁拦它"的速查表;
- 编码规范:单一权威源与派生、纯逻辑与组件解耦、政策要变成"会失败的测试"、 失败必须可观测、幂等与副作用时机、静默丢件的禁区、可选服务分两级、删除与重构的顺序;
- 交付流程:装盘/版本回退的门禁、"客户端改动必须重启宿主"、 验收判据为什么会变成假阴性、发布与回滚纪律;
- 事故档案:13 起真实事故的"现象 → 根因 → 下次怎么避免"。
这些不是风格偏好,每条都对应一次真实事故(整机 DSH 起不来、面板整块消失、发布后前端崩溃)。 如果你用别的 AI 编码工具,也可以直接把
SKILL.md及其references/喂给它 —— 内容与工具无关,讲的是这个代码库的规矩。
兼容性与已知限制
滚动维护的已知问题与待办清单见
docs/issues/2026-09-13-outstanding-issues.md。 本节只讲当前版本的依赖与支持边界。历史结论(DOM 降级腿、家族互斥)已随 v1.14.53 删除, 别照着旧文档配环境。
一句话依赖结论
| 项 | 要求 | 说明 |
|---|---|---|
| DSH | 0.1.5-rc.1 及以上(Web 版) |
低于此版本客户端面板整块不启动(刻意如此,见下) |
| Node | ^22.19.0 或 >=24.0.0 |
与 package.json 的 engines 一致 |
| pnpm | >=11.7.0 <12 |
仅开发/构建时需要 |
@deepseek-ai/cordis |
^4.0.1 |
peer 依赖 |
@deepseek-ai/dsh-host-webserver / dsh-system-prompt / dsh-tools |
^0.1.0-rc.6 |
peer 依赖(服务端半边) |
| DSH 提供的客户端槽位 | sidebar.panellist + main + shell.overlay |
三个都要有,缺一个就不启动 |
layout.selectPanel |
必须有 | 它是"面板能被选中"的唯一开关 |
@xmanrui/dsh-im |
可选 | 微信提醒通道;未装则降级为页内提醒 + 桌面通知 |
最低支持版本:DSH 0.1.5-rc.1。 这一条是硬边界,不是"建议"。
低于最低版本会怎样:明确不启动(不是降级)
inject 精确声明 5 项:sessions / workspaces / connection / slots / layout
(唯一实现见 src/client/capabilities.ts,test/capabilities.test.mjs 把它锁死)。
缺任何一项,cordis 会让插件 pending;万一进来了但槽位不全,apply() 会打一条
含"缺什么 + 要求什么版本"的中文日志后直接返回 —— 不注册任何东西、不写任何 DOM。
为什么不做兼容层:早先的实现是"探测不到官方槽位就换自建 DOM 腿",
而那条腿会铺一张 position:fixed; inset:0 的满屏层,一旦收不起来就永久盖住会话区
(用户原话:"除左栏外什么都点不了")。与其"半死不活地降级",不如明确不启动并说明原因。
服务端能力不受此限制:任务/日历/知识库/点子、提醒、日报周报与
workbench_*工具 只需要0.1.0-rc.6+。所以老宿主上你仍能用 AI 侧的工具与提醒,只是看不到面板界面。
支持的能力矩阵
| 能力 | 需要的 DSH 版本 | 拿不到时 |
|---|---|---|
服务端能力:任务/日历/知识库/点子、AI 会话关联、提醒、日报周报、workbench_* 工具 |
0.1.0-rc.6+ | — |
面板本体:sidebar.panellist + main + shell.overlay |
0.1.5-rc.1+ | 面板整块不启动(打可读日志) |
layout.selectPanel(面板选中状态由宿主单值状态管理) |
0.1.5-rc.1+ | 同上 |
会话标题栏入口(官方槽位 conversation.session.header.actions) |
0.1.5-rc.1+ | 无该按钮;侧栏面板行仍可用 |
官方 uiWorkspace.connectWorkspace(AI 会话切工作区) |
0.1.5-rc.1+ | 回落 workspaces.openPath |
| 微信提醒 | 可选插件 @xmanrui/dsh-im |
静默降级为页内提醒 + 桌面通知 |
| 技能选择器 | 宿主 skills 注册表 |
选择器自动隐藏 |
历史说明(仅供对照,已不适用):v1.14.0–v1.14.52 曾支持 DSH
0.1.1-rc.1, 走的是"往侧栏 DOM 注入入口行 + 自建覆盖层"的降级腿。那条腿连同社区 「sidebar-entry 家族约定」(data-dsh-<pkg>-entry/dsh-panel-activate/ 摘兄弟data-dsh-*-active)在 v1.14.53 整体删除。定稿设计见docs/design/2026-09-13-client-architecture-official-only.md。
唯一的入口与面板路径(v1.14.53 起)
- 侧栏面板行注册到官方槽位
sidebar.panellist(kind=list、scope=root)—— 行按钮、Tooltip、aria-label/aria-current、行高与折叠态圆形全部由宿主PanelRow渲染, 本插件只提供图标(WorkbenchPanelIcon)。 - 中央面板注册到官方键槽
main,但只放一个返回null的空占位 —— 它存在的唯一理由是让layout.selectPanel(id)的校验通过。 - 真内容注册到
shell.overlay(框架级浮层,始终挂载)。 为什么不放main:main是键槽,activePanelId一变宿主就卸载整棵子树, 而我们这棵树里装着跨页面常驻的草稿弹框 —— 关面板会连弹框一起消失 (用户实测"只能回到工作台页面才看得到弹框")。 - 面板显隐只有一个答案:
decidePanel()(src/client/panelState.ts,纯函数 + 表驱动单测)。 宿主状态可读时只信activePanelId,不可读时才退回本地意图。data-open属性由同一个函数派生(panelDataOpen()),所以"决策"与"投影"不可能打架。
没有第二条路径。 本插件不往宿主侧栏注入任何 DOM(test/clientInvariants.test.mjs 的 I6 钉住)。
判定"面板该不该显示"的只有一处实现(decidePanel());没有"走哪条路径"的选择逻辑了 ——
officialSlotDecision() / officialPathConfirmed() 随降级腿一起删除。能力不满足就明确不启动。
硬规则:可选服务一律软探测
任何 DSH 服务,只要不是所有受支持版本都有,就必须 ctx.get('x') 软探测,绝不放进
inject、也绝不直接 ctx.x。 cordis 的 inject 语义是"缺一个就整个插件 pending",
把它当成"可选依赖"用会让插件在旧宿主上整体加载失败(前端表现为 Failed to load plugins)。
这条规则来自三次真实事故:v1.10.1 的 uiWorkspace、v1.13.0 的 runtime.slots、
v1.13.3 的再次根治;v1.13.1 的标题栏入口则是因为直接读 ctx.slots 而崩。
边界要分清:slots / layout / commands 是前置条件,
所以它们进 inject —— 拿不到就整块不启动(明说原因),而不是偷偷降级;
uiWorkspace / dshIm / skills / modelDirectories / llm 是可选增强,一律软探测、缺了只是少一个能力。
⚠️ 一个容易搞反的点:
ctx.get('x')的确不需要把x写进inject(cordis 的get文档原话是 "without the inject requirement";会抛cannot get property "x" without inject的是代理属性访问那条路)。 但服务端与客户端同一个get语义下,只有当提供方 fiber 处于活动态时才拿得到 —— 所以"要不要进 inject"仍应按上面这两级来分:缺了功能就不成立的进, 只是锦上添花的软探测(modelDirectories就是后者:写进inject会让没装dsh-client-ui-model-selection的机器上整个面板 pending,丢整块换一个下拉框)。
其它
- 入口只有一个:宿主渲染的侧栏面板行(
sidebar.panellist)。会话标题栏按钮同样走官方槽位conversation.session.header.actions。 - 面板互斥由 DSH 宿主的
activePanelId保证(layout.selectPanel是单值状态)。 若同时使用不使用官方槽位、而以 DOM 接管中栏的插件(如dsh-client-ui-task-board/dsh-ssh/dsh-mnemon),可能出现两个面板同时激活 —— 这是宿主缺少统一面板机制导致的已知限制,不是本插件的缺陷:那些插件没向宿主注册面板, 宿主的activePanelId无从知晓它们存在。因此本插件不做跨插件 DOM 协调: 不读、不写任何兄弟插件的data-dsh-*属性,也不广播/监听dsh-panel-activate。 本插件只写两个自带属性(且幂等):<html data-dsh-personal-workbench-active>与<html style="--wb-sidebar-w: Npx">;test/clientInvariants.test.mjs的 I4/I5 把这两条钉住。 - 微信提醒依赖
@xmanrui/dsh-im:软探测(ctx.get('dshIm')),未安装或未配置投递目标时静默降级为页内提醒 + 桌面通知,不影响其它功能。 - 技能目录依赖宿主
skills注册表:未安装时 Skill 选择器自动隐藏。 - 仅支持单用户本地使用;无云同步、无多用户权限体系。
- AI 能力依赖你在 DSH 中已配置的模型与凭证;执行/咨询等会真实消耗 token。
遗留问题与已知限制
已知问题、待办与"已确认不是问题"的清单集中在
docs/issues/2026-09-13-outstanding-issues.md(滚动更新)。
下面只列与本版本最相关的两条:
.pwtest/里有一批脚本是"架构变更前"写的(约 80 个长期迭代产物)。 家族互斥与 DOM 降级腿已在 v1.14.53 删除,verify-mutex-family.mjs/verify-board-takeover.mjs/verify-board-overlap.mjs/verify-stable.mjs仍断言那些已删除的行为,跑起来会失败但那是假失败,别当成回归。verify-acceptance.mjs里示范了正确做法(反转判据 + 写清原因)。- 客户端改动必须重启
dsh web才生效 —— 不是"刷新页面即可"。dsh-client-modules的bundleResource()只从宿主启动时建好的内存 Map 取 bundle。 本地迭代走node scripts/dev-install.mjs --apply(构建 → 打包到带构建戳的新路径 → 装盘 → 三道门禁),不要再改package.json的 version(版本号只在发布时增长); 装完重启dsh web并硬刷新浏览器。 ⚠️ 装盘产物是否真的刷新,只信node scripts/check-installed-fingerprint.mjs(逐文件 SHA256): 实测同一file:路径下 pnpm 会复用已解包的文件(锁文件 integrity 变了、lib/还是旧的), 所以每次装盘都要落到一个没装过的新路径。
版本历史
详细发行说明(含依赖/支持边界、验收证据、踩坑记录):
docs/releases/v1.15.1.md; 更早的见docs/releases/。
| 版本 | 要点 |
|---|---|
| 1.15.1 | 任务资料夹改用 <任务ID>-<标题片段>(旧口径按标题:改标题成孤儿、同名挤一个目录、特殊字符变目录名),澄清阶段先预留任务 ID 并复用它落库;不再为每个任务注册 AI 工作区(会话用当前工作区 + 提示词声明资料夹,避免宿主工作区列表被任务撑爆);老路径兼容判据必须带"位于默认根目录之下"这条旁证(否则手填目录会被当成自动路径改写,且本机 3 条标题型老路径会永远不再迁移)。新增:快速录入图片(走宿主原生多模态)与 PDF/DOCX 附件(不收的文件逐条给原因)、模型选择器(未声明 image 的模型在发送前给可读拒绝,而不是让宿主静默把图换成占位文字)、/workbench 斜杠命令(进原生 / 菜单,执行后当前会话进入澄清流程)。修:任务没填路径时会话挂到无关工作区(原 ws.items[0],最坏会把文件建进别的任务目录)、PDF 文本抽取的 O(n²) 灾难性回溯(3 KB 恶意 pdf 可让整个 dsh web 无响应,由独立审查发现)、解压超限回 zlib 英文原文、预分配任务 id 不校验(非法 id 落库 / 重复 id 抛英文 SQL)、/workbench 侧未做 WSL 路径归一化。四份重复的请求围栏合并成一份并加 no-store / nosniff。用例 168 → 240。 |
| 1.15.0 | 让 dsh-market 能装上、能统计(补 repository 字段,市场靠它把 npm 包映射回仓库);本地迭代不再消耗公开版本号(身份交给带构建戳的包路径,新增 scripts/dev-install.mjs);修 CI 长期红(两条测试依赖开发机环境)与 check-installed-version.mjs 的 file: 形态空转 |
| 1.14.57 | 架构重构三阶段完成,只支持 DSH 新版(最低 0.1.5-rc.1):① 抽出 panelState.ts —— 面板可见性的唯一权威源(原先把同一语义写了 5 遍、读的输入还不同,bug 2/6/9 都出在这里),决策表 5 行穷举并有表驱动单测 + 源码级断言"不许再内联判定";② 删除 DOM 降级腿与家族互斥(不再往宿主侧栏注入入口行、不再自建覆盖层容器、不再读写兄弟插件的 data-dsh-*、不再广播 dsh-panel-activate)——entryContract.ts 652→145 行、index.tsx 4109→3795 行,新增 I4/I5/I6 源码扫描测试;③ 新增 capabilities.ts 能力门槛(inject 精确 5 项、缺能力时明确不启动并打可读日志,不再"半死不活地降级"),README 写清最低版本与冲突政策。另修:点「回到会话」后弹框要等 5 秒轮询才消失(改为同一帧收掉)。出口判据:verify-acceptance 17/17、verify-final-2 9/9、verify-sidebar-collapse 6/6、verify-duplicate-task 11/11 |
| 1.14.51 | 修复「快速录入 → AI 执行 → 验收后,待处理里多出一条同名重复任务」:根因是 withDraftConfirm() 不校验草稿状态也不记录产出(同一条 task 草稿确认两次就建出两条任务),且 confirmTaskDraft() 没有同父同名幂等。现在确认会把产出回写草稿并支持回放(同一条草稿绝不会产出两个任务);跨草稿同名只告警不静默合并(新增「库里已经有一条同名任务」选择框:保留两条 / 就用已有那条并归档多建的);workbench_submit_task 在当前会话就是该任务关联会话时直说"几乎肯定是重复录入" |
| 1.14.10 | 修复在官方 main 槽位里自建独立 React root 引发的连串问题(弹框反复重挂 → 背景一顿一顿变黑、按钮要点两次、inactive context 报错、同一构建下部分 App 窗口整片黑):官方槽位里改为直接返回 WorkbenchApp、生命周期交给宿主 reconciler(与宿主自带弹框一致);面板容器改 position:absolute; inset:0,不再依赖宿主高度链;新增可见性自查(激活时容器持续 0 尺寸就自动切覆盖层)。顺带移除上一版引入的"自愈复核"(它会在注册其实成功时撤销注册,导致侧栏出现两行入口)与 generator 形式的 slots.inject(本宿主的 cordis 不支持,注册不生效) |
| 1.14.1 | 修复 1.14.0 本机验收发现的 4 个问题:① 点「工作台」导致会话区整片空白且回不去(entriesOfSlot 脱绑调用被误判成"宿主不支持" + selectPanel 抛错时 open 已被置真)—— 改为自愈判定:注册表与 DOM 两侧都有证据才走官方槽位,4 秒复核窗口内不成立就撤销注册并回退 DOM 腿,且入口与覆盖层始终就绪,绝不留空白;② 草稿弹框背景变黑/闪烁、点「暂存」要连点 5-8 次(WorkbenchApp 被挂了两份互相打架)—— 两种容器严格二选一;③ 快速录入提示文字被输入框遮挡(.wb-hint 只有设置页作用域样式);④ 顶层 type_code 非法值被静默改写成 personal 而非拒绝(与工具描述、子任务校验口径不一致)—— 改为封闭枚举严格校验 + 回执回显最终落库字段 |
| 1.14.0 | 侧栏入口与中央面板改用 DSH 官方槽位(sidebar.panellist + main,互斥交给宿主 activePanelId);任务支持改父任务(含防环校验 + 变更留痕 + 表单选择项 + AI 工具,取代直接改库);快速录入/澄清支持指定工作区(默认值与旧隐式行为逐字一致,路径不可用会明确报错而非静默换目录);所有草稿类型都可暂存(白名单改为默认全开)且草稿弹框信息量补齐(任务草稿展示描述/截止/预估/工作区/AI 策略/子任务 + 回到会话);子任务 code 非法不再静默丢弃(回传 problems 并在界面标黄,工具描述带封闭枚举);数据库 schema 过新时降级空转而不是拖死 DSH 启动 |
| 1.13.4 | 修复:uiWorkspace 不再作为硬依赖(旧宿主上不再 Failed to load plugins);数据库 schema 过新时降级而不是拒绝启动 |
| 1.13.1 | 修复会话标题栏入口导致前端加载失败(cordis 服务读取必须用 ctx.get);新增点子「文件夹」(手动建/改名/删除/合并、多对多归入与移出、整体转任务树);新增「今日容量」条与每天可投入时长设置;UI 视觉层统一(边框/阴影/字号/间距,浅色下保持模块可辨识);用户入口改用官方槽位 |
| 1.12.1 | 微信草稿通知正文精简(任务标题 + 摘要首行 + 一行操作);修复 reminder 测试在 Windows 下未关库导致临时目录删除失败 |
| 1.12.0 | 验收「暂存」(草稿保持待确认但不再自动弹窗,可唤回);驳回/暂存留痕并回传提交历史给 AI;草稿通知接入微信(默认只开验收与复盘) |
| 1.11.0 | Skill 选择器:AI 会话前可勾选本机已安装 Skill,注入「加载这些技能」指令(不内联正文) |
| 1.10.x | 微信任务提醒:通道适配、分级/静默/节流/熔断、补发队列、策略配置界面 |
| 1.9.0 | 工作台 UI 优化 P0-P2(大屏分栏、详情摘要卡与吸顶操作条、变更历史时间线、空状态 CTA) |
路线图
- V1:任务 / 日历 / 快速录入澄清 / 子任务 / 会话关联
- V1.5:AI 执行 + 用户验收 / 复盘 / 归档 / 变更历史 / 任务工作区
- V2 每日 AI 智能排序(0.6.0)
- V2:系统级桌面提醒(0.8.0)
- V2 日报/周报(0.7.0)
- V2:重复任务(0.12.0)
- V2:个人知识库 / 错题集(1.0.0)
- V2:知识库增强(AI 总结本地文档 + 文件链接)(1.2.0)
- V2:今日计划面板长列表优化(sticky 统计卡 / 固定高度内部滚动 / 展开收起 / 面板内完成·推迟)(1.4.0)
- V2:AI 会话前自定义提示词输入(除快速录入外,默认提示词 + 用户输入追加)(1.5.0)
- V2:今日/日历计划面板手动编辑(上下移、改备注、从今日任务增删计划项;保留 AI 生成 + 确认 + 完成/推迟)(1.5.0)
- V2:UI 美化(卡片/列表/表单/点子关联展示统一)
- V2:任务类型自定义 UI(设置页字典管理:类型/状态/优先级/点子类型)
- V2:任务到期提醒接入微信(1.10.x)
- V2:Skill 选择器(1.11.0)
- V2:验收暂存 / 驳回反馈闭环 / 草稿通知(1.12.0)
- V2:UI 视觉层重构 + 点子文件夹 + 官方槽位入口(1.13.x)
- V2:提醒状态语义修复(窗口/终态分离 + 重新武装)(1.13.2)
- V2:侧栏入口迁移到官方槽位 + 改父任务 + 草稿暂存推广(1.14.0)
- V2:任务资料夹改口径(
<任务ID>-<标题片段>)+ 快录附件(图片 / PDF / DOCX)+ 模型选择器 +/workbench命令(1.15.1) - 待规划:客户端
WorkbenchApp拆分(施工图见docs/design/2026-09-09-client-split-backlog.md) - V2:定时自动化
- 未来:多端同步、任务拖拽排序、数据导入导出
免责声明
本插件为社区项目,与 DeepSeek 官方无关,不提供任何担保。安装即表示你信任该代码会以你的 DSH 用户权限在本机运行。执行类 AI 操作可能修改工作区文件、消耗 API 额度,请先阅读代码并谨慎使用。
License
本项目代码使用 MIT License。
部分 DOM 挂载模式和客户端构建包装参考了以下开源项目,详见 THIRD_PARTY_NOTICES.md:
dsh-task-board(dsh-web-ui,BSD-3-Clause)dsh-genui(MIT)
English
What is this
dsh-personal-workbench is a personal workbench plugin for DeepSeek Harness Web:
calendar + hierarchical task list, natural-language task intake with AI clarification
(text plus image / PDF / DOCX attachments, an optional model picker, and a native
/workbench slash command), multiple AI sessions per task (clarify / consult / break
down / execute / review), execution with user acceptance, AI prioritization for any date,
daily/weekly reports, desktop notifications, per-task task folders, reminders, archives,
and Markdown reviews.
Task folders are named <task-id>-<title-snippet> (the ID is the stable part), so renaming a
task never orphans its folder and two tasks with the same title never share one. Folders you
type by hand are never rewritten.
All task data is stored locally under ~/.dsh/workbench.
Install
# From npm (recommended)
dsh plugin --profile web add @dely0/dsh-personal-workbench
# From source or release tarball
dsh plugin --profile web add git+https://github.com/Dely0/dsh-personal-workbench.git
dsh plugin --profile web add file:/path/to/dsh-personal-workbench-<version>.tgz
Then restart dsh web and hard-refresh the browser.
Compatibility
Minimum: DeepSeek Harness 0.1.5-rc.1 (Web). This is a hard boundary, not a suggestion.
| Requirement | Version | Notes |
|---|---|---|
| DSH (Web) | 0.1.5-rc.1+ |
Below this, the panel does not start at all (see below) |
| Client slots provided by DSH | sidebar.panellist + main + shell.overlay |
All three are required |
layout.selectPanel |
required | The only switch that can select our panel |
| Node.js | ^22.19.0 || >=24.0.0 |
matches engines |
| pnpm | >=11.7.0 <12 |
dev/build only |
@deepseek-ai/cordis |
^4.0.1 |
peer |
@deepseek-ai/dsh-host-webserver, dsh-system-prompt, dsh-tools |
^0.1.0-rc.6 |
peer (server half) |
@xmanrui/dsh-im |
optional | WeChat reminder channel; falls back to in-page + desktop notifications |
On older hosts the panel refuses to start (it does not degrade)
inject declares exactly five services — sessions, workspaces, connection, slots, layout
(see src/client/capabilities.ts; test/capabilities.test.mjs locks the list). Missing any of them
makes cordis keep the plugin pending. If it does load but a slot is missing, apply() logs a
readable reason (what is missing + which version is required) and returns immediately —
registering nothing and writing no DOM.
Why there is no compatibility layer: the old implementation fell back to a self-built DOM leg, which
laid down a full-screen position:fixed; inset:0 layer. When it failed to collapse it covered the
conversation area permanently (user quote: "nothing outside the left column is clickable").
Refusing to start with a clear log is strictly better than half-working degradation.
Server-side features are not gated by this: tasks/calendar/knowledge/ideas, reminders, reports and the
workbench_*agent tools only need0.1.0-rc.6+. On an older host you can still use them through the agent — you just get no panel UI.
Panel arbitration & sibling plugins: an explicit "not our problem" policy
- Official slots only:
sidebar.panellistfor the sidebar row,mainfor a null placeholder (solayout.selectPanelvalidation passes),shell.overlayfor the real content — it is always mounted, so the draft dialog survives closing the panel. - Whether the panel is visible is answered in exactly one place:
decidePanel()(src/client/panelState.ts, a pure function with table-driven tests). - No cross-plugin DOM coordination. Panel arbitration is owned by the host's single-value
activePanelId. Plugins that do not use official slots and instead take over the center column via DOM (e.g.dsh-client-ui-task-board,dsh-ssh,dsh-mnemon) may end up active at the same time. That is a known limitation caused by the host lacking a unified panel registry, not a defect of this plugin. Accordingly we never read or write another plugin'sdata-dsh-*attributes and never dispatchdsh-panel-activate. We only write two attributes of our own:<html data-dsh-personal-workbench-active>and<html style="--wb-sidebar-w: Npx">(enforced bytest/clientInvariants.test.mjs, I4/I5/I6).
Soft-probing (this does not contradict the above)
Any DSH service that is not present in every supported version must be soft-probed with
ctx.get(name) and never listed in inject. The distinction:
slots/layoutare preconditions of the panel feature → they go intoinject, and a missing one means the panel block does not start (with a readable log);uiWorkspace/dshIm/skillsare optional enhancements → soft-probed; missing one only removes a feature.
Does not depend on dsh-web-ui.
Roadmap
- V2: AI prioritization for any date, OS-level notifications, daily/weekly reports
- V2: recurring tasks, personal knowledge base / lessons, ideas & idea clusters
- V2: Today plan panel long-list optimization (sticky stats / fixed-height inner scroll / expand-collapse / inline complete & defer) (1.4.0)
- V2: Custom prompt input before AI sessions (except quick intake; append user input after the default prompt) (1.5.0)
- V2: Manual editing for today/calendar plan panel (reorder, edit notes, add/remove plan items; keep AI generate + confirm + complete/defer) (1.5.0)
- V2: Official sidebar slots, task re-parenting, defer for every draft kind (1.14.0)
- Official-slots-only architecture: single source of truth for panel visibility, DOM fallback leg removed, capability gate (1.14.57)
- Future: scheduled automation, multi-device sync, drag-and-drop, import/export
License
MIT. See LICENSE and THIRD_PARTY_NOTICES.md.






