dsh-memo-plus:上游备忘的 drop-in 增强(Markdown、笔记本、长文折叠、触屏拖拽)

前言

在 DeepSeek Harness(DSH)里随手记一段提示词草稿、待办或会话摘录,很多人会装社区里的 @adamcjm/dsh-memo。上游 0.2.11 已经能落盘、打标签、同步 GitHub,但正文按纯文本展示:粘进去的 ## 标题、表格源码原样躺着;手机上输入区、标签云和筛选条又把列表可视区挤到半屏;触屏上轻轻一滑就被 SortableJS 当成拖拽,列表很难正常上下滚。

ymf2317-tech/dsh-memo-plus 是针对这些痛点的自用 fork。包名与面板 id 仍保持 @adamcjm/dsh-memo / memo,属于 drop-in 替换,不是多装一个面板,也不单独迁数据目录。下面按定位、改动点、接口用法和安装方式说明。

这是什么

  • 仓库: ymf2317-tech/dsh-memo-plus
  • 目录页:SkillHub 插件条目
  • 维护者:ymf2317-tech(上游作者 adamcjm,MIT)
  • 当前包版本(资料中 package.json):0.3.3-ymfd.4,基于上游 @adamcjm/dsh-memo@0.2.11
  • 分类:记忆

一句话:在不动 memo 数据模型和 host API 的前提下,给客户端补上 Markdown 渲染、布局收紧、触屏长按拖拽门控,以及面板内「笔记」区长文档区。

与上游 0.2.11 的差异

