← 返回列表
未验证
你的助手不再问你那些它本应已经知道的事。
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/15 · 已提供中文文档
DeepSeek Harness 的跨会话用户画像记忆:记住你是谁以及你了解多少,让智能体以符合你水平的语言与你交流。经审批门控、可审计、本地 SQLite。
综合分
29.9
GitHub 分
29.9
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add KhalilYamber/yammory-system该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-attachment@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-session@deepseek-ai/dsh-settings@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-user-approval@deepseek-ai/schemastery用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
yammory_system
你的助手不再问你那些它本应已经知道的事。
它能跨会话记住你——你在每个主题上钻研得有多深、你希望别人怎么跟你说话、你已经敲定了什么——而且没有你的批准,任何写入都不会落地,所以关于你的一切都不会在你背后被悄悄存下来。
License
DSH plugin
Node
CI
Version
English · 简体中文 · Español · Português · हिन्दी
分发渠道:仅限 GitHub 渠道——没有 npm 包,也没有应用市场条目。
为什么会有这个项目
再能干的助手,也还是个患有失忆症的助手。每次会话它都从头开始:它不知道你已经理解了特征向量,却从未接触过张量网络;不知道你更愿意被纠正而不是被鼓励;也不知道你三周前已经决定不走那条路。于是你一次又一次地重新自我介绍,本可以从有趣之处开始的对话,却总是从零开始。
yammory_system 给 DeepSeek Harness 提供了一个保存这些知识的地方,以及一种无需猜测就能使用它们的方式。有三点让它区别于一座记忆仓库:
- 它在检索之前就决定该怎么说话。 一个七面画像携带了按领域划分的知识水平,因此助手在回答之前就知道你能接受什么样的词汇——注入发生在提示词组装阶段,而不是在检索步骤之后。
- 没有你,什么都写不进去。 每一条写入路径都被强制经过服务内部 DSH 自带的审批闸门。被拒绝的写入同样会留下证据;静默写入是这个插件无法达到的状态。
- 你可以核查它的工作。 模型看到的一切都有日志记录,存储就是一个普通的 SQLite 文件,你可以浏览、导出和审计,而整整一类错误是由设计而非纪律来防止的。
安装
1. install the bundle into your profile
dsh plugin --profile web add "github:KhalilYamber/yammory-system#main"
2. restart, then verify the row
dsh --profile web --dump-config | grep -A3 'id: yammory_system'
其他渠道与卸载:
- git 渠道(最新的 main):dsh plugin --profile web add git+https://github.com/KhalilYamber/yammory-system.git。
- tarball 渠道:在本仓库中执行 npm pack,然后运行 dsh plugin --profile web add ./yammory_system-.tgz。
- 卸载:dsh plugin --profile web remove yammory_system(记忆数据库和会话日志会保留)。
第一分钟
重启之后,无需配置任何东西,你就应该看到:
| 位置 | 内容 |
|---|---|
| 侧边栏底部 | 设置旁边的一个记忆条目(它用于切换抽屉;可通过 panel.enabled 隐藏它) |
| 会话标题栏 | 一个按会话生效的记忆开关——关闭后会停止该会话的注入、召回、写入和观察 |
| 侧边栏底部 → 该条目 | 抽屉:按轨道和层级展示的条目、搜索、警告行用量、近期审计、三个可观测性数字,以及一个整理整个库按钮,它只会排入一个标记 |
| DSH 设置 → yammory-system | 每一个配置字段,每个字段都带有一个问号,用通俗的话解释它 |
| /memory | list、query、stats、audit、session on|off、export / import ,以及更多 |
目录
- 为什么会有这个
- 安装
- 第一分钟
- 工作原理
- 能力
- 兼容性
- 配置
- 工具与界面
- MCP 服务器
- 权限与数据
- 安全边界
- 已知限制
- 它有何不同
- dsh-memory-protocol v1
- 我们从终端记忆中得到的经验
- 开发
- 主题
- 贡献者
- 上游
工作原理
yammory_system 是一个能力接缝,而不是又一个记忆仓库:一个带类型的 ctx.memory 服务、一个本地 SQLite 提供程序(node:sqlite、WAL、0600,位于 $DSH_HOME/dsh-memento/memory.db),以及它的消费者——memory 工具和一个注入到系统提示中的冻结快照。
两条轨道 × 两个层级 × 按智能体键:一条 user 轨道(关于用户的事实)和一条 agent 轨道(环境事实和约定),每条轨道都分为 user-global 和 workspace 层级,并按 agentPreset 隔离。快照在首次组装提示时按会话冻结一次,在会话中途永不改变。预热块承载说话约束和常驻画像,并以一行目录结尾(N more workspace / agent-track entries stay out of this block),这样模型就知道有东西可以用 memory_recall 获取——计数只有一行,内容保持按需获取。
能力
- 审批门禁无法被绕过。 每一条写入路径(add / replace / remove / seed)都被强制经过服务内部的审批瀑布,而不是在工具层。writePolicy: ask | auto | off 是模型不可见的配置;replace / remove / consolidate 会在审批负载中携带它们所更改条目的全文,而被拒绝的写入仍会留下一行 *-denied 审计记录。
- 模型可见 ⟺ 已记录。 注入的快照会原样落入 system/message;每一次写入都可以从 approval/asked + approval/decided + 插件自身的审计表重建。
- 有界且诚实。 软性的每轨道/每层警告线(默认用户 2000 / 代理 4000)。越过警告线绝不会阻止写入——它只是标记该层值得整合。绝不截断,绝不自动压缩。
- 按会话开关。 每个会话都有自己的记忆开关(插件自有的 SQLite 表,schema v6;默认开启)。关闭意味着注入停止(冻结的预热块立即被丢弃),召回被拒绝(SESSION_MEMORY_OFF),写入在与审批门相同的层被拒绝,观察通道既不扫描该会话,也不将其选为历史。管理读取(/memory list / budgets / audit / export)仍然可用。用 /memory session on|off 或头部开关切换;开关状态本身绝不进入会话日志,其审计行携带 text: null。
- 整理并度量。 由模型驱动的整理过程会将表达相同内容的条目合并为一个带 merged 标签的条目,并将旧条目降级为 superseded——保留在磁盘上,从每个会话的视图中移出,绝不删除。它绝不跨桶(track × scope × agentKey,外加工作区层上的 workspaceKey),也绝不自行启动:只读的 agent/turn-stopping 检查只会标记积压已越过界限(一行 tidy-due 审计行,外加下一个预热块末尾的一行)。/memory stats 也会在抽屉中报告三个可观测性数字(重复率、召回命中率、注入量);成功率被有意留空,因为此仓库没有信号源来判断“注入块是否真的落地”。面板的 整理整个库 按钮是一个队列,而不是一个动作:它在相同的审批策略后面写入一行标记(tidy_requests,schema v7),下一个会话的预热会要求模型运行全库整理,当一次整理写入落地时该标记变为 done——面板不会合并任何内容。
- 治理记忆:回滚一次降级,按切面仲裁冲突。 restore 以相反方向走一次降级(superseded → active,version 不变,重新回到每个会话的视图中),并且是脱离降级状态的唯一途径。arbitrate 解决一条事实携带两个来源的情况:它在一个切面上做出裁决,方向来自一张固定表——能力遵循观察,偏好遵循自我报告,其余五个切面保留两条条目,并为每条打上 gap 标签(间隙本身就是证据)。这张表就是方向,因此没有反向参数需要传入,而在一个组内,保留的是最近更新的那条条目。两个操作都经过与其他所有写入相同的审批门、相同的按会话开关和相同的桶规则,并且都留下审计轨迹:restore 按条目记录,arbitrate 按降级记录(text: null,仅 id),arbitrate-tag 按标签记录,以及一条收尾的 arbitrate 摘要,指明谁被保留、谁被降级以及原因。
兼容性
| 表面 | 状态 |
|---|---|
| Harness | DeepSeek Harness dsh-v0.1.5-rc.2(适配于 2026-09-09):会话信封保留其可忽略字段,仅用于存储日志的读取兼容性——Session.append 仍无法为其打戳,因此审计门行为不变。已于 2026-09-11 针对 dsh-v0.1.5-rc.2 主检出(完整门链 + profile 安装冒烟测试)验证。 |
| Node | ^22.19.0 || >=24.0.0 |
| 平台 | Windows / macOS / Linux(纯宿主;无原生代码,无网络) |
| 模型 | 任意 |
配置
所有可调项都是 Schemastery Config 字段(可从 cordis.yml 更改)。无效值会在加载时大声失败。在 yammory_system 行下覆盖。
设置面板。 当 DSH 设置服务挂载后,以下每个字段(enabled 除外)都可以从插件自己的 DSH 设置侧边栏中的 yammory-system 条目编辑(一个顶层分区,类似 General 或 Plugins);编辑会落到设置用户层(settings.yaml),无需编辑文件。几乎所有内容都实时生效(写入策略、语言、预算、限制、提案、面板、通过存储重开的 dbPath / auditRetentionDays、通过检索器替换的 retrieval.vector)——只有 snapshotOrder 需要重新加载 DSH。没有设置服务时,一切都会回退到组合的 cordis 配置,与之前完全一样。侧边栏记忆条目可以从同一页面隐藏(panel.enabled)。
| 键 | 默认值 | 含义 |
|---|---|---|
| enabled | true | 总开关;false 会移除服务、工具、快照、命令、面板和应答器(无法从设置页面编辑——被禁用的插件没有设置条目) |
| panel.enabled | true | 在侧边栏底部显示记忆条目;从设置页面保存 false 会立即隐藏它,无需重新加载(设置页面本身仍可访问) |
| dbPath | '' → $DSH_HOME/dsh-memento/memory.db | 绝对路径,或相对于 $DSH_HOME(在 Windows 上回退到 ~/.dsh) |
| budgets.user.userGlobal | 2000 | 用户轨道的用户全局层软警告线 |
| budgets.user.workspace | 2000 | 用户轨道的工作区层软警告线 |
| budgets.agent.userGlobal | 4000 | 代理轨道的用户全局层软警告线 |
| budgets.agent.workspace | 4000 | 代理轨道的工作区层软警告线 |
| writePolicy | 'ask' | 默认写入策略:ask / auto / off(模型不可见) |
| writePolicies | {} | 按轨道/作用域或按来源覆盖(例如 user/workspace、source:claude) |
| language | 'en' | 模型可见及命令输出语言:en / zh |
| snapshotOrder | -50 | 快照区段顺序(在 harness 身份之后、persona 之前) |
| maxEntriesPerQuery | 20 | 每次查询的默认结果上限(硬上限为 1000) |
| commandListLimit | 50 | 每次 /memory list / query 渲染的条目数 |
| commandAuditLimit | 10 | 每次 /memory audit 渲染的审计行数 |
| recall.historyLimitDefault | 8 | memory_recall 默认扫描的会话数 |
| recall.snippetCap | 5 | memory_recall 每个会话的片段数 |
| recall.snippetChars | 300 | memory_recall 片段字符数 |
| recall.windowDays | 30 | memory_recall 的近期时间窗口(天) |
| observe.days | 14 | memory_observe scan 的时间窗口(天)(硬上限为 90) |
| observe.sessions | 8 | 每次扫描采样的近期会话数(硬上限为 20) |
| observe.perSession | 12 | 每个会话采样的消息数,均匀分布,以便开头和后续修正都能保留(硬上限为 20) |
| observe.messageChars | 400 | 每条消息在截断并添加省略号前的字符上限(硬上限为 800) |
| observe.totalChars | 12000 | 整个切片的字符预算;扫描在此停止并报告未能覆盖的内容(硬上限为 30000) |
| recall.weighting.heat | 0.3 | 热度奖励上限(乘法;0 表示关闭)。热度 = 召回次数(饱和)× 自上次召回以来的半衰期衰减,因此记忆必须持续被召回才能保持热度 |
| recall.weighting.heatSaturation | 10 | 使热度奖励饱和的召回次数 |
| recall.weighting.heatHalfLifeDays | 14 | 热度半衰期(天)(一段时间未被召回的条目会变冷) |
| recall.weighting.freshness | 0.2 | 新鲜度奖励上限(乘法;0 表示关闭) |
| recall.weighting.freshnessHalfLifeDays | 30 | 新鲜度半衰期(天) |
| recall.weighting.tagDiscount | 0.5 | 当 token 仅匹配 tags 时的得分权重(正文匹配得分为 1) |
| retrieval.vector | false | 语义召回开关:true 仅在注册了真正语义化的嵌入提供方时才切换到向量召回——哈希/伪造提供方刻意不算数,因为它不建模任何含义,会悄无声息地把 CJK 召回率归零。否则保留零依赖的关键词检索器(CJK 二元分词、任意词元匹配、热度/新鲜度加权、相关性排序) |
| panelEntriesLimit | 200 | Web 面板条目分页大小 |
| panelAuditLimit | 20 | Web 面板默认审计行数 |
| auditRetentionDays | 0 | 审计保留期(0 = 永久保留) |
| proposals.enabled | true | 每次成功压缩后自动捕获一条记忆提案 |
| proposals.maxChars | 2000 | 提案字符上限 |
| proposals.maxPending | 8 | 待处理提案上限 |
工具与界面
| 界面 | 类型 | 说明 |
|---|---|---|
| memory | 工具 | add/replace/remove/consolidate/supersede/restore/arbitrate/query/tidy,附带 Save/Skip 指引;条目可携带画像坐标(facet = 七个切面之一,level = 各领域知识水平);supersede 将 1..20 条条目合并为一条带 merged 标签的条目,并将旧条目降级为 superseded(保留,绝不删除),restore 将降级的条目恢复,arbitrate 依据仲裁表确定的方向解决某一 facet 上的双源冲突,tidy 返回只读整理计划;写入需经过审批门 |
| memory_profile | 工具 | 基于 31 个子领域量表的各领域知识水平(set / list / get);set 需审批门并记录审计,tier 由 level 推导 |
| yammory-survey | 技能 | 用户发起的画像问卷,覆盖 24 个问卷合法子块;通过 memory + memory_profile 写入。来源:skills/yammory-survey/ |
| memory_recall | 工具 | 有界记忆匹配(查询分词:CJK 二元组、拉丁词原样;任意词元即可召回,按相关性排序)加上近期会话历史匹配 |
| memory_observe | 工具 | 观察通道:scan 读取用户自己过往消息的有界切片(只读、以 cwd 为范围、系统注入的伪消息被过滤并计数、预算不足会报告);commit 在一个需审批门的原子批次中写入 1..8 条有证据支持的条目,并带 source: observation |
| yammory-observe | 技能 | 用户发起的行为观察,通过 memory_observe 写入五个仅观察面(思维风格、困境中的品格、情绪模式、自我形象、决策风格)。来源:skills/yammory-observe/ |
| yammory-tidy | 技能 | 用户发起的记忆整理:读取只读计划,合并表达相同含义的内容,降级旧条目(保留,绝不删除),绝不跨桶。来源:skills/yammory-tidy/;判断规则见 references/merge-rules.md |
| /memory | 命令 | list · query · add · remove · consolidate · restore · arbitrate · tidy [--days=N] · stats · proposals · budgets · audit · export · import · adapters · observe [--days=N] · session [on|off] |
| 会话开关 | 会话头部 | 会话头部中的按会话记忆开关,紧跟在 agent-preset 标签之后(conversation.session.header.actions,会话作用域):显示当前状态,并通过 GET/POST /api/memento/session 切换(该路由与面板路由共用同一 connection.fetch 信任围栏) |
| Web 面板 | 客户端抽屉 | 对记忆内容只读:浏览条目、搜索、预算条、三个可观测性数字、审计尾部;一个用户操作按钮排队执行整个库的整理(仅标记);侧边栏条目可隐藏(panel.enabled) |
| 设置部分 | DSH 设置侧边栏 → yammory-system | 无需触碰文件即可编辑每个配置字段(enabled 除外);页面上标注了实时生效与需要重新加载的时机 |
MCP 服务器
yammory_system 附带一个只读的 stdio MCP 服务器(yammory_system-mcp),使外部 MCP 客户端(Claude、Codex 等)无需 harness 即可搜索记忆存储。它通过换行分隔的 JSON(NDJSON)进行 JSON-RPC 2.0 通信——每行一个 JSON 对象,不使用 Content-Length 分帧。
只读。 数据库以 node:sqlite 的 readOnly: true 打开(无迁移、无 WAL 写入、不增加召回计数);数据库缺失时返回空结果而非崩溃。
| 工具 | 用途 |
|---|---|
| memory_search | {query, limit?} → 排序后的条目(通过检索 Provider 接缝进行不区分大小写的子串匹配) |
| memory_stats | {} → {total, namespaces} 条目计数 + 按轨道/作用域的概览 |
直接运行:
node bin/mcp-server.mjs
or, through the GitHub channel: npx -y -p github:KhalilYamber/yammory-system yammory_system-mcp
数据库路径为 $DSH_MEMENTO_DB_PATH(绝对路径,或相对于 $DSH_HOME);默认为 $DSH_HOME/dsh-memento/memory.db。
Claude Desktop(claude_desktop_config.json)示例:
{
"mcpServers": {
"yammory_system": {
"command": "npx",
"args": ["-y", "-p", "github:KhalilYamber/yammory-system", "yammory_system-mcp"],
"env": {
"DSH_MEMENTO_DB_PATH": "/home/you/.dsh/dsh-memento/memory.db"
}
}
}
}
npx 在此通过 GitHub 渠道解析该包(此仓库不在 npm registry 上),因此 -p github:… 这一 spec 才是获取它的方式。
该服务器为只读:无网络、无写入、无审批门——仅搜索和统计。
权限与数据
- 权限:在其 workshop 清单中声明 harness:tool、filesystem:read、filesystem:write,以及 network:none / subprocess:none / shell:none / python:none / credentials:none。写入审批走官方审批接缝。
- 数据:本地 SQLite 数据库(0600),零网络,零凭据。
- 会话日志:审计完整性来自审批对(approval/asked + approval/decided)加上插件自身的审计表。
安全边界
- 仅限公共服务。 消费 tools、systemPrompt 和审批接缝;不修改引擎 / agent 循环 / apiproxy / 官方 UI。
- 零网络,零凭据。 本地数据库,POSIX 文件模式为 0600。
- 大声失败。 损坏的数据库、更新的 schema 或无效配置会在加载时失败;模糊的子串匹配会以结构化错误失败。越过警告线绝不会导致写入失败。
- 一个进程,一个存储。 多个会话共享同一个 SQLite 存储;两个进程共享同一个 $DSH_HOME 会写入同一个文件(在 SQLite 锁下为最后写入者胜出)。
已知限制
- 会话事件已声明,但尚未发出(rc.2)。 memory/added|updated|removed|recalled|snapshot 已合并声明,但 rc.2 没有用于仓库外事件类型的注册接口;一旦某个 harness 构建注册了它们,发出功能就会启用。
- ask 策略需要一个应答者。 在没有组合 UI/ACP 应答者的情况下,写入会失败关闭。
- 没有 FTS5 索引。 子串搜索基于不区分大小写的 instr 运行(对 CJK 正确)。
- 观察是一个白名单,而白名单有一个边缘。 memory_observe scan 只保留 source.kind 为 user 或 user-rpc 的 user/message 事件;在本机上测量,这会丢弃所有 user/message 事件的 48%(运行时上下文、AGENTS.md、技能目录、目标轮次、子代理通知)。然而,它无法将人工输入的消息与同样声明 kind: 'user' 的外部桥接消息区分开来——kind 是日志携带的唯一信号。将单条引用行视为弱证据;要求跨会话重复出现。
- 被称为“语义”的检索那一半还不是语义的。 retrieval.vector 只有在提供者声明自身为语义时才会启用,而这里附带的唯一提供者声明为 false,所以目前该开关按设计回退到关键词召回。启用真正的语义召回需要一个本仓库尚未选择的嵌入来源。
有何不同
| 插件 | 它是什么 | yammory_system 的不同之处 |
|---|---|---|
| dsh-mneme | 具有广泛功能面的自演化记忆 | 仅小语料画像:它通过以用户实测水平说话来竞争,而不是通过拓宽功能 |
| dsh-meow-memory | 具有 BM25 检索的七层存储 | 没有检索工程:一个按域级别表加上 facet 仲裁 |
| dsh-persona-memory | 将 persona 注入提示词 | 更深一层:在常驻画像之上有一个按域知识级别和facet 仲裁 |
| dsh-memory-evolve | 记忆仓库 / 演化循环 | 一个类型化服务接缝、审批门和会话日志审计;没有仓库野心 |
| dsh-mnemon | 记忆存储助手 | 协议 + 门 + 审计,而不是另一个存储 |
| dsh-kb-sieve | 知识库筛选 | 无检索工程:小语料子串搜索,通过 session_search/sessionQuery 实现跨会话召回 |
| dsh-tdai-memory | 任务驱动记忆工具 | 预算按轨道×层分配,并在服务中强制执行,而非尽力而为 |
| claude-bridge | Claude Code 桥接 | DSH 原生;未来的 seed(source:'claude') 路径让桥接向同一存储馈送 |
| dsh-external/Recall | 外部代理记忆 | 本地优先、零网络,依托 DSH 自身的审批接缝 |
| 官方 MCP 记忆示例 | DSH 所声明的“记忆 = 外部 MCP”立场 | 原生一方的补充:目标相同,无需外部服务器;两者共存 |
与当今领域相比,站得住脚的两点差异是上表中的最后一对:一个携带按领域知识水平的七面画像(它在任何检索发生之前就决定助手如何说话),以及面仲裁(它决定双源冲突如何解决——能力遵循观察,偏好遵循自我报告,其余五个面保留两者并为每个打上 gap 标签)。
名称是 yammory_system(从 GitHub 渠道安装;不在 npm 注册表上)。不是 dsh-recall(易与 dsh-external/Recall 混淆),也不是已删除的旧名称 dsh-memory。
dsh-memory-protocol v1
yammory_system 是 DSH 记忆协议的社区预演——一个官方 ctx.memory 接缝的候选形态。该协议将此插件的接缝规范化为跨插件契约:
- 条目规范——两条轨道 × 两个层 × 按代理键,加上短 tags(≤16 × ≤32 字符)以及每次 replace 都会递增的按条目 version。
- 写入语义——幂等的唯一子串条件写入;所见即所批的载荷(replace / remove / consolidate 携带它们所更改的全文)。
- 审计契约——每次写入均可从 approval/asked + approval/decided + 提供方账本重建。
- 警告行模型——软性按层警告行 / AMBIGUOUS_MATCH 语义。
- 模式版本化——带响亮版本检查的迁移规则。
- 规范——docs/protocol-v1.md(中文:protocol-v1.zh.md);规范性 JSON Schema 位于 docs/schemas/dsh-memory-protocol-v1.schema.json。
适配器注册表——ctx.memoryAdapters(register / list / adapt / export)让第三方记忆插件通过注册纯数据转换器来使用该协议(可逆的 register();导入依托审批门控的 seed,导出为只读)。入门:docs/adapters-guide.md(中文:adapters-guide.zh.md)。
| 内置适配器 | 外部格式 | 备注 |
|---|---|---|
| mem0 | mem0 事实集合({facts: [{memory, metadata?}]}) | metadata.category / metadata.tags 变为标签;原始 messages 数组会被拒绝——适配器只转换,绝不提取 |
| hermes-memory-md | Hermes memory.md(## section + 项目符号) | 章节名称变为标签;非项目符号的散文会显式报错 |
| claude-code-memory-md | CLAUDE.md 风格的 Markdown(标题、项目符号、段落) | 项目符号和段落变为条目;章节名称变为标签 |
一致性测试套件 — test/protocol-conformance/:一套可分发的用例集,任何声称兼容的提供方都可运行(node test/protocol-conformance/run.mjs --provider ./your-factory.mjs);本仓库的 CI 将其作为黄金参考,针对自身的提供方运行(npm run test:conformance)。
- 上游提案 — docs/upstream-proposal.md(中文:upstream-proposal.zh.md):为什么官方的 ctx.memory 接缝应当采用该协议、差异之处,以及迁移路径。
我们从终端记忆中学到了什么
yammory_system 不是 Claude Code、Codex 或 Hermes 的移植——但它的设计刻意吸收了各自做对的部分,并拒绝了那些有害的部分:
| 终端记忆 | 它做对了什么 | yammory_system 采纳了什么 |
|---|---|---|
| Claude Code — CLAUDE.md | 分层纯文本记忆文件(用户级 → 项目级),人类可读、可编辑,自动合并到每个会话中 | 纯文本条目;user-global / workspace 层按会话合并;一个可浏览、可 export、可审计的存储——将透明性作为一项特性 |
| Codex — AGENTS.md | 按目录作用域的指令自动发现并注入,对模型零摩擦 | 以会话 cwd 为键的 workspace 层(Windows 下大小写不敏感);会话启动时自动注入冻结快照 |
| Hermes — memory.md | 主动记忆保存,以及一条安全教训:仅在工具层强制执行的门禁可被后置工具注入绕过 | 带有 Save/Skip 指引的 memory 工具 + 需审批的自动捕获提案;门禁位于 ctx.memory 的写入方法内部,而非工具层 |
来源:Claude Code memory · Codex AGENTS.md · Hermes memory · Hermes #48181。
以及被刻意拒绝的部分:隐藏式自动摘要进入模型私有状态(此处的压缩摘要会变成待处理提案,等待人类批准/驳回)、仓库/向量存储的野心,以及任何缺乏人类可见审批或审计轨迹的写入。同样被采纳的还有:Hermes 记录的注意事项——两个进程共享同一个主目录会写入同一个记忆文件——参见安全边界。
开发
npm install # node ^22.19 || >=24
npm test # node --test: 365 tests
npm run lint # oxlint
npm run test:conformance # dsh-memory-protocol v1 一致性测试套件
npm run typecheck # tsc --checkJs 门禁
npm run check:coverage # 行覆盖率门禁
npm run check:readmes # 五语言 README 一致性门禁
npm run verify:self-contained # 拒绝仓库外的依赖规格
npm run verify:artifacts # 产物存在性 + 语法 + 导入
lib/ 零 DSH 依赖(仅使用 node: 内置模块);DSH 导入仅存在于 index.mjs 中。
主题
dsh、dsh-plugin、deepseek-harness、memory、agent-memory、approval、audit、sqlite、cordis、llm
贡献者
- @Niuniu-Sir — issue #1 中的启动崩溃报告,促成了 0.3.1 中发布的 ~/.dsh 回退方案。
上游
本项目是 dsh-memento 的分支,最初属于 PerryLink DSH 插件家族 的一部分。上游署名及 Apache-2.0 许可证均予以保留。
Apache License 2.0 © 2026 dsh-memento 贡献者同作者(KhalilYamber)的其他插件
扫码进群