中文EN

dsh-scribe

memorynpmMIT

跨会话记忆与工作区知识库合一。记忆默认是 ~/.dsh/memory 下的纯 JSONL,会话开始把相关记忆放进系统提示,会话结束回写一条;每个工作区的 kb/ 目录加一份全局目录构成只读知识库,检索结果能引用到文件行号。十一个工具统一带 scribe_ 前缀(七个 scribe_memory_*、四个 scribe_kb_*),一个 /scribe 斜杠命令,以及概览 / 记忆 / 知识库 / 迁移四页的设置页。云端后端(百炼记忆库、ChromaDB、云端主 + 本地镜像)按需启用;迁移数据必须经显式审批,并留有可回滚的日志。

下载量 / Downloads
687

安装

dsh plugin --profile web add dsh-scribe

沙箱测试

这个插件还没测过。提交测试 →

README

dsh-scribe

DSH 的「书记官」:跨会话记忆 + 本地知识库。数据默认只存在你这台机器上,云端同步是可选项,数据迁移必须你点头。

会话结束,它把这次定下的东西记下来;下次开会话,它替你翻出来;工作区里的文档,它顺手编成目录供检索。记什么、存在哪、发给谁,全部由你决定。

Cross-session memory for DeepSeek Harness — local-first by default, cloud optional, migration always user-approved.

![license](LICENSE)

![version](package.json)