能力 上游 0.2.11 本 fork
正文 white-space:pre-wrap 纯文本 Markdown 渲染(标题/表格/代码/引用/列表)
长文 一条占满整屏 折叠 9 行 + 展开全文
手机布局 输入区 80px + 标签两三行 + 筛选换行 输入单行聚焦展开、标签收起、筛选单行横滚
触屏 一滑就变拖拽 长按 220ms 才拖,正常上下滚动
长文档 只能塞进备忘列表 「笔记」区(正文首行 # 标题 即名称,全屏阅读)

核心功能

1. Markdown 渲染

host 半侧新增 GET /memo/vendor/marked.js,把 profile 里已有的 marked@18.1.3(node_modules/marked/lib/marked.umd.js)原样提供;不新增 npm 依赖。client 按需 loadMarked(),renderMarkdown() 使用 marked.parse(gfm:true, breaks:true),按正文文本缓存(超过 400 条清空)。

渲染前经过 sanitizeHtml(),去掉 script/iframe/object/embed/link/style、on* 属性、javascript: 协议。若拿不到 marked,则降级为上游纯文本行为,不报错、不阻塞面板。样式覆盖标题层级、表格横向滚动、行内/块代码、引用、列表、链接与分隔线。

2. 布局(CSS + 少量状态)

输入框默认约 40px 单行,:focus-within 再展开到 104px。标签云默认收起,只显示 标签 N ▸ chip。筛选条单行横滚,不再换两排。窄屏(max-width:720px)收紧头部、隐藏条数、缩小同步按钮,列表底部留安全区。备忘列表区域吃满剩余高度。

3. 触屏拖拽门控

SortableJS 使用长按门控,鼠标端零延迟不变:

delay: 220,
delayOnTouchOnly: true,
touchStartThreshold: 6,
fallbackTolerance: 4,

配合 touch-action: pan-y 与 overscroll-behavior: contain,手机上先滚动,长按才排序。

4. 笔记本(备忘 / 笔记 双 tab)

顶栏用 chip 在「备忘」与「笔记」之间切换。不单独建表:用保留标签「笔记本」区分长文档,数据仍在同一套 notes/*.md 事实源,GitHub 同步、快照、附件与上游一致。

  • 备忘区列表自动排除带「笔记本」标签的条目;「全部 / 待处理」计数也会扣除这部分。
  • 标签云对用户隐藏「笔记本」这一内部分类标记。
  • 笔记列表:标题取正文第一个 # 标题 行(否则取首行);摘要去掉 Markdown 记号后截 120 字。
  • 阅读:面板内全屏层,Markdown 渲染后可滚动;编辑为等宽 textarea,Ctrl / ⌘ + Enter 保存。
  • 删除需两次确认。保存时显式传 tags: ['笔记本', ...正文里的 #标签],避免归类被正文覆盖。

host 侧 API 未改,仍复用 create / update / remove / list / tags。

5. 刻意未注册 Agent 工具

插件没有向 DSH 注册 agent 工具:设计上是让人工(或你自己写的脚本)通过 HTTP 写备忘,而不是让模型默认自动读写私人笔记。

安装与启用

资料中的 README 未给出 dsh plugin add github:... 一类一键命令;安装思路是把本 fork 替换已存在的 @adamcjm/dsh-memo 包目录(包名不变)。常见两种方式:

  1. 将 dsh-memo-plus 仓库 放到本机某绝对路径(例如资料作者示例中的 D:\dsh-workspace\packages\dsh-memo-plus)。
  2. 在 DSH profile(~/.dsh/profiles/<profile>)的 package.json 的 dependencies 增加:
"@adamcjm/dsh-memo": "link:<绝对路径>/dsh-memo-plus"
  1. 让 <profile>/node_modules/@adamcjm/dsh-memo 指向该目录(Windows 可用目录联接,其他平台用符号链接)。
  2. 重启 DSH Web。

仅改 lib/client.js 时刷新浏览器即可;改 lib/index.js(含 /memo/vendor/marked.js)须再次重启 DSH Web。

B. 覆盖已安装的上游目录

把本仓库的 lib/、cordis.patch.yml、package.json 覆盖进 profile 下已有的 node_modules/@adamcjm/dsh-memo。DSH 仍识别为同一插件,不会新建数据目录。

说明:包名故意仍叫 @adamcjm/dsh-memo,以便 bundle patch 与面板 key 不变;因此该 fork 不能直接以原包名 npm publish。将来若改名发布为 dsh-memo-plus,需同步改 package.json 与 cordis.patch.yml 中的 name。

运行环境:package.json 要求 node >= 22.5.0。

典型用法:走 HTTP API,不要手改磁盘文件

对 AI 或自动化脚本,唯一稳妥入口是 host 暴露的接口。不要直接编辑 notes/YYYY-MM/<ID>.md 再指望界面生效——需自拼 frontmatter、23 位大写十六进制 id,并调用 POST /memo/api/rebuild 重建索引,漏步会导致 SQLite 与事实源不一致。

写 # 标题 时井号后须有空格,否则可能被 stripTags 当成标签剥离。

动作 请求 说明
新建 POST /memo/api/create {body, tags?} 返回 {item, stats};正文内 #标签 会抽成标签并从正文去掉
修改 POST /memo/api/update {id, patch:{body?,tags?}} patch.tags 显式给出则完全替换;否则从正文增量合并
删除 POST /memo/api/remove {id, hard?} 默认软删(保留在 notes/ 且 git 可追)
查询 POST /memo/api/list {filter,q,tag,limit} filter ∈ all / todo / done / today / pinned
笔记本 同上,tags 含保留标签 笔记本 备忘区 UI 会自动排除这些条目

数据目录在 ~/.dsh/memo(SQLite、notes/*.md、附件、git),与代码路径无关;回滚 fork 不会丢备忘内容。README 中给出了 Windows 下从备份恢复上游 0.2.11 的 PowerShell 示例,可按同样思路还原 package.json 与 node_modules 后重启 DSH Web。

适用场景与注意

适合谁

  • 已在用 @adamcjm/dsh-memo,希望备忘正文按 Markdown 阅读、长条目不撑爆列表。
  • 经常在手机或窄屏 Web 上翻备忘,需要更多列表高度和可滚动的筛选/标签区。
  • 想把长文档放在同一 memo 数据体系里,用「笔记」tab 全屏读,而不是和单行待办混在一起。

使用前请自行确认

  • 插件以后台 DSH Web / profile 进程权限 运行,能读写 ~/.dsh/memo 与用户配置;安装前应阅读仓库源码与 MIT 许可证,确认符合你的安全策略。
  • 这是社区维护的 fork,SkillHub 目录与 DeepSeek / 幻方无官方从属关系;星标与曝光以目录页为准(资料抓取时为 0)。
  • 同步、GitHub、附件等行为继承上游;本 fork 主要改 client 体验与 marked 路由,升级上游时需留意是否仍适合直接覆盖。

结尾

dsh-memo-plus 不换一个插件 id,而是用 drop-in 方式把上游备忘改成「能读 Markdown、能收布局、能长按排序、能分区长文档」的日常面板。若你正在维护 DSH 个人 profile,可从目录页了解分类与链接,再到 GitHub 按 link 或覆盖方式替换 @adamcjm/dsh-memo 后重启验证。

  • 目录页:https://www.skillhub.cn/plugins/ymf2317-tech/dsh-memo-plus
  • GitHub:https://github.com/ymf2317-tech/dsh-memo-plus
羽毛球分组比赛记分
小程序二维码

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

小夜