跳到正文
dsh-market 浏览插件 GitHub EN

Scorp1o117/dsh-soul-md

管理 soul.md 人设卡与长期记忆,支持按工作区和会话选择人设,并提供读取和更新工具。

Star 数 ★ 9 分类 记忆 收录于 2026-09-05 npm dsh-soul-md

安装

在 DeepSeek Harness 里通过 dsh-market 安装

dsh plugin --profile web add dshmarket

或使用命令行

dsh plugin --profile web add dsh-soul-md

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络。请先审阅源码,并尽量锁定 commit(github:owner/repo#sha)。

README

dsh-soul-md

配置入口(DSH 0.2.0-rc.2 起)

在首页侧边栏打开 插件 → 已安装 → dsh-soul-md,直接在插件详情页配置并保存。配置页注册到官方的 plugins.bundle.config 接口;全局设置页不再重复显示配置入口。Web 与桌面版使用相同界面,本版要求 DSH 0.2.0-rc.2 或更新的 0.2.x 版本。现有配置无需迁移。

GitHub: Scorp1o117/dsh-soul-md · npm: dsh-soul-md · English

属于 DeepSeek Harness Enhancement Suite —— Vision · Soul/Persona · 长期记忆 · 插件市场。

DeepSeek Harness 的人设 + 长期记忆插件——完全不用管文件:

在 插件 → dsh-soul-md 里输入人设卡的名称和内容,点保存,剩下的插件全包了。

功能

  • 人设卡:卡片内容渲染成系统提示词段落(soul:persona)。支持多张卡:设置一张默认卡,聊天框标题栏的「人设」下拉可以给每个会话单独选卡
  • 长期记忆:Agent 自带五个工具——
    • memory_append / memory_read / memory_rewrite:持久记忆文件(Agent.md / memory.md 风格)。当前人设卡有自己的记忆,没选卡时用全局记忆;分层模式下可用可选的 topic 参数按主题读写
    • soul_read / soul_update:AI 自己读、自己演化人设卡——发现自己的稳定特质就折叠进卡片,跨会话持续成长而不是每次重置
    • 记忆会以 soul:memory 段落注入提示词(有上限),AI 随时看得见自己的记忆
  • 解析规则:会话选择(聊天框切换)> 工作区人设 > 默认卡 > 无,切换下一轮对话即生效,无需重启
  • 工作区人设(v0.5.2):插件 → dsh-soul-md 里会列出所有工作区,每个工作区可以指定一张人设卡——该工作区的会话默认用它(会话级切换仍然优先)。工作区列表来自 dsh 的工作区注册表,不用输任何路径

桌面端安装

在桌面端的“插件”页面安装,或使用桌面端“应用 → 管理 dsh 命令”注册的命令:

dsh plugin --profile desktop add dsh-soul-md@0.8.6

重启桌面端以加载客户端插件。配置位于 $DSH_HOME/profiles/desktop。

安装

在 profile 的 cordis.patch.yml(如 $DSH_HOME/profiles/web/cordis.patch.yml)里 insert:

- insert:
    - id: soul-md
      name: 'dsh-soul-md'          # 之前先 pnpm add dsh-soul-md

重启 dsh web,打开 插件 → dsh-soul-md:输入名称 + 内容,保存,完事。

文件在哪(你不用管,仅供参考)

  • 人设卡:存在当前 Profile patch 的 soul-md 配置里,即 cards: { 名称 -> 内容 } + active 默认卡 + 会话级 sessions
  • 记忆文件:插件托管在 $DSH_HOME/soul-md/memory/(global.md + 每张卡一个文件),按需自动创建
  • 可选分层记忆(默认关闭):memory/<卡名>/core.md 在注入上限内参与注入,memory/<卡名>/topics/*.md 只把标题和首个正文行注入为索引;memory_read({ topic: "..." }) 按需取回主题全文。开启后若尚未建立目录结构,会继续读取旧的 <卡名>.md,首次追加 core 时也会保留旧内容
  • 从 ≤ v0.4 的文件版升级?插件首次运行会自动导入旧 path 卡片(名为「默认」)和旧记忆文件

配置

字段 默认值 含义
cards {} 人设卡:名称 → Markdown 内容(界面管理)
active '' 默认卡名称;空 = 默认不启用
sessions {} 会话级选择(sessionId → 卡名 / none / ''),聊天框切换器写入
workspaces {} 工作区级选择(工作区路径 → 卡名 / none / ''),设置页写入
workspaceList [] 工作区列表(路径 + 标题),由服务端从 dsh 工作区注册表维护
memory.maxBytes 1048576 memory_append / memory_rewrite 超过此大小会拒绝
memory.inject true 把记忆渲染为 soul:memory 提示词段落
memory.layered false 启用渐进式分层记忆:core + topics 索引
memory.injectMaxChars 8000 注入记忆内容的字符上限;单文件模式保留开头与最新尾部,分层模式先保留主题索引,再保留 core 首尾。memory_read 超过 20000 字符时也保留首尾。
memory.order 0.5 注入的记忆段落顺序
allowTemplates false 默认将人设卡和记忆中的 {{…}} 原样注入;开启后由宿主解析提示词变量,未知变量会使渲染失败
skipSubagents false 子代理会话(DSH 标记为 origin: "subagent")不注入 soul:persona / soul:memory 两段提示词;工具作用域不变
legacy 字段 — path、fallback、order、complete、watch、debounceMs、soulMaxBytes、personas、roster、memory.path… 保留以兼容旧配置,仅用于一次性导入

skipSubagents 默认关闭,保持 v0.7.0 的现有行为。开启后,DSH 以 origin: "subagent" 创建的委派子会话不再收到人设卡与记忆段落—— 子代理通常只做一件小事,不必每轮都背着主会话的完整人设与长期记忆。

它只作用于提示词注入:cardNameOf、memoryTarget 与三个 memory_* 工具的作用域完全不变,子代理的读写目标与未开启时一致, 不会因为跳过注入而落到 global.md。

兼容性:已验证 @deepseek-ai/dsh@0.1.7-rc.1 与 0.1.7-rc.2(npm next);npm latest 是 0.1.5-rc.3。新版使用 Profile patch 与客户端 configForms。旧宿主请使用插件旧版;alpha 构建仍标记 unknown。

v0.8.1:人设切换与分层记忆截断修复

  • 会话人设写入被拒时显示错误并回滚到宿主快照;写入期间锁定下拉,避免重叠修改。
  • 分层记忆超限时优先保留主题索引,core 保留首尾,并在提示词中写明省略内容。
  • 已通过 DSH 0.1.5-rc.3 一次性 Profile 的安装、Web 启动、首页与客户端 Bundle HTTP 检查,以及卸载验证。

v0.8.0:子代理提示词控制与 DSH next 兼容

  • 新增默认关闭的 skipSubagents:开启后,DSH 标记为 origin: "subagent" 的委派子会话不再注入 soul:persona / soul:memory 两段提示词。
  • 只作用于渲染路径;cardNameOf、memoryTarget 与 memory_* 工具的作用域不变。
  • 设置页「长期记忆」分组提供开关,与 memory.inject / memory.layered 共用保存按钮。
  • 记录 DSH 0.1.5-rc.3(next)兼容性;未验证的 alpha 版本继续标记 unknown。

v0.7.0:分层记忆

  • 新增默认关闭的 memory.layered,保持旧用户的单文件行为不变。
  • 开启后,core.md 作为常驻记忆,topics/*.md 只向提示词提供标题和一行摘要。
  • 三个 memory_* 工具均支持可选 topic 参数,按需读取、追加或重写主题全文。
  • 旧 <卡名>.md 会继续作为 core 回退来源,首次分层追加时自动带入,不会因切换模式丢失可见记忆。
  • 已完成 DSH 0.1.5-rc.2 一次性 Profile 的安装、Web 启动、客户端 Bundle 和卸载冒烟。

v0.6.2:写入改为原子提交并校验

此前所有保存都以单独一次 scope.set()/unset() 提交,写完只管弹「已保存」,从不确认是否真的生效。 问题在于 scope 的契约是「完成写入与恢复读取后结算」,不是「被拒就抛错」——被宿主以 settings/conflict 拒绝的写入同样会 resolve,于是界面显示成功而值静默回退。

具体修掉三处:

  • 同一个命名空间被绑了两个 scope(设置栏一个、聊天框标题栏的人设切换器一个)。每个 scope 各自维护 pendingRevision 与写入队列,于是两边可能各自按一个已被对方超越的 revision 去写入 —— 宿主要么拒绝, 要么接受后立刻被后来者覆盖。现在合并为一个共享 scope(scope 本就是设计成跨挂载点共享的)。
  • 删除人设卡时并行写入:Promise.all([set("cards"), unset("active")])。两处修改现在放进同一次 mutate(),共用一个 revision 栅栏。
  • 写完不校验:现在写入结算后回读命名空间 section,只有确认生效才报「已保存」,否则提示 「写入未生效」并重新载入表单。「不启用」选项也从直接 scope.unset 改走同一条校验路径。

另外删掉了 6 处 if (typeof scope.load === "function") scope.load()。SettingsScope 接口从来没有 load()(读走的是共享的 describe 镜像,由宿主 settings/document-updated 驱动刷新),这些守卫是照 臆测 API 写的死代码,只会让人误以为"已经刷新过了"。

注意事项

  • v0.8.5 起默认保留花括号原文:人设卡和记忆里的 {{demo}} 不再触发宿主插值。若旧卡片依赖 {{cwd}} 等宿主变量,请在设置页开启「允许人设与记忆使用提示词变量」(allowTemplates: true);开启后未知变量仍会使渲染失败。
  • 人设/记忆段落按组装解析:稳定卡片字节不变(KV Cache 友好),编辑即时生效。
  • DSH 会直接公开插件注册的 soul-md settings 命名空间;插件不会修改宿主安装目录中的文件。
  • 建议在人设卡里写清工作准则(如"任务质量优先"),避免角色扮演影响干活质量。
  • 从 0.5.8 起最低支持 DSH 0.1.0-rc.7,已针对 0.1.0-rc.7、 0.1.0-rc.8 和 0.1.1-rc.1 测试。仍使用 DSH 0.1.0-rc.6 的用户请锁定 dsh-soul-md@0.5.6;这是最后一个包含旧 settings 白名单兼容补丁的版本。

License

MIT

内容来自项目 README(GitHub)↗

评论

评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。