dsh-sticky-notes:给 DSH 加一块侧栏便签板

前言

在 DSH 里做长任务时,常遇到两类记录需求:一类是给智能体下的临时提醒,比如”明天 10 点交周报”;另一类是开发过程中随手记的状态、待办、颜色约定。这些内容如果散落在对话里,随着会话滚动就丢了;如果回到外部笔记工具,又和当前在改的插件上下文隔开。dsh-sticky-notes 解决这个问题的方式是:把一块便签板塞进 Harness 的左侧栏,同时把 note_create / note_list / note_update / note_delete 四个工具暴露给智能体,让界面和工具写的是同一份存储。

下面介绍这个插件。

这是什么

dsh-sticky-notes 是社区开发者 439436269-ctrl 维护的 DSH 插件,分类为”记忆”。它在 DeepSeek Harness 的侧栏加一个便签入口,点击后打开一块平铺的便签板;同时通过四个 note_* 工具让智能体读同一批便签。

它的特点是存储落在插件的 sticky_notes storage domain 下($DSH_HOME/storages),而不是 localStorage。换句话说,换端口、换浏览器、重启桌面应用,笔记都还在。

核心功能

经核对官方 README,实际提供的能力包括:

  • 侧栏入口与平铺板:左侧栏显示便签图标,点击后在主列打开板;每行密度可选 2 / 3 / 4 / 5,或自动填充宽度,选择会被记住。
  • 七种颜色:plain、amber、rose、mint、sky、violet、slate。卡片主体、边框、圆点共用一个 accent,工具栏可按颜色过滤。
  • 置顶与回收站:置顶卡片置顶并带图钉标记;删除进回收站标签页,可恢复、彻底删除或清空,删除时 toast 提供撤销。
  • 编辑对话框:点击卡片打开浮层,含标题、正文、颜色、置顶开关、字数统计、复制、复制副本、归档/恢复、永久删除。打字停手约 0.55 秒后自动保存。
  • 搜索、排序、导出:对标题和正文做文本搜索;按最近更新、创建时间、标题排序;一键把整板导出为 Markdown。
  • 快捷键:Ctrl/Cmd+N 新建、Ctrl/Cmd+F 聚焦搜索、Escape 关闭。
  • 持久化存储:见上文,落 $DSH_HOME/storages 下的 sticky_notes domain。
  • 智能体工具:note_create、note_list、note_update、note_delete。

板子与工具操作同一份数据:对智能体说”记一条:明天 10 点交周报,放琥珀色”,卡片就会出现在板上。

四个工具的参数

这四个工具都以单个文本块返回结果,便签 id 形如 note-<base36 time>-<random>。

工具 参数 作用
note_create body、title?、color?、pinned? 创建一条;省略 title 时取正文第一行
note_list query?、color?、pinned?、includeArchived?、sort? 按板子的筛选条件列出;回收站默认不含,需显式请求
note_update id、title?、body?、color?、pinned?、archived? 局部更新某条;archived: false 可恢复
note_delete id、permanent? 默认移入回收站,permanent: true 时彻底删除

安装与启用

安装命令来自 README 原文,支持 npm 与本地目录两种来源:

dsh plugin add @vfvrpq/dsh-sticky-notes      # from npm
dsh plugin add /path/to/dsh-sticky-notes     # from a checkout, while developing

装完后 bundle patch 会插入一行 sticky-notes,dsh.client 块让 web 端加载 lib/client.js。目录方式安装后应用不需要重启,宿主会重载这一行;但已经打开的标签页只会在下次加载时拿到新 bundle。可以用下面这条命令确认行是否挂载:

dsh --profile <name> --dump-config | grep sticky-notes

运行环境要求 Node >= 22,依赖 @deepseek-ai/cordis ^4.0.1、@deepseek-ai/dsh-storage-domain ^0.2.0-rc.2、@deepseek-ai/dsh-tools ^0.2.0-rc.2。许可证为 MIT,包版本 0.2.0。

HTTP 接口

