dsh-zcode-workspace-memory:按工作区持久化的 Markdown 记忆

前言

在 DeepSeek Harness(DSH)里做长期协作时,模型往往只「记得」当前会话里的上下文。换会话、换天再开,项目约束、你的偏好、之前确认过的协作方式很容易丢。有人把要点写进仓库文档或随手笔记,但那不会自动进 system prompt,助手也不会在每轮结束后帮你整理。

下面介绍社区插件 dsh-zcode-workspace-memory(包名 dsh-workspace-memory):把 ZCode 的 Project / Workspace Memory 接到 DSH 上,在每个工作区落一份 Markdown 记忆目录,主会话开始时注入规则和索引,对话成功后还可后台自动提取补充;另提供只读页面浏览记忆。维护者为 moondrop12138。

这是什么

一句话:每个工作区一份持久 Markdown 记忆(MEMORY.md 索引 + 一事实一文件),注入主会话 system 段,并可在每轮成功对话后由后台发起额外模型请求做提取;子 Agent、只读会话等场景有明确边界(见下文「生效范围」)。

插件为 Host + Client 两半,纯 JavaScript、无构建步骤;记忆设计与提示词移植自 ZCode(Apache-2.0),本仓库第一方代码为 MIT。在 SkillHub 分类为「记忆」;GitHub 仓库见文末链接。

核心功能

持久记忆目录

记忆根目录为:

<workspaceRoot>/.dsh/memory/
  MEMORY.md              # 索引,无 frontmatter
  <fact-name>.md         # 一事实一文件

MEMORY.md 中一行一条指针,形如 - [Title](fact-name.md) — hook。事实文件带 YAML frontmatter 与 Markdown 正文,与 ZCode 一致。type 分为 user、feedback、project、reference 等;name 为小写 kebab-case(1–48 字符)。插件不会修改你的 .gitignore;若不想把个人记忆提交进仓库,可自行忽略:

echo '.dsh/memory' >> .gitignore

会话开始注入

主会话创建或恢复时,会把 ZCode 同源的 # Memory 使用规则与当前 MEMORY.md 索引注入 system prompt(每个 Agent 只读一次,会话中途不重读)。新写入或后台提取的记忆,要到下一个会话才会进入注入块。

模型主动写入

你对助手说「记住…」时,它按规则用宿主已有的 write / edit 工具写入记忆目录,并维护 MEMORY.md 指针。计划模式下写入会沿用宿主工具策略,可能被拦截(与 ZCode 允许写记忆的行为不同,属有意差异)。

后台自动提取(autoExtract)

每轮对话成功结束后(不阻塞主回复),插件可排队发起一次性模型请求,从本轮 user/assistant 文本中挑出值得长期记住的事实,写成事实文件并更新索引;也可按 JSON 中的 forget 删除文件与指针。默认开启,会产生额外 token 与费用;关闭后仍可只靠「记住…」手动维护。

提取会跳过:本轮模型已通过写工具写过记忆目录;或本轮没有「独立文本块且词数 ≥ 3」的用户发言(中文按 CJK 字符折半计词)。每轮最多 5 条事实;非法 JSON 或非正常结束则整轮放弃,不重试。提取请求不会写入会话日志,结论见宿主日志 %TEMP%\workspace-memory-host.log(每轮一行 extraction done / extraction skipped / extraction request failed)。

只读浏览

Client 半在左栏提供「工作区记忆」入口,整页列出有记忆的工作区与文件,以等宽原文查看,不渲染 Markdown;页面不提供编辑或删除。

生效范围

维度 行为
开关 enabled 为 profile 级;开启后该 profile 下所有工作区主会话生效
隔离 按工作区:session.header.cwd 为记忆根,工作区之间互不可见
落盘 惰性:只有开过主会话的工作区才会 best-effort 创建 .dsh/memory/
子 Agent session.header.origin === 'subagent' 时不注入、不提取
只读会话 规则段仍注入;不建目录、不提取;写记忆按沙箱被拒

与 ZCode 的主要差异之一:记忆放在工作区内 <cwd>/.dsh/memory/,便于 DSH 默认 workspace-write 沙箱下用原生工具维护,而不是 CLI 私有存储目录。

配置

在插件设置页或 cordis.patch.yml 中可改(字段以文档为准):

字段 默认 含义
enabled true 总开关:注入、建目录、后台提取、页面数据
autoExtract true 每轮成功后自动提取长期记忆
maxIndexChars 25000 注入的 MEMORY.md 字符上限(另有 200 行上限)
debugLog false 更细诊断写入 workspace-memory-host.log

安装与启用

从 GitHub 安装到指定 profile(命令来自仓库 README):

dsh plugin --profile <profile> add github:moondrop12138/dsh-zcode-workspace-memory

本地开发可用 plugin_manager 的 install_bundle,target 为插件目录绝对路径。Client 半改动刷新页面即可;Host 半改动需 remove_bundle 后重新 install_bundle。卸载示例:

dsh plugin --profile <profile> remove dsh-workspace-memory

仓库内自测:

cd dsh-zcode-workspace-memory && node --test

典型用法

  1. 安装并确认 profile 下 enabled 为 true;可选关闭 autoExtract 以节省额外模型调用。
  2. 在某一工作区打开主会话,确认 .dsh/memory/ 已创建(只读会话不会建目录)。
  3. 手动记忆:发送例如「记住:这个项目用 tabs」——需为独立用户文本且足够长度,才符合自动提取资格;手动写入不依赖提取。
  4. 查看:点左栏「工作区记忆」,浏览 MEMORY.md 与各事实文件原文。
  5. 排障:查看 %TEMP%\workspace-memory-host.log 中每轮提取结论;需要细节时打开 debugLog。

事实文件示例结构(摘自 README):

---
name: concise-memory-name
description: one-line recall description
metadata:
  node_type: memory
  type: project
  originSessionId: sess_…
---
One durable fact.

适用场景与注意

适合需要按仓库/工作区沉淀约束、偏好与决策、且希望主会话自动带上记忆索引的 DSH 用户。不适合指望子 Agent 或只读会话自动维护记忆的场景。

安装前请自行阅读 GitHub 源码 与 LICENSE / NOTICE.md:插件以当前 DSH 进程权限运行,后台提取会发起真实计费请求。已知限制包括:索引指针在文件被外部删除后可能悬空、提取不可回放进会话日志、UI 只读等(详见 README「已知限制」)。

SkillHub 上的插件目录由社区维护,与 DeepSeek / 幻方无官方从属关系;星标与版本以页面与仓库为准(当前 package 版本为 0.1.0)。

链接

经过上面的步骤,你可以在 DSH 里用工作区本地的 Markdown 记忆,衔接 ZCode 那套「索引 + 事实文件 + 注入 + 可选自动提取」的流程,而不必每次从零复述项目背景。

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

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

小夜