dsh-scriptorium: Assign a notebook to every Harness project in the DSH Web GUI

前言

用 DSH(DeepSeek Harness,主张「一切皆插件」)跑一段时间智能体之后,常见的一个问题是:项目里散落的判断、截图、读了一半的文档,没有明确的存放位置。它们可能出现在对话记录里,也可能出现在临时目录里,过几周就找不到了。已有做法大体是另外起一个笔记工具,然后在 Agent 和笔记之间手动搬运。

下面介绍的 santera-pixel/dsh-scriptorium 走的是另一条路:它把一个项目笔记本直接放进 DSH Web GUI 的侧边栏(书籍图标,名为 Scriptorium),笔记、附件、看板和关系图都在同一个面板里。

这是什么

一句话定位:Scriptorium 是 DSH Web GUI 里的项目知识库,把工作区绑定到 Harness 项目,提供嵌套文档、带实时预览的 Markdown 编辑器、全文搜索、命令面板、看板、自由排版的媒体画布、Obsidian 风格的思维导图,全部存储在该插件自己拥有的一个 JSON 文件里。

  • 维护者:santera-pixel
  • 许可证:MIT(见 package.json 与仓库徽章)
  • 版本:1.0.1(见 package.json)
  • 分类:记忆(社区目录按此归类)
  • 运行要求:Node.js >= 22(见 package.json engines)

它解决的问题是:笔记和项目一一对应,编辑器和附件不再分离,做完的事能通过状态和看板体现,而不用靠回忆。

功能一览