板子的浏览器端和后端只走一条需要鉴权的路由,挂载在 /api 之下,因此会先经过连接服务的 Host/Origin 校验和浏览器会话检查:

GET  /api/dsh-notes                 -> { ok, notes: [...] }            (含回收站)
POST /api/dsh-notes { action: ... } -> { ok, note?, notes: [...] }
       create      { title?, body, color?, pinned? }
       update      { id, title?, body?, color?, pinned?, archivedAt? }
       archive     { id }        (alias: delete)
       restore     { id }
       purge       { id }
       duplicate   { id }
       clear-trash { }

路由路径通过 globalThis.__DSH_STICKY_NOTES_CONFIG__ = { routePath } 注入页面,浏览器端不硬编码路径。

代码结构

如果想改这个插件,官方 README 给出的目录划分是:

lib/index.js    wiring: domain, route, tools, page injection
lib/config.js   route path, domain name, limits
lib/palette.js  colour ids shared with the board
lib/notes.js    pure shaping/patching/filtering/ordering(无运行时 import)
lib/domain.js   storage domain + repository(archive、restore、purge、duplicate)
lib/route.js    /api/dsh-notes 处理
lib/tools.js    四个工具的 spec
lib/client.js   浏览器端:侧栏入口、板子、编辑框、字典、样式
locale/*.json   meta.title / meta.description

lib/notes.js 明确标注为纯函数,不依赖运行时,方便单测;adapter.test.js 用 stub 的 Harness 包挂载真实 lib/,验证 apply() 能把 domain、route、tools 和销毁钩子接在一起。

测试

单元测试直接跑:

node --test test/*.test.js

覆盖范围:notes.test.js 测纯 shaping、颜色、置顶、回收站和排序;route.test.js 测每个 HTTP 分支;client.test.js 测 bundle 注册和筛选/排序文案;adapter.test.js 测 apply() 的装配。

浏览器端 e2e 需要一个 web host,用隔离 profile 启动后再驱动:

dsh --profile <name> --no-open --port 0      # 输出 http://127.0.0.1:<port>/?token=…
node scripts/e2e-notes.mjs --base http://127.0.0.1:<port> --token <token>

该脚本会在 UI 里创建一条有色置顶卡片、把网格切到每行 3 列、搜索、归档再经回收站恢复,并在颜色、置顶、内容必须跨 reload 存活的前提下判定成败。运行证据在仓库的 VERIFY.md。

适用场景

适合以下几类使用者:

  • 做长任务时需要给智能体留提醒、状态、颜色约定,希望对话里说一句就能落到板上的人。
  • 想用程序化方式(API 或工具调用)读写同一份便签,而不是手动点 UI 的人。
  • 需要在自动化流程里批量 create / list / update / delete 便签,把便签当作轻量结构化存储的人。

不适合以下需求:官方 README 明确写明没有文件夹、标签,也没有跨设备同步——同步范围限于持有该 storage domain 的 Host。卡片顺序按置顶加排序键生成,不支持拖拽重排。单条正文上限 20,000 字符,标题上限 200,超长会截断而非拒绝。

注意

  • 插件以当前 dsh 进程的权限运行,能访问 $DSH_HOME/storages 下的 domain 与工具层。安装前建议先读一遍源码和许可证(MIT),确认自己接受这些能力边界。
  • npm 上的包名是 @vfvrpq/dsh-sticky-notes,GitHub 仓库为 439436269-ctrl/dsh-sticky-notes,两者归同一作者维护。作者标注的仓库、主页、issue 入口都指向 GitHub。
  • 该插件属于社区目录里的条目。社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系,使用时不要当成官方应用商店的背书。

结尾

dsh-sticky-notes 的价值在于把”随手记”和”给智能体下达的提醒”合到同一块板、同一份存储里,省掉了在对话和外部笔记之间来回搬运的步骤。功能克制,边界清楚:没有文件夹、没有跨 Host 同步、没有拖拽排序。

目录页:https://www.skillhub.cn/plugins/439436269-ctrl/dsh-sticky-notes
GitHub:https://github.com/439436269-ctrl/dsh-sticky-notes

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