跳过主要内容
O

dsh-worktodo

olimc2016/dsh-worktodo

DSH 工作待办面板(社区插件,非官方):归你所有、跨会话持久的工作待办——优先级 / 截止日期 / 项目 / 已过期与本周视图,agent 通过 worktodo_* 工具读写同一份列表。官方 todo_write 属于单个会话且只能整表替换,这份列表属于人。Human-owned cross-session work todo list for DeepSeek Harness: priorities, due dates, projects, overdue/week views and workt

安装

dsh plugin --profile web add github:olimc2016/dsh-worktodo

README

工作待办 · dsh-worktodo

归你所有、跨会话持久的工作待办。 DSH 侧栏一个独立面板,agent 通过 worktodo_* 工具读写同一份列表。

兼容 DSH 0.2.x(0.2.0-rc.2 实测)· 运行期只依赖 3 个官方平台包(无任何第三方依赖)· 社区插件,非官方

关于本文里的路径:提到 docs/、tools/ 等目录时,指的是仓库里的文件——它们不在 npm 发布包内。 仓库地址:https://github.com/olimc2016/dsh-worktodo


它解决什么问题

DSH 自带的 todo_write 是当前这个 agent 会话的计划:整表替换、只有 pending / in_progress / completed 三态、只属于那一个会话。官方文档写得很直白——「任务列表属于创建它的那一个 agent 会话……不存在跨 agent 共享列表的方式」,而且没有优先级、没有截止日期、没有项目、没有逐项编辑。会话一关,那份计划就翻篇了。

于是真实工作里那些「明天还得接着办」的事没有地方放:等对方回复、等评审、下周要交的东西、这个月要跟的活。

这份列表是给人的:有优先级、截止日期、项目和备注,跨会话、跨项目一直在;agent 能读能写,但真源在你手里。

官方 todo_writedsh-worktodo
归属单个 agent 会话你(跨会话、跨项目)
更新方式整表替换逐项增删改
字段内容 + 三态内容 + 优先级 + 截止日期 + 项目 + 备注
跨 agent 共享❌ 官方明确不支持✅ 同一份列表,人与 agent 都读写
视图会话内清单已过期 / 今天 / 明天 / 本周 / 以后 / 已完成 分组 + 统计
数据位置会话事件日志$DSH_HOME/storages(官方 storage)或 ~/.dsh/worktodo/todos.json

两者不冲突:worktodo_adopt 可以把你这个会话的 todo_write 里值得留下的条目一键提升成工作待办。

安装

方式一:直接从 GitHub 装(不依赖 npm 上的包;装完重启 DSH)

dsh plugin --profile desktop add github:olimc2016/dsh-worktodo

这条路是实测过的(见 docs/verification.md):仓库里提交了浏览器半侧的构建产物 lib/client.js, 包内没有 prepare/install 这类构建脚本,所以 git 安装不需要任何构建授权,也不会把开发依赖装进来 ——实测(从 GitHub 安装):顶层只解析 1 个包(本插件本身),三个官方平台包由 DSH 运行时从安装目录提供、 不会在 profile 里再装一份;包内含已构建的 lib/client.js,无需构建授权。

为什么平台包是 optional peer 而不是 dependencies:0.1.0 只声明 peer 时,旧版 DSH(0.2.1 之前) 没有 installation 拦截层,装出来解析不到平台包、插件整个加载失败(工具全部消失);0.1.1 因此改成了 dependencies。但 0.2.1 起宿主自己提供这些包,插件再带一份就会在 profile 里装出第二份、与宿主版本 混用(2026-10-17 桌面版「required plugin did not activate」正是它)。0.2.7 起改回 optional peer: 平台包从 DSH 安装目录解析,解析不到时只降级成「只有面板」,不会连累宿主 (三个平台包全部是函数内动态 import + catch,模块求值阶段不碰它们)。 证据与实测见 docs/reviews/duplicate-platform-packages.md。

方式二:从 npm 装(包发布后可用)

dsh plugin --profile desktop add dsh-worktodo

方式三:在 DSH 侧栏「插件 → 添加插件」里填 dsh-worktodo 或仓库地址。

装好后侧栏会多一个**「待办」**入口,设置 → 插件里也能看到它。

更新 / 升级

面板会检查新版本;DSH 不允许插件自行安装或重启 DSH,所以自动更新失败时, 面板里的更新徽标旁会出现「手动更新」,点开就是可复制的命令。也可以先自己执行:

# 1) 卸载旧版
dsh plugin --profile desktop remove dsh-worktodo
# 2) 安装最新版(npm 上 dist-tags.latest 指向的版本)
dsh plugin --profile desktop add dsh-worktodo@latest

