← 返回列表
⚠ 装前注意
DSH 个人工作台:日历 + 任务列表 + AI 澄清/拆解/执行/复盘 | Personal workbench…
基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/9/18 · 已提供中文文档
DSH 个人工作台:日历 + 任务列表 + AI 澄清/拆解/执行/复盘 | Personal workbench for DeepSeek Harness Web: calendar + task list + AI assistant
综合分
48.2
GitHub 分
48.2
用户评分
—
★ Stars
28
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add Dely0/dsh-personal-workbench未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包@dely0/dsh-personal-workbench(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
未发布到 npm registry,仅可从源码安装
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/17 21:22:14
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis-plugin-timer@deepseek-ai/dsh-llm@deepseek-ai/cordis@deepseek-ai/dsh-commands@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-personal-workbench
npm version
一个面向 DeepSeek Harness(DSH)Web 的个人工作台插件。
把你的 DSH 变成 日历 + 任务列表 + AI 助手工作台。
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 前缀;用户手填的工作区永不改写(老口径的标题型路径仍能被识别为自动路径,
见 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 写进提示词
- 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 日报/周报:基于任务事件与完成记录自动生成报告草稿,确认后保存并可回看、删除
- 系统级桌面提醒:任务到期时在浏览器已授权的情况下发送系统通知(页面可最小化)
- 重复任务:任务可设置每天/每周/每月重复,到期自动生成实例(模板归档即停止)
- 个人知识库 / 错题集:经验教训、决策、笔记、片段沉淀为可搜索知识条目(分类 Tab + 关键词搜索(标题/正文/标签)
+ 标签筛选 + 排序 + 分页,并按时间自适应分组),复盘一键沉淀,AI 可提交知识草稿
- 知识库会被会话 AI 自动用起来(1.15.2):按「任务标题+描述」在会话开始、按你的提问在每回合收尾各检索一次,
命中条目在下一回合以「【工作台知识库】…」出现在会话里(看得见命中了哪几条,也能看出它没被引用);
四个时机(开工前 / 报错时 / 写码前 / 验收前)AI 还会主动再查一次。可关闭:设置页有全局开关、
单会话可 turn_off;另有「召回日志」面板逐条记录检索了什么关键词、命中哪几条、是否被引用。
打分口径刻意做了两档闸门:过阈门的给完整块,没过的只给一行提示(明说"未达注入闸门、仅供参考"),
完全不相关的什么都不插 —— 宁可少给,也不拿噪声把提示词灌满
- 点子文件夹:点子按「文件夹」组织——AI 可自动关联成文件夹,也能手动新建空文件夹、改名、删除、合并(A 并入 B),并把点子归入/移出一个或多个文件夹(多对多);「未归类」区收散点子,文件夹可整体转成任务树
- 今日容量:今日页顶部把当天要做的事按预计耗时 × 优先级摊成一条时间轴,并与你设置的「每天可投入时长」(默认 6.5 小时,点击数字即可改)对比,一眼看出今天塞不塞得下。
(1.15.2)算法不再是个黑盒:点「⌄ 规则」展开就能看到七条口径(算哪些任务、截止时间如何沿任务树继承、
今天到期 / 无截止在推进怎么算、逾期默认不计入、没填耗时按默认多少算、全天任务为什么不改变计算)和一本
逐条账本(每条任务的分钟数 + 出处标记,表尾合计 = 已排);逾期任务单独成区并可一键计入(开关默认关)。
每条任务可自定义「预计耗时(1–1440 分钟)」,改完不刷新就能看到「已排」变化;没填的按可配置的默认耗时
(缺省 30 分钟,在设置里改)计入,账本里逐条标「按默认 N」。全天任务只影响显示与重复锚点,不改变容量计算。
- 会话标题栏入口:通过 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 ⚠️ 装完必须重启 dsh web,刷新页面不够。
客户端 bundle 由 dsh-client-modules 在宿主启动时读进内存 Map
(bundleResource() 只查那张 Map),所以"装好了 → 刷新浏览器"拿到的是旧代码,
连 URL 上的 rev 都对不上。同理,升级/回退之后也都要重启。
从 npm 安装(推荐)
dsh plugin --profile web add @dely0/dsh-personal-workbench
或使用 npm 直接安装到项目:
markdown
npm install @dely0/dsh-personal-workbench
从 GitHub 安装
sh
dsh plugin --profile web add git+https://github.com/Dely0/dsh-personal-workbench.git
或安装 Release tarball:
sh
dsh plugin --profile web add file:/path/to/dsh-personal-workbench-.tgz
安装后重启 dsh web,浏览器硬刷新(Ctrl+Shift+R)。
从源码开发
sh
git clone https://github.com/Dely0/dsh-personal-workbench.git
cd dsh-personal-workbench
pnpm install
pnpm check # 类型检查 + 构建
pnpm test # 最小回归测试(使用构建产物)
以开发模式挂载:
sh
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 服务端能力不受此限制:任务/日历/知识库/点子、提醒、日报周报与 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--entry / dsh-panel-activate / 摘兄弟
data-dsh--active)在 v1.14.53 整体删除。定稿设计见
docs/design/2026-09-13-client-architecture-official-only.md。
唯一的入口与面板路径(v1.14.53 起)
1. 侧栏面板行注册到官方槽位 sidebar.panellist(kind=list、scope=root)——
行按钮、Tooltip、aria-label/aria-current、行高与折叠态圆形全部由宿主 PanelRow 渲染,
本插件只提供图标(WorkbenchPanelIcon)。
2. 中央面板注册到官方键槽 main,但只放一个返回 null 的空占位 ——
它存在的唯一理由是让 layout.selectPanel(id) 的校验通过。
3. 真内容注册到 shell.overlay(框架级浮层,始终挂载)。
为什么不放 main:main 是键槽,activePanelId 一变宿主就卸载整棵子树,
而我们这棵树里装着跨页面常驻的草稿弹框 —— 关面板会连弹框一起消失
(用户实测“只能回到工作台页面才看得到弹框”)。
4. 面板显隐只有一个答案: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。
本插件只写两个自带属性(且幂等): 与
;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(滚动更新)。
下面只列与本版本最相关的两条:
1. .pwtest/ 里有一批脚本是"架构变更前"写的(约 80 个长期迭代产物)。
家族互斥与 DOM 降级腿已在 v1.14.53 删除,verify-mutex-family.mjs /
verify-board-takeover.mjs / verify-board-overlap.mjs / verify-stable.mjs
仍断言那些已删除的行为,跑起来会失败但那是假失败,别当成回归。
verify-acceptance.mjs 里示范了正确做法(反转判据 + 写清原因)。
2. 客户端改动必须重启 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.3.md;
更早的见 docs/releases/。
| 版本 | 要点 |
|---|---|
| 1.15.4 | 文档版(与 v1.15.3 功能完全相同,无代码改动):补上 v1.15.3 贡献者的致谢(中英双段)与 THIRD_PARTY_NOTICES.md 条目。⚠️ 这个版本是一个判断失误,不要当先例 —— 事后确定的规矩是「只改文档/配置/测试等非编译内容时不单独发版,跟随下一个有代码改动的版本一起发布」;当时误以为"npm 页面渲染包内 README、又不能覆盖已发布版本,所以只能补发版本号",事实成立但结论错了(正确做法是发版前把文档核对干净)。规矩已写进 docs/release-checklist.md 第 5 节。 |
| 1.15.3 | 合入社区反馈的三个缺陷修复(来自 @SnowNight777 的 #4 / #5 / #7 与 PR #6 / #8,提交作者署名保留)。任务提醒:原先只有"草稿确认时的父任务"与"手动接口"两条路径建提醒记录,于是草稿拆出的子任务 / POST 建任务 / PATCH 改截止时间建出来的任务永远不会提醒 —— 现在三处统一按「显式 offset → 类型默认 → 优先级默认」补建,PATCH 只在没有生效中提醒时补,避免重复(提醒按 offset_minutes 存、按 dueAt − offset 现算,不是存绝对时间,所以不会留下过期时间戳)。投递目标缓存:status().configured 读的是只在 resolveTarget() 里填充的内存缓存,而 GET /reminders/channel 只调 listOptions() ⇒ 重启后设置页把已绑定目标误报「未配置」,且 isTargetConfigured 为假让包括启动补发在内的所有任务提醒被静默跳过 —— 现在改为「缓存命中 → 数据库有显式绑定」两级(末行不要用 available() 兜底:那会让没绑过目标的用户从"安静地不做事"变成"安静地反复投递失败",由 test/reminderWiring.test.mjs 钉住)。复用型会话(计划 / 日报周报 / 点子关联 / 点子头脑风暴):登记或引用的会话被归档或删除后,点下去没有任何反应、且那行陈旧引用永不更新(该链路从此开不出会话)—— 根因是客户端拿着旧 session_id 直接切、不验可用性;新增纯判据 aiSessionReuse.ts#isAiSessionReusable()(归档集命中 / 列表 ready 却查不到 → 不可复用;列表 pending 或旧宿主缺快照 → 不下结论,零回归),覆盖五处裸切(含报告行自己的 sessionId 回退这条独立路径),不成立时落回新建或给明确提示。用例 521 → 534。 |
| 1.15.2 | 本版对应父任务「工作台插件 v1.15.2 版本优化」及其 5 个子任务 + 1 条同期独立任务(完整对照见 docs/releases/v1.15.2.md §0)。① 快速录入的模型选择框被遮挡(P1):根因不是 z-index 而是裁剪 —— 浮层挂在弹窗滚动容器(overflow:auto)里、只会朝上开,真浏览器实测常见窗口可见比例仅 48%、1000×400 时菜单顶边 -94px 画到视口外;改为 portal 到 body + fixed + 纯函数 placePopover() 摆放(翻转/收敛/保证在视口内)+ 滚动·缩放·异步长高重算 + Esc 只关浮层 + ↑↓ 键盘。② 快速录入的默认工作区被上一次执行的任务污染(P1):根因不是"执行时写坏了存储",而是 openQuickEntry() 从当前选中任务派生默认值,而点「AI 执行」前 selected 必然就是那个任务、且面板收起不卸载 React 树;改为纯函数 decideQuickWorkspaceDefault(上次手动选择 → 系统默认 → 空,输入里没有任何任务/选中项)+ 只有用户动过输入框才写最近列表 + 「不再记住这个目录」出口。③ 今日容量的算法被摆到台面上(P2,本版最大一项):原先「已排 0 min」是个黑盒(内联在 4987 行组件里、无测试、逾期完全不参与),现在抽出纯函数唯一权威源 capacity.ts,界面给出七条口径 + 逐条账本(表尾合计 = 已排)、逾期单独成区并可一键计入(默认不计入)、每条任务可自定义耗时(改完不刷新即见效)、没填耗时按可配置的默认耗时计入并逐条标注、全天任务不改变容量计算。④ 知识库分类改 Tab(P2):下拉 → Tab + 关键词搜索(标题/正文/标签)+ 标签筛选 + 排序 + 分页 + 自适应时间分组;一并修「选择文件只能选 C 盘」;知识库类型颜色来自迁移 16 回填(根因是种子 config 为空、圆点取不到色)。任务列表按"与知识库一致"这一半做了类型改 Tab(Ctrl/Cmd 多选),搜索框/虚拟滚动/置顶/最近使用经澄清后取消(见该说明 §4 末尾)。点子页改 2 列卡片瀑布。⑤ 知识库被会话 AI 自动调用(P1):四个时机自动检索、命中条目在会话里可见、可全局/单会话关闭、有召回日志与"是否被引用"回报;打分口径被两轮实测逼出来,含两档闸门让未达阈门的条目也留一行提示。另:知识草稿覆盖不再静默(回执与界面列出被替换的标题,同期独立任务)、dev-install 不再删掉刚打好的包、私有信息清理。SCHEMA_VERSION 15 → 18(迁移 16/17/18)。用例 240 → 521。 |
| 1.15.1 | 任务资料夹改用 -(旧口径按标题:改标题成孤儿、同名挤一个目录、特殊字符变目录名),澄清阶段先预留任务 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) |
路线图
- [x] V1:任务 / 日历 / 快速录入澄清 / 子任务 / 会话关联
- [x] V1.5:AI 执行 + 用户验收 / 复盘 / 归档 / 变更历史 / 任务工作区
- [x] V2 每日 AI 智能排序(0.6.0)
- [x] V2:系统级桌面提醒(0.8.0)
- [x] V2 日报/周报(0.7.0)
- [x] V2:重复任务(0.12.0)
- [x] V2:个人知识库 / 错题集(1.0.0)
- [x] V2:知识库增强(AI 总结本地文档 + 文件链接)(1.2.0)
- [x] V2:今日计划面板长列表优化(sticky 统计卡 / 固定高度内部滚动 / 展开收起 / 面板内完成·推迟)(1.4.0)
- [x] V2:AI 会话前自定义提示词输入(除快速录入外,默认提示词 + 用户输入追加)(1.5.0)
- [x] V2:今日/日历计划面板手动编辑(上下移、改备注、从今日任务增删计划项;保留 AI 生成 + 确认 + 完成/推迟)(1.5.0)
- [x] V2:UI 美化(卡片/列表/表单/点子关联展示统一)
- [x] V2:任务类型自定义 UI(设置页字典管理:类型/状态/优先级/点子类型)
- [x] V2:任务到期提醒接入微信(1.10.x)
- [x] V2:Skill 选择器(1.11.0)
- [x] V2:验收暂存 / 驳回反馈闭环 / 草稿通知(1.12.0)
- [x] V2:UI 视觉层重构 + 点子文件夹 + 官方槽位入口(1.13.x)
- [x] V2:提醒状态语义修复(窗口/终态分离 + 重新武装)(1.13.2)
- [x] V2:侧栏入口迁移到官方槽位 + 改父任务 + 草稿暂存推广(1.14.0)
- [x] V2:任务资料夹改口径(-)+ 快录附件(图片 / PDF / DOCX)+ 模型选择器 + /workbench 命令(1.15.1)
- [ ] 待规划:客户端 WorkbenchApp 拆分(施工图见 docs/design/2026-09-09-client-split-backlog.md)
- [ ] V2:定时自动化
- [ ] 未来:多端同步、任务拖拽排序、数据导入导出
致谢
- @Guojing6 —— v1.15.1 的多项能力源自其 fork
Guojing6/dsh-workbench:任务资料夹改用任务 ID
(含“澄清阶段先预留任务 ID”这一关键设计)、快录附件(PDF/DOCX 抽正文、图片走宿主原生多模态)、
模型选择器、/workbench 斜杠命令、请求围栏加固;并定位了两个我们一直带着的真 bug
(任务没填路径时会话挂到无关工作区、澄清阶段按用户原话建文件夹)。
本仓按当前模块结构重做(其分支基于 v1.10.1),逐项来源见
THIRD_PARTY_NOTICES.md。
- @tujunwenjie —— issue #3 的诊断报告与本地修复分支,
帮我们看清了“用 DOM 注入参与非官方家族约定”这条路的根因(v1.14.53 据此整条腿删除)。
- @lhmhz —— issue #1(关联对话显示对话名 / 添加已有对话到任务)。
- @SnowNight777 —— v1.15.3 的三项修复全部来自其报告
(issue #4 /
#5 /
#7 与 PR
#6 /
#8,提交作者署名保留):
① 三条建任务路径不建提醒记录(草稿拆出的子任务 / POST 建任务 / PATCH 改截止时间)
——它们建出来的任务永远不会提醒;② 投递目标内存缓存引发的两个连锁缺陷
(重启后设置页把已绑定目标误报「未配置」,且 isTargetConfigured 为假让包括启动补发在内
的所有任务提醒被静默跳过)——报告里引用 draft-notify.ts 那段“早就绕开同一个坑”的注释作为旁证,
一句话说清了“为什么只有任务提醒坏了”;③ 复用型会话的陈旧引用(登记或引用的会话被归档/删除后
点下去没有任何反应,且那行陈旧引用永不更新,该链路从此开不出会话)——不仅给了纯判据 + 表驱动单测,
还自己补出了“报告行自己的 sessionId 回退”这条独立的第二条复用路径。
我们逐条对着代码核实过,三条全部成立;其中“列表 pending / 旧宿主缺快照时不下结论”
这个取舍尤其稳(避免了“启动瞬间凭空多开一个会话”),我们一个字没改。
详见 docs/releases/v1.15.3.md。
并行会话开发的隔离做法(1.15.2 起)
1.15.2 的两条线(容量透明化 / 知识草稿覆盖可见性)是两个会话同时改同一个本地仓库推进的。
做法记在 docs/design/2026-09-17-parallel-session-handover.md:
用 git worktree(而不是 git switch -c —— 后者会把工作区里未提交的改动一起带走,两边互相污染,
且两个会话在同一目录跑 pnpm build 会互相删掉对方的 lib/)开第二份检出,
开工前先把文件级归属写下来;合并时唯一的冲突确实出现在预判的那处
(tsconfig.build.json 的 include 白名单里两边各加了一个组件条目且位置相邻,解法是两边都保留),
其余共享文件自动合并成功。合并后在合并后的工作区重跑一遍门禁(两条线各自的“全绿”只证明各自成立)。
免责声明
本插件为社区项目,与 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.
任务文件夹命名为 -(其中 ID 是稳定部分),因此重命名任务永远不会使其文件夹成为孤儿,两个标题相同的任务也永远不会共用一个文件夹。你手动输入的文件夹永远不会被重写。
所有任务数据都存储在本地 ~/.dsh/workbench 下。
安装
从 npm 安装(推荐)
dsh plugin --profile web add @dely0/dsh-personal-workbench
从源码或发布 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-.tgz
然后重启 dsh web 并强制刷新浏览器。
兼容性
最低要求:DeepSeek Harness 0.1.5-rc.1(Web)。 这是硬性边界,不是建议。
| 要求 | 版本 | 备注 |
|---|---|---|
| DSH (Web) | 0.1.5-rc.1+ | 低于此版本,面板完全无法启动(见下文) |
| DSH 提供的客户端插槽 | sidebar.panellist + main + shell.overlay | 三者全部必需 |
| layout.selectPanel | 必需 | 唯一能选中我们面板的开关 |
| Node.js | ^22.19.0 \|\| >=24.0.0 | 与 engines 一致 |
| pnpm | >=11.7.0 服务端功能不受此限制:任务/日历/知识/想法、提醒、
报告以及 workbench_ 智能体工具只需要 0.1.0-rc.6+。在旧版宿主上你仍然可以
通过智能体使用它们——只是没有面板 UI。
面板仲裁与同级插件:明确的“不是我们的问题”策略
- 仅使用官方插槽:sidebar.panellist 用于侧边栏行,main 用于空占位符
(以便通过 layout.selectPanel 校验),shell.overlay 用于真实内容——
它始终被挂载,因此草稿对话框在关闭面板后仍然存在。
- 面板是否可见,只在一个地方给出答案:decidePanel()
(src/client/panelState.ts,一个纯函数,配有表驱动测试)。
- 不做跨插件的 DOM 协调。 面板仲裁由宿主的单值 activePanelId 负责。那些不使用官方插槽、而是通过 DOM 接管中间栏的插件(例如 dsh-client-ui-task-board、dsh-ssh、dsh-mnemon)可能会同时处于激活状态。这是宿主缺少统一面板注册表所导致的已知限制,而非本插件的缺陷。因此,我们从不读取或写入其他插件的 data-dsh- 属性,也从不派发 dsh-panel-activate。我们只写入自己的两个属性:
和
(由 test/clientInvariants.test.mjs 的 I4/I5/I6 强制约束)。
软探测(这与上述内容并不矛盾)
任何并非在所有受支持版本中都存在的 DSH 服务,都必须通过 ctx.get(name) 进行软探测,绝不能列入 inject。 区别如下:
- slots / layout 是面板功能的前置条件 → 它们进入 inject,
缺少其一意味着面板块不会启动(并输出可读日志);
- uiWorkspace / dshIm / skills 是可选增强项 →
软探测;缺少其一只是移除某项功能。
不依赖 dsh-web-ui。
路线图
- [x] V2:任意日期的 AI 优先级排序、操作系统级通知、每日/每周报告
- [x] V2:重复任务、个人知识库 / 经验教训、想法与想法聚类
- [x] V2:今日计划面板长列表优化(粘性统计 / 固定高度内部滚动 / 展开-折叠 / 内联完成与推迟)(1.4.0)
- [x] V2:AI 会话前的自定义提示输入(快速收集除外;在默认提示之后追加用户输入)(1.5.0)
- [x] V2:今日/日历计划面板的手动编辑(重新排序、编辑备注、添加/移除计划项;保留 AI 生成 + 确认 + 完成/推迟)(1.5.0)
- [x] V2:官方侧边栏插槽、任务重新挂载父级、对每种草稿类型推迟(1.14.0)
- [x] 仅官方插槽架构:面板可见性的唯一事实来源、移除 DOM 回退分支、能力门控(1.14.57)
- [x] 以任务 id 为键的任务文件夹、快速收集附件(图片 / PDF / DOCX)、模型选择器、/workbench 命令(1.15.1)
- [ ] 未来:定时自动化、多设备同步、拖放、导入/导出
致谢
- @Guojing6 — 1.15.1 的若干功能源自其分支
Guojing6/dsh-workbench:以任务 id 为键的任务文件夹
(包括在澄清阶段预先分配 id)、快速收集附件(通过宿主的多模态流水线进行 PDF/DOCX 文本
提取和图片处理)、模型选择器、/workbench
斜杠命令,以及合并重复的请求围栏辅助函数——此外还定位了两个真实的
这个项目一直背负的 bug。已针对此仓库当前的模块重新实现
(他们的分支基于 v1.10.1);参见 THIRD_PARTY_NOTICES.md。
- @tujunwenjie — issue #3 中的诊断与修复分支,该分支
揭示了通过 DOM 注入参与非官方侧边栏家族的根本原因。
- @lhmhz — issue #1。
- @SnowNight777 — v1.15.3 的全部三处修复均来自他们的
报告(issues #4 /
#5 /
#7 以及 PRs
#6 /
#8;保留了提交作者身份):
① 三条任务创建路径从未写入提醒行(来自草稿的子任务、POST /tasks、
PATCH /tasks/:id)——因此这些任务永远无法触发提醒;② 一个内存中的投递目标
缓存导致了两处相互关联的缺陷(重启后,设置页面错误地将已绑定的目标报告为
“未配置”,而 isTargetConfigured 为 false 导致调度器静默跳过每一条到期的
提醒,包括启动时的补发)——他们的报告引用了 draft-notify.ts 中那条注释,该注释
此前已经绕过了同一个陷阱,这一行就解释了为什么只有任务提醒出了问题;
③ 可复用 AI 会话中的过期会话引用(在所引用的会话被归档或
删除后,点击没有任何反应,而过期的注册表行从未被更新,从而永久卡死该
链条)——他们交付了一个带有表驱动测试的纯谓词,并且还发现了独立的
第二条复用路径(报告行自身的 sessionId 回退)。
我们对照代码验证了每一项说法,三处均成立。参见
docs/releases/v1.15.3.md。
许可证
MIT。参见 LICENSE 和 THIRD_PARTY_NOTICES.md。扫码进群