READMESource: main@49f28724
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 API:
GET /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/web,DSH_HOME 默认 ~/.dsh),并确保 dsh 命令可用。
推荐:dsh plugin add
dsh plugin --profile web add dsh-todo-list
该命令在 profile 目录内执行 pnpm add dsh-todo-list;因本包声明了 dsh.bundle.patch,dsh plugin 会自动把它追加到 profile 的 bundle 层(dsh.profile.bundles),无需手动编辑 package.json 或 cordis.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/。
手工验证
- 挂载插件并重启
dsh web,确认侧栏底部出现 To Do List 入口。 - 会话中调用
todo_today获取今天日期,再用todo_add批量添加事项。 - 调用
todo_list,确认每项返回标题、截止日期与剩余天数。 - 打开侧栏面板,在清单视图与日期视图间切换,确认分组正确。
- 请求
GET /api/todo,确认返回{"todos":[...]};用PATCH /api/todo/:id标记完成后再列表,确认完成状态与未完成数变化。 - 重启 Harness,确认待办仍在。
已知限制
- 无跨进程文件锁:同一
$DSH_HOME下同时运行多个 Host 时,各进程维护独立内存快照,写操作可能互相覆盖。 - 会话内不展示待办条,待办仅通过侧栏入口与
todo_*工具管理。 - 侧栏 footer 布局修复依赖 CSS 类名
[class*="footerActions"],平台若重命名该类会失效。 - 相对时间(明天 / 下周一等)换算为具体日期,依赖模型先调用
todo_today获取今天日期。
No comments yet. Be the first to write one.