以下按 README 的「What you get」整理,只挑与日常使用关系直接的部分。

  1. 组织。工作区 → 文件夹 → 嵌套文档,可以把文档拖到文件夹上,支持就地重命名和重新排序。
  2. 项目映射。每个笔记本对应一个 Harness 项目,来源是 <DSH_HOME>/storages/workspace.json(与 Harness 工作区切换器用的是同一个文件)。侧边栏列出每个项目及其路径,同步时会创建或重命名笔记本;项目消失时标记为 missing,其文档保留;未关联的笔记本可以重新关联,或合并进已有的项目笔记本。
  3. 写作。Markdown 编辑器支持标题、加粗、斜体、删除线、行内代码、链接、图片、表格、任务列表、::: note/tip/warning/danger 提示块、带复制按钮的围栏代码块、$math$ 和分隔线。
  4. 预览。写作、分屏、纯预览三种模式,任务复选框会同步改动源码行,滚动同步。
  5. 查找。Ctrl+K 命令面板(模糊匹配、按最近使用排序)和全文搜索(标题与正文高亮、按相关性排序)。
  6. 追踪。看板有 Draft / Active / Done 三列,直接来自每篇笔记的状态;拖动卡片即改写磁盘上的状态。
  7. 分类。每篇文档都可以打标签,有标签云筛选、按标签生成的配色和按标签的视图。
  8. 收纳。收藏夹,软删除回收站(可恢复、可永久清除、可清空)。
  9. 附件。每个文档可以上传图片、PDF、音频、视频和文本文件;有应用内预览弹窗(PDF 走浏览器查看器);媒体沙箱视图按类型筛选。
  10. 画布。自由排版的媒体画布:每个附件变成一张可拖拽、可调大小的卡片,放在所属文档旁边,用边线连接;支持平移、滚轮或按钮缩放、适应屏幕、连接两张卡片、键盘微调、删除连线。
  11. 关联。Obsidian 风格的思维导图:笔记是节点,[[wiki links]](支持 |alias 和 #heading)和可选标签是边;力导向动画布局,可拖拽节点、平移缩放、搜索时其余淡出、高亮邻居、点击打开导航;「连接两篇笔记」会把链接写进源笔记。
  12. 可移植。导出 JSON,导出 ZIP(manifest + Markdown 笔记 + 媒体字节),导入 JSON(合并,不覆盖),导入 ZIP(重映射 id、存储媒体);导入导出时画布一并迁移,并重新指向导入后的 id。

键盘快捷键:Ctrl+K 命令面板,Ctrl+N 新建文档,Ctrl+S 保存,Ctrl+B/Ctrl+I 加粗/斜体,Esc 关闭浮层。光标在输入框内时快捷键不会抢焦点。

数据落在哪

这部分值得先看清楚,因为它直接决定备份和迁移方式。以下路径来自 README 的 Storage 一节。

文档数据写在 <DSH_HOME>/scriptorium/data.json。写入采用临时文件加原子重命名,只有一个串行化队列和一个修订计数器;超大或格式错误的快照会以 400 拒绝。附件写在 <DSH_HOME>/scriptorium/media/<id>,旁边还有一个 <id>.json 旁车文件记录名称、MIME 类型和大小。画布与图谱的版面单独存一份在 <DSH_HOME>/scriptorium/layout.json,只含 canvas 和 graph,每次保存都先写它再写 data.json。DSH_HOME 默认是 ~/.dsh。

项目列表是只读的:宿主读取 <DSH_HOME>/storages/workspace.json 并返回 { projects, defaultProjectId, directory, source, exists },笔记本名称和路径来自 global.workspaceIds 顺序加上 tables.workspaces 元数据。文件缺失时得到空列表,格式损坏时得到空列表加一条警告,GET /projects 不会改动 data.json。

保存前的校验是逐字段的:工作区 id 唯一,每个节点都属于存在的工作区,父链可解析且不跨工作区、无环,标签是非空字符串,附件 id 唯一且可解析,画布卡片指向存活的节点或附件并使用规范 id,画布连线连接的是已存在的卡片,图谱偏好是那三个已知布尔值。出错时错误信息会指出具体路径(例如 nodes[12].media[0].id),校验失败时不写任何内容。比当前构建的 STORE_VERSION 新的快照会被拒绝并给出明确提示,更老版本的快照先按顺序执行迁移;未知的顶级区块会原样保留。

这些都意味着:直接编辑或替换 JSON 是可行的应急手段,但应当尽量通过编辑器保存,以保持一致性。

安装与启用

只说有出处的部分。package.json 里 description 写明本项目「Installs through the official DSH plugin system」,exports 里包含 .(lib/index.js)、./client(lib/client.js)和 ./cordis.patch.yml。dsh 字段声明了 bundle patch(cordis.patch.yml)和客户端注入(注入 slots,平台 web)。

README 没有给出安装命令,社区目录站点我打开后只返回了站点框架,没有可见的条目正文,因此我不在此拼接 dsh plugin add 形式的命令。正确做法是打开下面的目录页或仓库 README,按其给出的安装方式执行。

安装前值得先做两件事:读一遍发行物(files 里是 lib/**/*.js、src、cordis.patch.yml、README.md、LICENSE),以及确认许可证(MIT)符合你的使用场景。

典型用法

下面三个场景取自 README 的「In practice」,保留原文写法,未作延伸。

设计评审:把三张截图拖进笔记,在画布上把它们排在评审要点旁边,连上线,思维导图就会显示哪些笔记引用了哪些笔记。

发布:每篇笔记都带状态,所以看板就是计划——拖一张卡片,对应笔记的状态就落盘了。

一个月后:用 Ctrl+K 或搜索找到那篇笔记,思维导图显示它的邻居,附件仍然待在它所解释的那段文字旁边。

适用场景与注意

适合这样一类人:已经在 DSH 里长期跑项目,希望笔记就地存在项目旁边、不额外维护一套系统的人。对于只需要临时记几笔、不想把笔记库绑到 dsh 数据目录上的场景,它的收益不明显。

注意三点。第一,插件以当前 dsh 进程的权限运行,数据位置由插件决定(<DSH_HOME>/scriptorium/),备份和迁移要按这个路径来。第二,它会读 storages/workspace.json,项目名与其保持同步;改名或删除项目时笔记本不会被删除——消失的项目标为 missing,文档仍在。第三,它带一个 cordis.patch.yml 补丁,README 里说明了 pre-canvas 构建的降级行为(重建 data.json 并重新合并版面),打算降级时可以先读这一条。

另外必须说明:SkillHub 是独立的社区站点,与 DeepSeek / 幻方无官方从属关系,Scriptorium 也不是官方出品的插件。

相关链接

  • 社区目录页:https://www.skillhub.cn/plugins/santera-pixel/dsh-scriptorium
  • 仓库:https://github.com/santera-pixel/dsh-scriptorium

结论:如果你在 DSH 里维护长期项目,这个插件把笔记、附件、状态和关联四件事收敛进一个 JSON 目录,代价是多一个需要备份的数据位置和一层校验规则。是否采用,取决于你对这些取舍的看法。

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

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

Xiaoye