dsh-session-todos
Manifest validPer-session todo lists for DeepSeek Harness: user-defined columns, completion, batch actions, undo and CSV export, plus agent access through a tool.
dsh-session-todos
DeepSeek Harness(DSH)插件:每个会话独立的待办清单,列由用户自定义,默认只有「序号|事项」。
界面与 AI 共用同一份数据:你在面板上勾选,模型能读到;模型写进去的事项,面板也会显示。
特性
- 会话隔离:每个会话有自己的事项与列配置,互不影响。
- 自定义列:文本 / 数字 / 日期三种类型,可新增、重命名、左右移动、删除;事项列可改名但不可删除。
- 事项操作:新增、编辑、删除(带确认)、勾选完成、再次勾选恢复未完成、上移 / 下移。
- 搜索与筛选:搜索所有列,筛选全部 / 未完成 / 已完成。
- 批量操作:批量完成、恢复、删除(作用于当前筛选结果)。
- 撤销:最近 20 次操作可回退,包含删除列及其数据;没有重做。
- 导出 CSV:导出全量清单(不是当前筛选),带完成标记,兼容中文 Excel,并对公式注入做了转义。
- 按需展示:不创建就不显示、不占空间;展开后的宽度、内边距、折叠摘要对齐原生任务框。
- AI 可用:模型通过
session_todos工具读写同一份清单,与界面共用同一个宿主方法。
安装
安装一个 DSH 插件是两步,缺一不可:
- 装依赖 —— 让包在 profile 里可解析;
- 启用 bundle —— 把包名写进 profile 的
dsh.profile.bundles。
dsh plugin --profile <name> <args...> 只是 pnpm 的转发(在 profile 目录里执行),所以它只完成第 1 步:
git clone https://github.com/Tpihis/dsh-session-todos.git
cd dsh-session-todos
dsh plugin --profile web add "$PWD" # ① 装依赖
第 2 步没有对应的 CLI 命令,用插件管理器完成:
- GUI:侧边栏「插件」面板里把
dsh-session-todos打开; - 或让 agent 调
plugin_manager:set_bundle,target = dsh-session-todos,enabled = true; - 或一步到位:
plugin_manager的install_bundle,target指向本目录(安装 + 启用)。
只做第 1 步插件不会加载。 这不是猜测:dsh 只提供 dsh plugin(pnpm 转发)和 --patch 两个入口,没有 dsh bundle 之类的命令;而且本机 profile 里就有一个实例——@linxin666/dsh-client-ui-skill-explorer 在 dependencies 里但不在 dsh.profile.bundles 里,因此始终 enabled: false。
验证是否启用成功:
node -e 'console.log(require(process.env.HOME+"/.dsh/profiles/web/package.json").dsh.profile.bundles)'
名字出现在这个列表里,并且插件面板显示已启用,才算装好。
安装完成后:
- 宿主半即时生效;
- **客户端半需要刷新一次页面(F5)**才会出现新代码;
- 没有
pnpm run dev:web时,客户端插件不会自动热更新。
使用
打开任意会话,输入框上方会出现一行「会话待办」摘要(未创建清单时不显示)。点开即可编辑。
也可以直接对模型说:
把这些需求加入当前会话待办,并增加分类、优先级和截止日期列。
模型侧的 todo_write 是它自己的执行计划,与本清单无关。
数据与边界
- 数据存在宿主存储域
session_custom_todos(本机位于~/.dsh/storages/session_custom_todos/),不在插件目录内,卸载插件不会删除数据。 - 每个会话最多 2000 条事项、20 个数据列;列名最多 80 字符,单元格最多 10000 字符。
- 并发写使用 revision 检查:拿旧版本号提交会被拒绝,提示刷新后重试。
- 会话分支(fork)默认是空白清单,不继承父会话。
- 会话删除后,其域记录不会自动清理。
已知限制
- 写操作会在对话里留下一条命令卡片。界面的写操作通过斜杠命令
/session-todos落到宿主,而 DSH 一定会把命令生命周期(command/run+command/done)渲染成卡片,无法避免。为让它可读,每次写操作返回一句中文摘要(如「已完成 1 条(2/3 已完成)」),卡片摘要行显示该文本,而不是默认的「已完成」。摘要生成在src/model.js的summarize()。 - 想做到完全不产生这类卡片,需要改用插件自建的 typert RPC(宿主
ctx.typert.register+ 客户端ctx.remote.$mount)。曾实现过一版,但桥接调用挂起会让面板写入锁卡死,未收敛,故采用当前折中方案。 - 未做第二台机器、其他 DSH 版本、其他操作系统的验证。
开发
src/host.js 宿主半(apply / inject,命令、工具、会话投影、存储域)
src/model.js 纯业务逻辑(校验、变更、撤销、视图、摘要)+ 单元测试
src/model.test.js 测试:node --test src/model.test.js
client.js 浏览器半(React,通过 __ModuleLoader__ 注册)
cordis.patch.yml bundle 补丁,插入一行 session-todos
改完代码为什么不生效
运行中的 DSH 进程按 URL 缓存已导入的模块,而 profile 安装的 bundle 不会因为自身文件变化而热重载。原地改文件,跑的还是旧模块。
npm run refresh # 给入口的相对导入写入内容哈希 ./model.js?v=<hash>
然后重新启用 bundle(或重启 DSH)。哈希必须是字面量——Loader 要静态读取入口的 export const inject,所以不能用 Date.now() / Math.random() 在运行时拼。
注意:refresh 只能让入口的依赖换 URL;如果入口文件本身(src/host.js)的缓存需要失效,仍然要重启 DSH 或更换入口文件名。
License
MIT
Comments
Loading…