![npm](https://www.npmjs.com/package/dsh-scribe)

![test](https://github.com/zcd0818/dsh-scribe/actions/workflows/test.yml)

![node](package.json)

![deps](package.json)


它解决什么问题

AI 编程助手没有记忆:每个新会话都从零开始,你昨天定下的架构决策、踩过的坑、约定的代码规范,今天要重新讲一遍。

把记忆放在云端能解决这个问题,但代价是你的对话内容会离开这台机器——包括密钥路径、客户名、内部接口。很多托管方案还是默认开启的,你不一定意识到它在传。

这个插件的立场很简单:

  • 默认不联网。 记忆是 ~/.dsh/memory/memories.jsonl 里的纯文本,零依赖、零服务端,拔网线也能用。
  • 出网是你决定的。 只有你配置了云端后端或嵌入端点,数据才会离开本机;每个出网动作都在下面「数据流向」里写清楚了。
  • 迁移不自动。 换存储后端不会偷偷搬数据,必须你在审批框里点同意,而且可回滚。

它做什么

时机 · 行为 · 预算

会话开始(agent/created) · 检索同项目 + 最近的记忆,注入 system prompt 的 memory:context section · 5 条 / ≤1200 字符

会话进行中 · 模型按需调用 scribe_memory_search / scribe_memory_save / scribe_memory_list / scribe_memory_forget · 按需

会话结束(agent/disposed) · 把这次会话压成一条记忆写回 · 1 条

知识库(可选) · 索引工作区 kb/ 与全局资料(文本、代码、Word/Excel/PPT);会话开始注入目录摘要,模型按需 scribe_kb_search / scribe_kb_read · 目录摘要 ≤1100 字符

你想换后端 · scribe_memory_migrate → 审批 → 写日志 → scribe_memory_migrate_rollback · 一次

会话结束时的压缩是有区分的:少于 10 轮的对话直接保留最后几段原文(便宜、不丢细节);更长的对话交给会话本来就在用的模型,压成「项目在做什么、定了什么、为什么、还欠什么」的一段话。

注入量与会话长度无关,不会越用越贵。

30 秒看它长什么样

它没有自己的界面,记忆就是磁盘上的纯文本:

$ cat ~/.dsh/memory/memories.jsonl
{"id":"mem_mvqil36h_7c9ac9b6","content":"决定:默认本地 JSONL 存储,会话开始注入 5 条记忆到 system prompt,迁移必须经审批","createdAt":1793095200089,"source":"session-summary","tags":["project:dsh-memory","decision"],"schemaVersion":1}

查询和状态走斜杠命令或模型工具:

> /scribe status
后端: local (local)
记忆条数: 1
可用性: 正常
嵌入: lexical fallback
自动注入: 开启
时间范围: 2026-10-27 至 2026-10-27
数据目录: /Users/you/.dsh/memory

模型在会话里也能自己翻:

scribe_memory_search("上次部署脚本怎么写的")
→ 1. [2026-10-25] (project:infra) 部署走 deploy.sh,先用 staging 验证再 promote…

左侧菜单栏入口(可选)

设置 → 记忆与知识库 → 概览里有一个开关:在主页左侧菜单栏显示「记忆与知识库」。

  • 打开后,左下角菜单会多一行入口,点开是一个独立页面(和「插件」「任务看板」同级,容器、高亮、折叠都由外壳提供);
  • 关掉只是隐藏入口,记忆和知识库照常工作;
  • 改完立即生效,不用重启 —— 同一个模块同时持有入口和页面,开关是就地挂载/卸载。

知识库:资料是资料,记忆是记忆

两件事分开存,因为它们的真相来源不同:

· 记忆 · 知识库

谁写入 · 插件自动(会话结束) · 你自己维护的文档,插件只读

形态 · 一段结论 · 按标题切块,带原文行号

回答什么 · 「上次定了什么」 · 「这条规则原文在哪」

同步 · 插件自己的后端 · Git —— 文档本来就该进版本控制

两个作用域,工作区优先:

  • 工作区:当前项目目录下的 kb/(默认 kb,可改)。沿用你在 AGENTS.md 里定的约定:INDEX.md 一行一条、排除 原始/ 和 inbox/、引用写成 kb/路径.md#L行号。
  • 全局:~/.dsh/memory/kb/global/,跨项目共享的资料。往目录里放 .md 就会进索引。

两处目录都能换:

  • 工作区行上的「更换目录」→ 选一个文件夹,只对那一个工作区生效(写进 knowledgeBase.workspace.overrides),可「恢复默认」;
  • 全局卡片的「更换目录」→ 写进 knowledgeBase.global.root。

上传文件:知识库分页顶部是一块拖拽投放区(也可以点击选择文件),先选目标(全局或某个工作区),再把文件拖进去或点选。文件写进目录后会立刻重建索引。

二进制文档会抽正文:.docx .xlsx .pptx 是 Office Open XML(一个装满 XML 的 ZIP),插件用内置解析器读出正文再切块索引——零依赖、跨平台,不需要你机器上装 Word、LibreOffice 或任何命令行工具。.pdf 是唯一真正需要解析器的格式,作为可选依赖 pdfjs-dist 处理:装了就用,没装就跳过并给出原因(不会偷偷索引空内容)。

直接索引的类型:.md .markdown .mdx .txt .rst .csv .tsv .json .jsonl .yaml .yml .toml .ini .conf .sql .html .css .js .mjs .ts .tsx .jsx .vue .py .go .rs .java .kt .rb .php .sh;需要抽正文的类型:.docx .xlsx .pptx(内置)、.pdf(可选依赖)。默认排除 原始/、inbox/、node_modules/、dist/、build/ 以及各语言锁文件。

文件名会去掉路径部分,../ 这类穿越会被削成纯文件名,且落点一定在该知识库目录内。

会话开始时注入的是目录摘要(优先读 INDEX.md,没有就退回文件列表),不是全文;模型需要细节时用 scribe_kb_search,拿到 kb/设计规范.md#L12-L40 这样的引用后,用 scribe_kb_read 读原文行号再引用。

索引是派生数据,放在 ~/.dsh/memory/kb/indexes/,不会改你的文档;过期自动重建(默认 TTL 300 秒),也可以在设置页「知识库」分页手动重建。

只用 Markdown / 纯文本就能工作,不需要任何额外服务。Word / Excel / PowerPoint 的正文抽取也是内置的;只有 PDF 需要可选依赖 pdfjs-dist。

数据默认留在本机

这是本插件与其他记忆方案的核心差别。默认配置下,没有任何数据离开这台机器——下面是完整的出网清单,没有隐藏项:

动作 · 出网? · 发到哪里

保存记忆(默认 local) · ❌ 否 · 仅 ~/.dsh/memory/memories.jsonl

会话开始注入 · ❌ 否 · 从本地文件读

scribe_memory_search(未配嵌入端点) · ❌ 否 · 本机词法打分

scribe_memory_search(配了 embedding.endpoint) · ⚠️ 是 · 只发送待检索的记忆文本,到你自己填的 /v1/embeddings 地址

检索重排(默认开) · ⚠️ 是 · 只把查询 + 候选记忆摘要发给当前会话模型,8 秒超时,失败退回原序

长对话摘要(默认开) · ⚠️ 是 · 把对话发给当前会话模型(本来就在用它,没有新增接收方)

迁移到 bailian · ⚠️ 是 · 把选中的记忆发到阿里云百炼记忆库

ChromaDB 引擎 · ⚠️ 是 · 发到你自建的 Chroma 服务地址

想彻底离线:把 retrieval.llmRerank 和 summarization.shortTurns 调成「不触发模型」,并不要配 embedding.endpoint。

安装

三种方式,任选其一。装完返回 application: applied 即生效(改的是 Host 行为,不用重启页面),

卸载用 plugin_manager · action: remove_bundle · target: dsh-scribe。

1) 从 GitHub 直接装(现在就能用;已实测装出来是 dsh-scribe@1.0.0):

plugin_manager · action: install_bundle · target: github:zcd0818/dsh-scribe#v1.0.0

#v1.0.0 是可选的 ref:写 tag 或 commit 便于复现,省略则取默认分支的最新提交。

这条路径需要能访问 github.com——装之前 DSH 会先 git ls-remote 探一次,网络不通会直接报

spec-host 失败,正是你现在的代理要放行的那一步。

2) 从 npm(已发布:<https://www.npmjs.com/package/dsh-scribe>):

plugin_manager · action: install_bundle · target: dsh-scribe@1.0.0

npm i dsh-scribe 也能装,装出来的目录结构与 GitHub 那条路径一致(35 个文件,含 cordis.patch.yml)。

3) 本机已有 checkout(开发用,改完即生效):

plugin_manager · action: install_bundle · target: /绝对路径/dsh-scribe
三种方式是同一个包名 dsh-scribe,所以后装的会替换先装的:从 GitHub/npm 装过之后再想要「改完即生效」,
得重新装一次第 3 种。
改名说明:本插件原名 dsh-memory-plugin(行 id dsh-memory),现为 dsh-scribe(行 id dsh-scribe)。
数据目录 ~/.dsh/memory 与记忆文件格式都没变,已有记忆不需要迁移;
但如果你之前装过旧名版本,请先 remove_bundle 掉旧的 dsh-memory 行再装新的,否则会挂载两次。

开发:本插件是纯 ESM、零运行时依赖,node --test 就能跑,不需要

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:3,最后更新 2026-10-28

链接

GitHub · Homepage · npm

同类插件