# dsh-behuman [English](README.md) | 中文 给 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 加**长期记忆**和**自进化技能**的插件。 **名字就是目标——让 dsh 像人一样了解你。** 跟你共事一个月的人,会知道你在乎什么、喜欢怎么被告诉事情、哪些做法你已经否定过了, 也不会在同一个坑里摔第二次。 ## 它解决什么问题 **每次开新会话,AI 都从零开始。** 你告诉过它项目用的是 PostgreSQL,下次它又问一遍;你纠正过它解释问题的方式,下次它还是老样子。 **同一个坑反复踩。** 上次那个东西你折腾了三回才跑通,这次还得再折腾三回——因为没有任何东西记得你当时是怎么绕过去的。 ## 它做什么 - **记住你。** 你的偏好、你纠正过的事、你项目的状态——跨会话带着走。 - **自己变强。** 跑通过的做法会被写成技能,下次遇到同类任务,开局就已经会了。 - **不需要你操作。** 不用敲命令、不用管理记忆。装上就开始工作。 ## 它是怎么工作的 ### 两条路径在写 **主路径:AI 边聊边写。** 它本来就在对话现场,顺手就能记——关于你的事实、你的一次纠正、刚刚跑通的一套做法。 **兜底路径:没写上的,回头补。** 模型会忘,而且不是偶尔忘——**是稳定地忘**。所以当工具调用攒了一堆却什么都没写的时候,会另起一个后台复审,把那段对话重看一遍,报告漏掉了什么。代价是一次小模型调用,而且**只在主路径安静下来时**才发生。 **两条路径走的是同一道闸门**——同样的校验、同样的查重、同样的文件名规则。**自动那条没有后门。** ### 整体流程 ``` 写入 ├─ 主路径:边聊边写 └─ 兜底复审:补上漏的 │ ▼ 两条路径走同一道闸门 存储 ├─ memories/ 一条事实一个 .md 文件 └─ skills/ 一类任务一个 SKILL.md │ ▼ 取用 └─ 目录常驻在提示词里。它看中哪一行,自己去翻那个文件 ``` **它不做"检索"。** 没有搜索步骤,也不会拿你的话去查库——**目录本来就在上下文里**,翻不翻某个文件是它自己的判断。所以"想起来"这件事不额外花时间。 **但目录不是免费的,而且它会变长。** 每条记忆一行,**每一轮都在 AI 眼前**。几十条的时候这点开销不算什么;到了几百条,就是实打实的钱了。**这是这套设计已知的天花板**——越过它的办法是从这些 Markdown 文件生成一个可搜索的索引,**而不是拿数据库把它们换掉**。 ### 关于它怎么判断,三点值得知道 - **只写真正跑通的。** 没解决的问题里提炼出来的"方法",其实是披着方法外衣的死胡同。所以要等任务做完、错误修好、流程真的走通了,才会记下来。 - **同一件事说两遍 = 加强,不是重复。** 近似的记忆会**更新原来那条**,而不是再加一条——重复出现本身就是它重要的证据。 - **不会背着你藏东西。** 记忆就是普通的 Markdown 文件,你随时能打开、能读、能改、能删。 ## 安装 `dsh` 每次跑的是**一个 profile**——一套命名好的插件搭配和配置,启动的时候由你指定。自带的三个是 `web`、`tui`、`headless`。 **装进你平时启动用的那个**: ```bash dsh plugin --profile web add @goodddgrades/dsh-behuman # 如果你用 `dsh web` 启动 dsh plugin --profile tui add @goodddgrades/dsh-behuman # 如果你用 `dsh tui` 启动 ``` 装完就这样,不需要再开启什么。profile 是**首次使用时自动创建**的,所以哪怕你从没启动过也没关系。 **同时用多个 profile 的话,每个都要装一遍。** ### 或者,让你的 AI 去装 如果你已经在 dsh 会话里,上面那些命令一个字都不用敲: > 帮我装一下 dsh-behuman 这个插件 —— https://github.com/goodddgrades/dsh-behuman 它能打开那个页面,自己把安装跑掉。 **从 GitHub 直接装会在你机器上现场构建**,所以 dsh 会停下来问你授权一次——它会告诉你具体加什么。 要构建的就是这个包自己的 `prepare` 脚本,你说可以之前它不会跑。 ## 记忆存在哪 ``` <你的工作目录>/.dsh/memory/ ├── MEMORY.md 目录 —— 每条记忆一行 └── memories/ 记忆本体 —— 一条一个 Markdown 文件 ``` 纯文本,你随时能看能改。**每个项目目录有自己的记忆**——换项目就换一套记忆。 技能写在 `.agents/skills/`——跟手写的技能放在一起,用的也是 dsh 本来就能读的格式。 **自动写的技能带标记。** 每个自动生成的技能,frontmatter 里都有这两行: ```yaml metadata: generated-by: dsh-behuman ``` 所以**你一眼就能看出哪些是 AI 写的、哪些是你自己写的**。它只更新自己写的,**绝不会动你手写的**——遇到手写的同名技能,它会拒绝而不是覆盖。 ## 配置 每项都有合理默认值,想改才需要看这个表。 | 选项 | 默认 | 作用 | |---|---|---| | `dir` | `.dsh/memory` | 记忆存放位置。 | | `skillsDir` | `.agents/skills` | 技能写入位置。 | | `nudgeInterval` | `10` | 多少次工具调用没有写入之后,让它回头自查一遍。`0` 表示关掉。 | | `reviewBackend` | `spawn` | 自查用的子 agent。别动它。 | | `reviewTimeoutMs` | `60000` | 自查的超时时间。 | | `reviewMaxTokens` | `2048` | 自查的输出上限。 | ## 状态 **预发布。** 上面写的功能都是能用的——记忆能写、能跨会话召回、技能会自己写出来。**但它还没被作者以外的人跑过。** ## 许可证 MIT —— 见 [LICENSE](LICENSE)。