dsh-scribe
Cross-session memory and a per-workspace knowledge base in one plugin. Memories are plain JSONL under ~/.dsh/memory by default; each session starts with the relevant ones already in the system prompt and writes one back when it ends. A read-only kb/ folder per workspace plus one global folder is sea
Install
dsh plugin --profile web add dsh-scribe
Sandbox test
This plugin has not been tested yet. Submit a test →
README
dsh-scribe
DSH 的「书记官」:跨会话记忆 + 本地知识库。数据默认只存在你这台机器上,云端同步是可选项,数据迁移必须你点头。
会话结束,它把这次定下的东西记下来;下次开会话,它替你翻出来;工作区里的文档,它顺手编成目录供检索。记什么、存在哪、发给谁,全部由你决定。
Cross-session memory for DeepSeek Harness — local-first by default, cloud optional, migration always user-approved.






它解决什么问题
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(行 iddsh-memory),现为dsh-scribe(行 iddsh-scribe)。
数据目录 ~/.dsh/memory 与记忆文件格式都没变,已有记忆不需要迁移;
但如果你之前装过旧名版本,请先remove_bundle掉旧的dsh-memory行再装新的,否则会挂载两次。
开发:本插件是纯 ESM、零运行时依赖,node --test 就能跑,不需要
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::3,最后更新 2026-10-28