Back to home

perry-ai

dsh-todo-list

把通知、公告、邮件等文字中的关键事项转换为带截止日期的待办插件,并通过左侧栏作为入口管理

Stars
0
Language
TypeScript
Created
Aug 17, 2026
Updated
Aug 17, 2026

Introduction

dsh-todo-list — DSH web GUI 待办插件

一个部署级 DeepSeek Harness (DSH) Web GUI 插件,把通知、公告、邮件等文字中的关键事项转换为带截止日期的待办,并通过左侧栏 To Do List 入口管理。插件以 bundle 形式随 profile 挂载(dsh plugin add 一键安装),不修改 DSH 源码。无需批准、无需配置,重启后数据与入口仍在。

  • 浏览器只是异步视图;数据权威在 Host,所有读写都经 /api/todo 落盘到本地 JSON。
  • 模型工具与侧栏 UI 读写同一份清单,会话内可直接用 todo_* 工具增删改查。
  • 首次加载自动迁移旧动态插件写入的 <cwd>/todos.json,历史数据不丢。

功能

  • 模型工具:Host 注册 6 个全局工具 todo_add / todo_list / todo_complete / todo_remove / todo_update / todo_today,可把一段文字中的多个事项一次性转为待办,并为每项确定 YYYY-MM-DD 截止日期。
  • REST APIGET /api/todo(列表)、POST /api/todo(批量添加)、PATCH /api/todo/:id(更新)、DELETE /api/todo/:id(删除)、POST /api/todo/clear-completed(清空已完成)。
  • 侧栏入口:侧栏底部 To Do List 入口,宽栏显示图标 + 文字 + 未完成数徽标,折叠 rail 显示圆形图标;点击弹出面板,提供清单视图与日期视图(已逾期 / 今天 / 明天 / 7 天内 / 30 天内 / 更远)。
  • 持久化:清单存于 $DSH_HOME/storages/dsh-todo-list/todos.json,临时文件 + 原子 rename 写入,崩溃不会留下半个文件。
  • 主题适配:UI 通过 dsh web CSS 变量适配主题;侧栏 footer 纵向堆叠的布局修复内置在客户端样式,无需修改平台源码。

架构与实现

  • src/index.ts 通过 webServer 服务挂载 /api/todo 前缀路由,并通过可选的 tools 服务注册 6 个模型工具。
  • src/types.ts 声明领域类型与共享常量;src/services.ts 声明本插件消费的 DSH/Cordis 服务结构化子集契约(仅类型,零运行时)。
  • src/store.ts 负责持久化:内存快照 + 临时文件原子 rename,首次加载迁移旧动态插件数据。
  • src/domain.ts 集中校验(标题、日期格式)、剩余天数计算、条目投影与增删改查。
  • src/api.ts 分发 REST 路由;请求体为 JSON,上限 1 MiB,超限回 413,非法 JSON 回 400。
  • src/tools.ts 定义 6 个 todo_* 工具的 JSON Schema 与文本渲染。
  • src/client.ts 为浏览器半端,经 window.__ModuleLoader__ 单文件自注册,注入样式并挂载侧栏入口,通过 /api/todo 拉取与变更数据。

安装

前置:一个可用的 DSH Web profile(一般位于 $DSH_HOME/profiles/webDSH_HOME 默认 ~/.dsh),并确保 dsh 命令可用。

推荐:dsh plugin add

dsh plugin --profile web add dsh-todo-list

该命令在 profile 目录内执行 pnpm add dsh-todo-list;因本包声明了 dsh.bundle.patchdsh plugin 会自动把它追加到 profile 的 bundle 层(dsh.profile.bundles),无需手动编辑 package.jsoncordis.patch.yml。安装后重启 dsh web 即生效。

备选:本地 file: 安装

# 1. 拷贝工程到任意位置(下称 $SRC),构建产物
cd "$SRC"
pnpm install        # prepare 脚本自动编译 src/ → lib/

# 2. 声明依赖:编辑 $PROFILE/package.json,在 dependencies 中加入
#    "dsh-todo-list": "file:<$SRC 路径>"

# 3. 加入组合:编辑 $PROFILE/cordis.patch.yml,追加
#    - insert:
#        - id: dsh-todo-list
#          name: 'dsh-todo-list'

# 4. 安装并重启
cd "$PROFILE"
pnpm install

file: 依赖为拷贝安装(非链接);pnpm 可能因未检测到内容变化而跳过拷贝,此时用 pnpm install --force。重启 dsh web 后插件自动就位。

数据存储与迁移

  • 清单位于 $DSH_HOME/storages/dsh-todo-list/todos.json,结构为 { version, todos, nextId }
  • 每次变更先写 <file>.tmp 再原子 rename,避免半写文件。
  • 首次加载若存在旧动态插件写入的 <cwd>/todos.json,自动迁移并保存到新位置,原文件保留。
  • 读取走内存快照,每次写入后刷新快照。

构建

需要 Node 20 及以上与 TypeScript 工具链:

pnpm install   # 安装 devDependencies,并自动触发 prepare 构建 lib/
pnpm build     # 手动构建:tsc -p tsconfig.json,src → lib
pnpm typecheck # 仅类型检查:tsc --noEmit

lib/ 为编译产物,不进版本库(见 .gitignore)。pnpm install 会通过 prepare 脚本自动从 src/ 编译生成;file: 安装前需先在本工程执行一次 pnpm install 以产出 lib/

手工验证

  1. 挂载插件并重启 dsh web,确认侧栏底部出现 To Do List 入口。
  2. 会话中调用 todo_today 获取今天日期,再用 todo_add 批量添加事项。
  3. 调用 todo_list,确认每项返回标题、截止日期与剩余天数。
  4. 打开侧栏面板,在清单视图与日期视图间切换,确认分组正确。
  5. 请求 GET /api/todo,确认返回 {"todos":[...]};用 PATCH /api/todo/:id 标记完成后再列表,确认完成状态与未完成数变化。
  6. 重启 Harness,确认待办仍在。

已知限制

  • 无跨进程文件锁:同一 $DSH_HOME 下同时运行多个 Host 时,各进程维护独立内存快照,写操作可能互相覆盖。
  • 会话内不展示待办条,待办仅通过侧栏入口与 todo_* 工具管理。
  • 侧栏 footer 布局修复依赖 CSS 类名 [class*="footerActions"],平台若重命名该类会失效。
  • 相对时间(明天 / 下周一等)换算为具体日期,依赖模型先调用 todo_today 获取今天日期。