然后完全退出 DSH 再重新打开(⌘Q / 菜单退出,不是只关窗口)。

  • 不确定 profile 名:dsh plugin --list 会显示;把命令里的 --profile desktop 换成它。
  • 装的是 GitHub 版:把第 2 步换成 dsh plugin --profile desktop add github:olimc2016/dsh-worktodo。
  • 开发模式(profile 里写的是 link: 到本地仓库):不要在 profile 里重装,改在插件仓库执行 git pull && pnpm install && pnpm run build,再重启 DSH。
  • 装好后想确认版本:面板页脚显示 版本 vX.Y.Z,或 dsh plugin --profile desktop list。

「手动更新」里的命令只含 profile 名,不含任何本机路径;命令执行失败时把输出贴到 issues 即可。

用起来

面板:顶部是统计(未完成 / 已过期 / 今天 / 进行中 / 今日完成),中间是快速添加框(标题 + 截止日期 + 优先级,回车即存),下面是分组列表。每行可以直接勾完成、点标题行内改、删除(二次确认)。

agent 工具:模型可以自己登记、查询、推进和归档工作待办,不需要你转述。

工具用途
worktodo_add登记一件事(可带截止日期、优先级、项目、备注)
worktodo_list查列表:open / today / overdue / week / doing / completed / all,可按项目或关键词过滤
worktodo_update逐项修改(不会像整表替换那样动到别的条目)
worktodo_done标完成,或标回进行中 / 待办
worktodo_remove删除(做完的事请用 worktodo_done 留痕)
worktodo_adopt把本会话 todo_write 的条目提升为工作待办,按标题去重

给 agent 的一句话就能用起来:

「把今天要跟进的三件事记到工作待办里,明天上午的标高优先级。」

数据存在哪

按优先级自动选择,/worktodo/health 与面板底部都会显示当前实际位置:

  1. 官方 storage(ctx.storageDomain,DSH 默认挂载)——数据落在 $DSH_HOME/storages。 这是官方给「插件自有、跨重启保留、不进会话事件」的数据指定位置:几十条待办不必变成会话历史。
  2. JSON 文件回退——$DSH_HOME/worktodo/todos.json。storage 服务缺失的精简组合里自动走这条路; 这个文件是人能直接打开、手改、进 git 的形态,写坏了也不会被静默清空(单条坏记录跳过,其余照常读出)。

想在 cordis.patch.yml 里固定路径(例如放进自己的笔记仓库):

- id: worktodo
  name: 'dsh-worktodo'
  config:
    storePath: /Users/me/notes/worktodo.json

升级后回退文件会退役:一旦数据成功合并进官方 storage,$DSH_HOME/worktodo/todos.json 会被改名成 todos.json.migrated-<时间>(完整存档,可随时手动查看/恢复),同目录另留一个 todos.json.retired 哨兵。 退役之后官方 storage 是唯一真源:如果那套组合里没有 storageDomain,面板会明确报错(不会显示空列表冒充 「还没有待办」),页脚也会写清「官方存储不可用 · 回退文件已退役」。

兼容

  • DSH 0.2.x(官方版本闸门会把锁在旧版本的插件拒掉,本插件按 0.2.0-rc.2 的 API 编写并实测)
  • Node ≥ 22.19.0
  • dependencies 为空:不装任何运行期 npm 包。平台包(@deepseek-ai/dsh-tools、 dsh-storage-domain、dsh-home-paths)都声明为可选 peer——DSH 自带这些包,从安装目录解析; 真解析不到时插件会降级成「只有面板」而不是加载失败(日志里会写一行原因)。

开发

pnpm install            # esbuild 用预编译二进制,无需 approve-builds
pnpm run build          # 打 lib/client.js(浏览器半侧)
pnpm test               # 155 个用例:数据模型 / 存储 / 服务 / 宿主接线与工具 / 客户端↔宿主契约 / 客户端 bundle / CI 契约 / 隐私门禁 / 收录门禁
pnpm run watch          # 改客户端时增量构建

发版流程(Trusted Publishing + 暂存批准)见仓库里的 docs/releasing.md:

测试策略:不用启动 DSH 就能跑完—— verify-records(纯数据)、verify-store(真实文件 IO + 官方 defineDomain 契约校验)、 verify-service(显式状态与边界)、smoke-host(假 ctx 里跑通 apply → 路由 → 服务 → 存储, 以及工具注册与执行,工具 schema 由官方 defineTool 校验)、 smoke-contract(从客户端源码提取它实际发的路径与字段,与宿主真实路由比对——防字段名打错导致的 静默失效,例如截止日期永远存不上)、smoke-client(bundle 格式、slot 注册、首屏渲染不抛异常)、verify-submission (收录 PR 的本地门禁:字段/文件名/分类/日期 + 「git 安装必需的文件是否都已入库」这类只在 GitHub 分发路径下才致命的检查)。

License

MIT © 2026 oli20

相关插件