让智能体按工作区存取记忆,跨会话不串味
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/9 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/OraSkyC/dsh-bundle-memory.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 40 处,展示前 28 条)
- 读取本地文件lib/index.js:46
const manifest = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')); - 读取本地文件lib/index.js:314
items = await readdir(dir, { withFileTypes: true }); - 读取本地文件lib/index.js:329
info = await stat(full); - 读取本地文件lib/index.js:335
parsed = parseMemory(await readFile(full, 'utf8')); - 写入本地文件lib/index.js:411
await mkdir(root, { recursive: true }); - 写入本地文件lib/index.js:412
await writeFile(path, text, 'utf8'); - 读取本地文件lib/index.js:449
const parsed = JSON.parse(await readFile(this.file, 'utf8')); - 写入本地文件lib/index.js:459
await mkdir(this.location.dir, { recursive: true }); - 写入本地文件lib/index.js:460
await writeFile(this.file, JSON.stringify(next, null, 2) + '\n', 'utf8'); - 读取本地文件lib/index.js:536
const existing = await stat(target).catch(() => undefined); - 写入本地文件lib/index.js:550
await mkdir(dir, { recursive: true }); - 写入本地文件lib/index.js:551
await writeFile(target, composeMemory({ - 删除本地文件lib/index.js:731
await rm(target, { force: true }); - 发起网络请求client.js:139
const response = await fetch(path, { headers: { accept: "application/json" }, cache: "no-store" }); - 发起网络请求client.js:144
const response = await fetch(path, { - 写入本地文件test-host.mjs:182
await mkdir(join(root, "项目约定"), { recursive: true }); - 写入本地文件test-host.mjs:183
await writeFile(join(root, "MEMORY.md"), "# 手工写的索引\n", "utf8"); - 写入本地文件test-host.mjs:184
await writeFile(join(root, "甲.md"), composeMemory({ title: "甲", tags: ["t1"], created: "2026-10-01T00:00:00Z", updated: "2026-10-02T00:00:00Z", body: - 写入本地文件test-host.mjs:185
await writeFile(join(root, "项目约定", "乙.md"), composeMemory({ title: "乙", tags: [], created: "2026-10-03T00:00:00Z", updated: "2026-10-03T00:00:00Z", bo - 写入本地文件test-host.mjs:186
await writeFile(join(root, "无头.md"), "没有 front matter 的记忆\n", "utf8"); - 写入本地文件test-host.mjs:187
await writeFile(join(root, "忽略.txt"), "不是 markdown\n", "utf8"); - 读取本地文件test-host.mjs:212
assert.ok(!(await readFile(out.path, "utf8")).includes("手工写的索引"), "重建应覆盖手工内容"); - 读取本地文件test-host.mjs:220
assert.equal(existsSync(join(root2, "MEMORY.md")), false, "autoIndex=false 不应写索引"); - 读取本地文件test-host.mjs:250
assert.ok(existsSync(r1.absolutePath)); - 读取本地文件test-host.mjs:255
const body1 = await readFile(r1.absolutePath, "utf8"); - 读取本地文件test-host.mjs:267
assert.ok(existsSync(r2.absolutePath)); - 读取本地文件test-host.mjs:275
assert.ok(existsSync(r3.absolutePath)); - 删除本地文件递归test-host.mjs:580
await rm(ROOT, { recursive: true, force: true });
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 按工作区存取记忆
- 自动生成索引文件
- 支持保存检索遗忘
DeepSeek Harness 的工作区本地记忆:由智能体管理的 ./memory/ 存储,自动生成 MEMORY.md 索引,按需创建子目录,配四个工具(save / recall / search / forget)。
README
由 DeepSeek 最新模型翻译生成记忆管理 · dsh-bundle-memory
一个 DeepSeek Harness(DSH)插件:给智能体一个跟着工作区走的记忆库。
开启后,记忆默认存在当前工作目录的 ./memory/ 下,根目录放一个自动维护的 MEMORY.md 索引;需要分类的按需建子目录,不需要分类的直接写在根目录。
English · 简体中文
它长什么样
<你的工作目录>/ └── memory/ ← 记忆根目录(可配置) ├── MEMORY.md ← 索引,插件自动生成 ├── 用户偏好用-pnpm.md ← 不需要分类的,直接写在根目录 ├── 部署注意事项.md └── 项目约定/ ← 需要分类的,按需建子目录 └── 提交信息用中文.md
memory_recall 不带参数时返回的就是索引:
记忆索引
本文件由 dsh-bundle-memory 自动生成,手工改动会在下次保存记忆时被覆盖。
展开完整文档(README 剩余 1 节)
记忆管理 · dsh-bundle-memory 一个 DeepSeek Harness(DSH)插件:给智能体一个跟着工作区走的记忆库。 开启后,记忆默认存在当前工作目录的 ./memory/ 下,根目录放一个自动维护的 MEMORY.md 索引;需要分类的按需建子目录,不需要分类的直接写在根目录。 English · 简体中文 它长什么样 <你的工作目录>/ └── memory/ ← 记忆根目录(可配置) ├── MEMORY.md ← 索引,插件自动生成 ├── 用户偏好用-pnpm.md ← 不需要分类的,直接写在根目录 ├── 部署注意事项.md └── 项目约定/ ← 需要分类的,按需建子目录 └── 提交信息用中文.md memory_recall 不带参数时返回的就是索引: 记忆索引 本文件由 dsh-bundle-memory 自动生成,手工改动会在下次保存记忆时被覆盖。 - 工作区:D:\OraSkyC\Project\Python - 记忆根目录:D:\OraSkyC\Project\Python\memory - 共 3 条记忆 未分类 - 用户偏好用 pnpm — 工具链, 偏好 · 2026-10-08 · 420 B - 部署注意事项 · 2026-10-08 · 1.1 KB 项目约定/ - 提交信息用中文 — 约定 · 2026-10-08 · 380 B 为什么是「跟着工作区走」 记忆的根目录是相对于会话的工作目录(exec.agent.session.header.cwd)算出来的,所以: - 在 A 项目里记的东西,在 B 项目里看不到 —— 不会串味; - 记忆跟着代码走,可以直接提交进版本库(如果你愿意),换台机器 clone 下来还在; - 想集中存也行,把 root 填成 notes/mem 之类即可(仍相对工作目录)。 这和「全局记忆」是两种取向:全局记忆省事但容易把项目细节混在一起,工作区记忆多花一点空间但边界清楚。这个插件选了后者。 四个工具 | 工具 | 作用 | | memory_save | 存一条记忆。给 title + content;category 可选(项目约定 或 people/work,最多 3 级)—— 省略即直接写在根目录。同名默认报错而不是静默覆盖,要覆盖得显式传 overwrite: true。 | | memory_recall | 不带参数 → 返回索引(先看它);带 name → 读某一条。name 可以是相对路径(项目约定/提交信息用中文.md),也可以是唯一后缀(提交信息用中文);匹配到多条会报错并列出候选,不猜。 | | memory_search | 跨全部记忆做全文检索(标题、标签、正文,大小写不敏感),返回匹配路径与命中处的摘录。记得有这件事但忘了在哪时用它。 | | memory_forget | 删一条记忆。只接受单个 .md 文件,永远不会删目录,也不会碰 ./memory/ 之外的任何东西。 | 安装 设置 → 插件 → 添加插件,填入: https://github.com/OraSkyC/dsh-bundle-memory 或命令行: dsh plugin --profile desktop add https://github.com/OraSkyC/dsh-bundle-memory 装完重启 DSH。 设置 设置 → 插件 → 记忆管理。改动立即生效,不用重启。 配置分两层:cordis.patch.yml 写部署默认值(改完需重启),用户覆盖落到 %USERPROFILE%\.dsh\state\dsh-bundle-memory\settings.json 的稀疏覆盖层,点「恢复默认」是删除那个键、回落部署默认值。 | 键 | 默认 | 说明 | | enabled | true | 关闭后不注册任何记忆工具,面板仍可打开。 | | root | memory | 记忆根目录,相对于会话工作目录,最多 3 级。 | | indexFile | MEMORY.md | 索引文件名,位于记忆根目录下。 | | autoIndex | true | 每次保存/删除后自动重建索引。 | | maxEntryBytes | 262144 | 单条记忆正文上限(1024–4194304 字节),防止一次把大文件塞进一条记忆。 | | searchMaxResults | 20 | memory_search 默认返回条数(1–100)。 | 设计要点 索引是「投影」,不是「账本」 MEMORY.md 每次都由磁盘上的记忆文件重新生成(扫描目录 → 读每个文件的 front matter → 按分类分组渲染)。因此不存在「索引和实际内容不一致」这种状态 —— 那是最容易腐坏的东西。 代价是:手工往 MEMORY.md 里加的内容会在下次重建时消失。文件头写明了这点。 想加记忆就放一个 .md 文件进目录(插件会把它纳入索引),或者用 memory_save。 每条记忆的格式 title: 用户偏好用 pnpm tags: 工具链, 偏好 created: 2026-10-08T08:31:24.000Z updated: 2026-10-08T08:31:24.000Z 不要在文档里写 npm。 刻意不引入 YAML 解析器:格式只有 key: value 行,手写解析更可预测,而且遇到用户手改坏的行只会忽略、不会抛错。没有 front matter 的文件也照收,标题回落到文件名。 写入路径的防护 这是整个插件最需要小心的地方 —— 智能体给的 name / category 最终会变成文件路径。 一共四层: 1. 片段校验(safeSegment):拒绝 ..、.、绝对路径、路径分隔符、 Windows 非法字符(\ / : * ? " < > |)、控制字符、系统保留名(CON/NUL/COM1…)、以点或空格结尾、超过 64 字符。 2. 层级限制:category 与 root 最多 3 级。 3. 拼完再验一次(resolveInside):用 relative() 检查结果是否仍在记忆根目录内,以 .. 开头就拒绝。即使前面被绕过,这一层也会挡住。 4. 删除只接受 .md 文件:memory_forget 永远删不掉目录,也删不掉索引本身。 四层都有测试覆盖,包括各种嵌套 .. 的穿越尝试。 「当前工作目录」从哪来 const cwd = exec.agent.session.header.cwd ?? process.cwd(); 工具的第二个参数 exec 里带着 agent,agent 带着 session,session 的 header 里有 cwd。 不能用 process.cwd() —— 那是 DSH 自己的安装目录,不是你的工作区。 要求 | 项目 | 要求 | | DSH | web 或任何带 Host tools 服务的 profile | | Node | >= 22.19.0 | | npm 依赖 | 无(只用 node: 内建模块) | | 构建步骤 | 无 | 插件依赖 Host 的 tools 与 webServer 两个服务(inject = ['tools', 'webServer'])。webServer 是硬依赖: Cordis 的 ctx 是受限代理,读一个没声明在 inject 里的属性会抛错而不是返回 undefined,漏声明会让整个 apply() 失败、插件在插件页显示「异常」。 常见问题 记忆会进版本库吗 ./memory/ 就在工作目录里,取决于你的 .gitignore。想让它跟着代码走就别忽略;不想就加一行 memory/。 为什么智能体不自己想起来用 这个版本没有把索引自动注入上下文 —— 智能体需要主动调 memory_recall 或 memory_search。建议在项目的 AGENTS.md 里写一句「开工前先 memory_recall 看索引」。 自动注入是可行的后续方向,但需要构造会话消息并插进消息流,风险更高,单独做。 索引被我不小心改坏了 删掉 memory/MEMORY.md,下次任何一次保存/删除都会重建它;或者直接调一次 memory_recall(不带参数)触发重建。 能不能存二进制 / 附件 不能。这是纯 Markdown 记忆库,只认 .md。别的东西放工作区别的地方。 目录结构 dsh-bundle-memory/ ├── package.json # 清单:dsh.bundle.patch / dsh.client / files ├── cordis.patch.yml # 注册 entry(id: memory)+ 部署默认配置 ├── lib/index.js # 配置契约、路径安全、索引生成、四个工具、面板路由 ├── client.js # 浏览器半侧:插件页里的设置卡 ├── icon.svg ├── locale/zh.json # meta.title / meta.description ├── locale/en.json ├── README.md # 本文件 ├── README.en.md # 英文版 ├── CHANGELOG.md ├── LICENSE ├── test-host.mjs # 宿主侧:59 项断言组 └── test-client.mjs # 浏览器侧:24 项断言组 开发 npm run check # 语法检查 npm test # 宿主 59 项 + 客户端 24 项断言组 宿主测试用真实临时目录,覆盖配置归一化、四层路径防护、front matter 往返、索引生成、四个工具的全部行为、工作区隔离、面板路由。 客户端测试覆盖注册路径、组件渲染,以及两条「界面不会报错」的回归: 字段标签必须可见、用到的 CSS 变量必须真实存在。 许可证 MIT
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
OraSkyC/dsh-bundle-memory
让智能体按工作区存取记忆,跨会话不串味
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 21,780未汉化DSH
73.5
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 1,947已汉化MCP
72.7
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,347已汉化DSH
71.9
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13917 个插件含 PR 收录与…
★ 343已汉化DSH
71.6