DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-session-todos

T

dsh-session-todos

Manifest valid

Per-session todo lists for DeepSeek Harness: user-defined columns, completion, batch actions, undo and CSV export, plus agent access through a tool.

UI (client)hasBundlePatch

dsh-session-todos

DeepSeek Harness(DSH)插件:每个会话独立的待办清单,列由用户自定义,默认只有「序号|事项」。

界面与 AI 共用同一份数据:你在面板上勾选,模型能读到;模型写进去的事项,面板也会显示。

特性

  • 会话隔离:每个会话有自己的事项与列配置,互不影响。
  • 自定义列:文本 / 数字 / 日期三种类型,可新增、重命名、左右移动、删除;事项列可改名但不可删除。
  • 事项操作:新增、编辑、删除(带确认)、勾选完成、再次勾选恢复未完成、上移 / 下移。
  • 搜索与筛选:搜索所有列,筛选全部 / 未完成 / 已完成。
  • 批量操作:批量完成、恢复、删除(作用于当前筛选结果)。
  • 撤销:最近 20 次操作可回退,包含删除列及其数据;没有重做。
  • 导出 CSV:导出全量清单(不是当前筛选),带完成标记,兼容中文 Excel,并对公式注入做了转义。
  • 按需展示:不创建就不显示、不占空间;展开后的宽度、内边距、折叠摘要对齐原生任务框。
  • AI 可用:模型通过 session_todos 工具读写同一份清单,与界面共用同一个宿主方法。

安装

安装一个 DSH 插件是两步,缺一不可:

  1. 装依赖 —— 让包在 profile 里可解析;
  2. 启用 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…