按项目召回已验证结论,并调度子代理分工调查
30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ytsu-ki/dsh-relink该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 52 处,展示前 36 条)
- 读取本地文件lib/memory-team.js:20
const pluginVersion = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version - 读取本地文件lib/core/scope.js:9
const start = await realpath(cwd) - 读取本地文件lib/core/scope.js:10
if (!(await stat(start)).isDirectory()) throw new Error('Working directory is not a directory') - 读取本地文件lib/core/scope.js:13
const root = await realpath(explicit) - 读取本地文件lib/core/scope.js:14
if (!(await stat(root)).isDirectory()) throw new Error('projectRoot must be a directory') - 读取本地文件lib/core/scope.js:17
const userHome = await realpath(home).catch(() => home) - 读取本地文件lib/core/scope.js:24
await access(resolve(dir, '.git')) - 读取本地文件lib/core/secrets.js:61
const binary = await readFile(this.command) - 读取本地文件lib/core/secrets.js:63
const policy = hash(Buffer.concat([binary, await readFile(rules), Buffer.from(redact.toString())])) - 写入本地文件lib/stores/sqlite-store.js:14
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }) - 写入本地文件lib/stores/sqlite-store.js:18
chmodSync(path, 0o600) - 读取本地文件lib/stores/markdown-store.js:40
const signature = await lstat(path, { bigint: true }).then(signatureOf, () => null) - 读取本地文件lib/stores/markdown-store.js:48
const real = await realpath(this.root) - 读取本地文件lib/stores/markdown-store.js:49
if (!(await stat(real)).isDirectory()) throw Object.assign(new Error('not a directory'), { code: 'ENOTDIR' }) - 读取本地文件lib/stores/markdown-store.js:103
try { entries = await readdir(dir, { withFileTypes: true }) } - 读取本地文件lib/stores/markdown-store.js:109
try { return { path, info: await lstat(path, { bigint: true }) } } - 读取本地文件lib/stores/markdown-store.js:119
const info = await lstat(folder).catch(error => { if (error.code === 'ENOENT') return null; throw error }) - 写入本地文件lib/stores/markdown-store.js:269
if (create) { try { await mkdir(cursor, { mode: 0o700 }) } catch (e) { if (e.code !== 'EEXIST') throw e } } - 写入本地文件lib/stores/markdown-store.js:287
await mkdir(resolve(this.stateDir, 'locks'), { recursive: true, mode: 0o700 }) - 写入本地文件lib/stores/markdown-store.js:305
try { await writeFile(path, raw, { flag: 'wx', mode: 0o600 }) } - 写入本地文件lib/stores/markdown-store.js:309
await mkdir(dirname(history), { recursive: true, mode: 0o700 }) - 写入本地文件lib/stores/markdown-store.js:310
await writeFile(history, old, { flag: 'wx', mode: 0o600 }) - 写入本地文件lib/stores/markdown-store.js:313
await writeFile(temp, raw, { flag: 'wx', mode: 0o600 }) - 删除本地文件lib/stores/markdown-store.js:317
} finally { await unlink(temp).catch(e => { if (e.code !== 'ENOENT') throw e }) } - 读取本地文件lib/core/records.js:44
const path = await realpath(resolve(project, file)) - 读取本地文件lib/core/records.js:46
const info = await stat(path) - 读取本地文件lib/core/records.js:48
const data = await readFile(path) - 写入本地文件lib/stores/catalog.js:27
if (this.path !== ':memory:') mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 }) - 写入本地文件lib/stores/catalog.js:30
if (this.path !== ':memory:') chmodSync(this.path, 0o600) - 删除本地文件lib/stores/catalog.js:52
removeFiles() { for (const suffix of ['', '-journal', '-wal', '-shm']) rmSync(`${this.path}${suffix}`, { force: true }) } - 读取本地文件lib/stores/file-lock.js:26
try { holder = JSON.parse(await readFile(lock, 'utf8')) } catch { } - 读取本地文件lib/stores/file-lock.js:27
const info = await stat(lock).catch(() => null) - 删除本地文件lib/stores/file-lock.js:29
if (abandoned) { await unlink(lock).catch(() => {}); continue } - 删除本地文件lib/stores/file-lock.js:40
await unlink(lock).catch(() => {}) - 写入本地文件lib/stores/file-lock.js:49
await copyFile(source, target, constants.COPYFILE_EXCL) - 删除本地文件lib/stores/file-lock.js:50
await unlink(source)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-agent-loop@deepseek-ai/dsh-agent-loop-testkit@deepseek-ai/dsh-llm@deepseek-ai/dsh-llm-deepseek@deepseek-ai/dsh-session-persistence-jsonl@deepseek-ai/dsh-session-query@deepseek-ai/dsh-subagent@deepseek-ai/dsh-subagent-spawn-in-process@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tool-subagent给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
鱼的记忆(dsh-relink):面向 DeepSeek Harness 的项目记忆与原生子智能体协作插件。默认本地 SQLite,可选 Obsidian 兼容的 Markdown 知识库,按项目召回相关记录,无常驻后台服务。
README
由 DeepSeek 最新模型翻译生成dsh-relink · 鱼的记忆
Project memory and native subagent coordination for DeepSeek Harness
面向 DeepSeek Harness 的项目记忆与原生子代理协作插件
English · 简体中文
dsh-relink(原 dsh-memory-team)帮 Harness 智能体不再重复发现它已经知道的东西。每个新请求到达模型之前,它会召回当前项目真正用得上的少量已验证结论;没有相关内容时,它直接说明,而不是塞进噪音。它能把真正独立的调查分给两个原生子代理,还能显示一次慢回合把时间花在了哪里。它从不给模型设截止时间,不取消有效工作,也不截断你要求的输出。
[!NOTE]
这是非官方社区项目,且为预发布版。请先在单独的测试配置档里试用。见状态。
界面
dsh-relink 在隔离的 Harness 配置档中运行
亮点
- 召回相关,不制造噪音。 所有后端共用一套确定性相关性模型。说出记录的键名或完整标题就能找到它;像「请检查这个文件」这类泛泛的请求,什么也召回不到。
- 默认本地运行。 记忆存在本地 SQLite 数据库里,不需要账号、服务或额外的模型调用。可选的 Markdown 仓库兼容 Obsidian 和任何编辑器。
- 后台不跑任何东西。 没有文件监听、定时器或辅助进程。
展开完整文档(README 剩余 1 节)
dsh-relink · 鱼的记忆
Project memory and native subagent coordination for DeepSeek Harness
面向 DeepSeek Harness 的项目记忆与原生子代理协作插件
English · 简体中文
dsh-relink(原 dsh-memory-team)帮 Harness 智能体不再重复发现它已经知道的东西。每个新请求到达模型之前,它会召回当前项目真正用得上的少量已验证结论;没有相关内容时,它直接说明,而不是塞进噪音。它能把真正独立的调查分给两个原生子代理,还能显示一次慢回合把时间花在了哪里。它从不给模型设截止时间,不取消有效工作,也不截断你要求的输出。
[!NOTE]
这是非官方社区项目,且为预发布版。请先在单独的测试配置档里试用。见状态。
界面
dsh-relink 在隔离的 Harness 配置档中运行
亮点
- 召回相关,不制造噪音。 所有后端共用一套确定性相关性模型。说出记录的键名或完整标题就能找到它;像「请检查这个文件」这类泛泛的请求,什么也召回不到。
- 默认本地运行。 记忆存在本地 SQLite 数据库里,不需要账号、服务或额外的模型调用。可选的 Markdown 仓库兼容 Obsidian 和任何编辑器。
- 后台不跑任何东西。 没有文件监听、定时器或辅助进程。服务首次使用时才启动,外部改动在下一次读取时生效。
- 如实报告健康状态。 每个结果都是 ok、no-match、degraded、withheld 或 unavailable,坏掉的组件绝不会看起来像空记忆。
- 原生协作。 team_start 使用宿主自带的 subagent 工具,所以权限、取消、递归限制和结果投递都归 Harness 管。
- 安全升级。 0.5.x 的数据库和笔记原地读取,并已在同一份数据上与 0.5.3-beta.3 做过往返测试。
0.6 实测
同样的负载对比 0.5.3-beta.3,各跑五次全新进程,取中位数。在 Apple M1 上用带标签的合成语料测得;细节和取舍见 docs/benchmarks.md。
| | 0.5.3-beta.3 | 0.6.0-beta.1 |
| 无关请求仍召回记录的比例 | 40-80% | 0-4% |
| 召回记录的精确率 | 43-71% | 94-97% |
| 对 2,000 条已有笔记的首次 Markdown 搜索 | 861 ms | 312 ms |
| 外部编辑笔记后,下一次搜索可见的延迟 | 224-330 ms | 107-126 ms |
| 桌面运行时冷启动增加的时间 | 约 100-125 ms | 约 50 ms |
| 配置了 vault 后的后台辅助进程 | 约 190 MiB(Basic Memory) | 无 |
有些搜索比之前慢 1-2 ms;基准测试说明解释了原因。
功能
| | 作用 |
| 项目记忆 | 每次新的用户输入到达模型之前,为当前项目补充最多三条相关记录。记录按项目隔离(Git 根目录或工作目录)。过期记录,以及证据文件已变更的记录,不会被自动召回。 |
| Markdown vault(可选) | 把记录存成纯 Markdown,你可以在 Obsidian 里编辑。插件不会自行改写你的笔记;通过保存工具做的替换会在历史中保留上一版本。加上 dsh_private: true 可让某条笔记不参与召回。 |
| 任务记录(需配置 vault) | 把每个完成的回合记成一条未验证的日志笔记(请求、最终回复、结果和工具名),全程不调用模型。推理过程、工具参数和工具输出不会存储。 |
| 子代理协作 | team_start 并行运行最多两项独立调查;父级保留编辑权和最终验收权。team_wait 只等待一次,不轮询。 |
| 执行诊断 | workflow_status 报告步骤、输出、重试和实际耗时明细。每回合最多三条简短提醒,标记重复出现的相同结果或过长的回合;它们从不阻塞工具,也不结束任务。 |
环境要求
- DeepSeek Harness 0.2.1-rc.2 或 0.2.1-rc.3
- Node.js 22.17 或更高版本(Harness 桌面应用已自带合适的运行时)
- 可选:Obsidian、Basic Memory 0.23.2 或 Betterleaks 1.9.0,均需单独安装
安装
1. 从 Releases 下载 dsh-relink-0.6.0-beta.2.tgz,并用 SHA256SUMS 校验。
2. 在 Harness 中打开 Plugins > Add plugin(最好在测试配置档里操作),输入下载文件的绝对路径。
3. 启用 dsh-relink,按提示重启 Harness。
从命令行安装:
dsh plugin --profile my-test-profile add /absolute/path/dsh-relink-0.6.0-beta.2.tgz
就这些:记忆功能配合本地 SQLite 即可立即使用。不要手动编辑配置档清单或 lockfile。
可选:给 Obsidian 用的 Markdown vault
node scripts/setup-knowledge.mjs \
--vault '/absolute/path/to/Obsidian Vault/DSH Knowledge' \
--project '/absolute/path/to/project' \sh
--config-dir '/absolute/path/to/plugin-state'
脚本会创建 vault,并把设置保存到 ~/.local/share/dsh-memory-team/settings.json(这个目录沿用插件的旧名,现有设置才能继续生效),同时备份之前的文件。之后重新加载插件。选项:--seed-file /absolute/notes.json 导入已批准的 [key, title, kind, summary, evidence] 行,不覆盖已有的 key;--no-activate 只准备文件,不改动设置。
在 Obsidian 里编辑笔记时,保留 dsh_ 开头的 frontmatter 字段。不需要安装 Obsidian 插件。
可选:Basic Memory
插件不会启动 Basic Memory,也不依赖它。如果你想让 Basic Memory 自带的工具作用于同一个 vault,请单独安装官方 Basic Memory 0.23.2(在 macOS arm64 上,scripts/basic-memory-macos-arm64.txt 固定了一组已验证的依赖,供 pip install -r 使用),并把 --basic-memory-config /absolute/path 传给安装脚本。按脚本写入的设置,Basic Memory 0.23.2 会索引插件的笔记,但不会修改它们。Basic Memory 0.24 会往笔记里写入 permalink 字段;插件能容忍这一点,但每篇被重写的笔记都会多出一个新修订版本。
可选:用 Betterleaks 扫描凭据 sh
node scripts/setup-retrieval.mjs
下载固定版本的 Betterleaks 1.9.0(macOS 和 Linux,arm64 或 x64),校验 SHA-256 后启用。--archive /absolute/release.tar.gz 可离线安装。没有 Betterleaks 时,内置规则仍会脱敏常见凭据格式。
用法
像平常一样给 Harness 派任务;何时搜索、保存或委派,由模型自己决定。你也可以直接说:
先搜索这个项目的记忆。把实现排查和测试审查交给两个独立的子代理,问题你自己修,然后保存验证过的结论。
| 工具 | 用途 |
| project_memory_search | 搜索当前项目;查询为空时列出最近的记录 |
| project_memory_save | 保存带证据的已验证事实、工作流或坑点 |
| project_memory_forget | 按 key 和当前修订版本删除记录 |
| project_memory_status | 显示后端、存储路径、健康状态和配置问题 |
| team_start | 启动最多两个独立排查 |
| team_wait | 等待一次原生子任务,然后列出任务状态 |
| workflow_status | 显示一轮的步骤、输出、重试和耗时明细 |
json
{
"key": "viewport-acceptance",
"title": "Prerequisites for 1440px acceptance",
"kind": "pitfall",
"summary": "Close overlays before checking button clickability at 1440px.",
"evidence": "Playwright trace showed the cookie banner intercepting clicks.",
"files": ["tests/layout.test.js"]
}
证据文件只做指纹记录,不复制;一旦文件发生变化,记录就不再自动召回。替换记录需要提供当前的 expected_revision,搜索会返回这个值。
配置
所有设置都是可选项,可在插件设置中修改。
| 设置 | 默认值 | 含义 |
| database | $DSH_PROFILE_DIR/data/dsh-memory-team.sqlite | SQLite 数据库(绝对路径) |
| knowledgeRoot | 未设置 | 已有 Markdown 仓库的绝对路径 |
| knowledgeProject | 所有项目 | 只有这个项目使用该仓库,其他项目使用 SQLite |
| projectRoot | 自动 | 绝对根目录,把自身及其子目录归为一组 |
| basicMemoryConfig | $DSH_PROFILE_DIR/data/basic-memory | 历史、回收站和派生索引的状态目录(沿用旧名) |
| incrementalIndex | true | 设为 false 时,派生索引只保留在内存中 |
| betterleaksCommand | 未设置 | Betterleaks 1.9.0 的绝对路径 |
| ttlDays | 30 | 超过这个天数的记录(1-365 天)不再自动召回 |
| recallLimit / recallChars | 3 / 6000 | 每次自动召回的记录条数和字符数 |
| maxWorkers | 2 | 插件拥有的并行子代理数(1-2) |
| repeatThreshold / checkpointSteps / longOutputTokens | 3 / 20 / 4000 | 执行提醒出现的时机 |
为兼容旧配置,basicMemoryCommand 仍会被接受,但会被忽略。默认数据库文件等存储路径保留旧名 dsh-memory-team,这样改名后仍能找到已有数据。
隐私
所有内容都以明文形式存储在本地。召回的片段会随普通请求一起发送给你的模型服务商,因此不要保存凭据或私人对话。保存、记录或召回之前都会筛查凭据;配置了扫描器但扫描失败时,记忆传输会被阻断,而不是放行。在 Windows 上,文件继承所在目录的权限;参见 docs/windows-acceptance.md。
状态
- 已验证: macOS arm64 搭配 DeepSeek Harness 0.2.1-rc.3 桌面运行时(安装、工具、跨进程重启的保存与召回),以及 Node.js 22.17、24 和 26 上的测试套件。详情参见 docs/compatibility.md。
- 尚未验证: Windows 和 Linux,以及桌面窗口本身的冷启动。
- 部分 0.5.x 用户反馈,启用插件后宿主无法启动或退出。原始原因尚未查明。0.6 移除了最可能的故障点:激活时不进行任何文件系统、进程或网络操作,不运行后台进程或文件监视器,所有后台错误都在插件内部处理。
如果 Harness 启动失败,请在恢复对话框中选择 Disable third-party plugins, back up profile patch, and restart(这也会影响其他第三方插件)。请用 bug report template 报告问题,附上对话框里的 crash-...-host.log 和 project_memory_status 的输出,并移除凭据和隐私数据。
从 0.5.x(dsh-memory-team)升级
0.6 以新名称 dsh-relink 发布。先从配置档中移除 dsh-memory-team,再安装 dsh-relink。如果两个都保持启用,后加载的那个会激活失败,于是你可能一直在跑旧版本却毫无察觉。你的设置、数据库和 Markdown 笔记会原样沿用,不需要转换数据。如果你的配置档补丁用 id: dsh-memory-team 覆盖了插件配置,请改成 id: dsh-relink。
回滚就是移除 dsh-relink,再重新安装 dsh-memory-team 0.5.3-beta.3。插件不再启动 Basic Memory,如果你要用它的工具,请自行启动。完整流程和 scripts/migrate.mjs 检查辅助脚本见 docs/migration.md。
文档
| 文档 | 内容 |
| Architecture | 设计决策、数据归属、对账与失败状态 |
| Migration | 从 0.5.x 升级、回滚与契约变更 |
| Compatibility | 支持的版本,以及各项验证的环境 |
| Benchmarks | 方法、结果与取舍 |
| Windows acceptance | Windows 上仍需手动检查的项目 |
| Slow-session notes | 为什么要有执行提醒和耗时分类 |
开发 sh
pnpm install --frozen-lockfile --ignore-scripts
pnpm check
pnpm test
pnpm bench
测试使用官方 Harness 组件和模拟模型,不调用付费 API。设置 BASIC_MEMORY_TEST_COMMAND、BETTERLEAKS_TEST_COMMAND 或 DSH_RELINK_BASELINE_ENTRY 会追加真实服务和回滚检查。pnpm release:prepare 会构建安装包和源码归档,并做交叉校验。
旧的 stream-request guard 仍以 dsh-relink/legacy-stream-guard 提供,但已废弃,将在 0.7.0 移除(详情)。
许可证
MIT。可选工具单独安装,遵循各自的许可证:Betterleaks(MIT)和 Basic Memory(AGPL-3.0-or-later)。Obsidian 是可选编辑器,不是依赖项。
鱼的记忆(dsh-relink)(原名 dsh-memory-team)让 Harness 中的智能体不必反复探索已经知道的事情。每次新请求发送给模型之前,它会为当前项目召回少量真正相关的已验证结论;没有相关内容时,它会如实说明,而不是塞入无关信息。它还可以把真正独立的调查交给两个原生子代理并行处理,并展示一轮缓慢的任务把时间花在了哪里。它从不对模型设置时限、不取消有效工作,也不截断用户要求的输出。
[!NOTE]
这是一个非官方的社区项目,目前为预发布版。请先在单独的测试配置(profile)中试用,详见项目状态。
界面鱼的记忆在隔离 Harness 配置中的运行界面
亮点
- 召回精准,不制造噪声:所有存储后端共用同一套确定性的相关度模型。在请求中写出记录的键名或完整标题即可找到它;「请帮我检查这个文件」之类的泛化请求不会召回任何记录。
- 默认完全本地:记忆保存在本地 SQLite 数据库中,不需要账号、服务或额外的模型调用。可选的 Markdown 知识库可以直接用 Obsidian 或任意编辑器编辑。
- 后台零常驻:没有文件监听、定时器或辅助进程。服务在首次使用时才启动,外部编辑会在下一次读取时生效。
- 健康状态透明:每个结果都标明 ok、no-match、degraded、withheld 或 unavailable,组件故障不会被误认为「没有记忆」。
- 原生协作:team_start 调用宿主自带的 subagent 工具,权限、取消、递归层数限制和结果投递都由 Harness 管理。
- 升级安全:0.5.x 的数据库和笔记原地读取,并且测试过与 0.5.3-beta.3 在同一份数据上来回切换。
0.6 实测数据
在相同负载下与 0.5.3-beta.3 对比,每项在全新进程中重复 5 次,取中位数。测试环境为 Apple M1 和一套带标注的合成语料,方法与取舍详见 docs/benchmarks.md。
| | 0.5.3-beta.3 | 0.6.0-beta.1 |
| 无关请求仍被注入记录的比例 | 40-80% | 0-4% |
| 召回记录的精确率 | 43-71% | 94-97% |
| 首次检索 2,000 条已有 Markdown 笔记 | 861 ms | 312 ms |
| 外部编辑后,下一次检索可见所需时间 | 224-330 ms | 107-126 ms |
| 桌面运行时冷启动增加的耗时 | 约 100-125 ms | 约 50 ms |
| 配置知识库后的后台辅助进程 | 约 190 MiB(Basic Memory) | 无 |
部分检索比以前慢 1-2 ms,原因见基准测试说明。
功能
| | 作用 |
| 项目记忆 | 每次新的用户输入发送给模型前,为当前项目补充最多三条相关记录。记录按项目隔离(Git 根目录或工作目录)。过期记录、以及证据文件已变化的记录不会被自动召回。 |
| Markdown 知识库(可选) | 以纯 Markdown 保存记录,可在 Obsidian 中编辑。插件不会擅自改写你的笔记;通过保存工具替换记录时,旧版本会保留在历史记录中。在笔记中加入 dsh_private: true 即可让它不参与召回。 |
| 任务记录(需配置知识库) | 每轮任务结束后自动记一条未经验证的日志笔记(请求、最终回复、结果和工具名称),不调用模型;不保存推理过程、工具参数和工具输出。 |
| 子代理协作 | team_start 最多并行运行两个独立调查;修改与最终验收仍由主代理负责。team_wait 只等待一次,不轮询。 |
| 执行诊断 | workflow_status 报告步数、输出量、重试次数和耗时分解。每轮最多三条简短提醒,提示重复的相同结果或过长的任务;提醒从不阻止工具调用,也不会结束任务。 |
环境要求
- DeepSeek Harness 0.2.1-rc.2 或 0.2.1-rc.3
- Node.js 22.17 或更高版本(Harness 桌面版已自带合适的运行时)
- 可选:Obsidian、Basic Memory 0.23.2 或 Betterleaks 1.9.0,均需另行安装
安装
1. 从 Releases 下载 dsh-relink-0.6.0-beta.2.tgz,并用 SHA256SUMS 核对校验和。
2. 在 Harness 中打开 Plugins > Add plugin(建议使用测试配置),输入下载文件的绝对路径。
3. 启用 鱼的记忆,按提示重启 Harness。
命令行安装: sh
dsh plugin --profile my-test-profile add /absolute/path/dsh-relink-0.6.0-beta.2.tgz
到这里就可以使用了:记忆功能默认使用本地 SQLite,开箱即用。请不要手动编辑配置清单或锁文件。
可选:配合 Obsidian 使用 Markdown 知识库 sh
node scripts/setup-knowledge.mjs \
--vault '/absolute/path/to/Obsidian Vault/DSH Knowledge' \
--project '/absolute/path/to/project' \
--config-dir '/absolute/path/to/plugin-state'
该脚本会创建知识库目录,并把设置写入 ~/.local/share/dsh-memory-team/settings.json(该目录沿用插件的旧名称,以便继续使用已有设置;原有文件会先备份),完成后请重新加载插件。--seed-file /absolute/notes.json 可导入已审核的 [key, title, kind, summary, evidence] 记录,且不会覆盖已有的键;--no-activate 只准备文件,不修改设置。
在 Obsidian 中编辑笔记时请保留以 dsh_ 开头的 frontmatter 字段。不需要安装任何 Obsidian 插件。
可选:Basic Memory 插件不会启动,也不依赖 Basic Memory。如果你想在同一个知识库上使用 Basic Memory 自带的工具,请另行安装官方 Basic Memory 0.23.2(在 macOS arm64 上,可用 scripts/basic-memory-macos-arm64.txt 中经过验证的依赖版本执行 pip install -r),并在运行设置脚本时加上 --basic-memory-config /absolute/path。按脚本写入的设置,Basic Memory 0.23.2 能索引插件的笔记而不修改它们。Basic Memory 0.24 会往笔记里写入 permalink 字段:插件可以兼容,但每条被改写的笔记都会得到新的修订号(revision)。
可选:使用 Betterleaks 扫描凭据 sh
node scripts/setup-retrieval.mjs
该脚本会下载固定版本的 Betterleaks 1.9.0(支持 macOS 和 Linux 的 arm64 / x64),校验 SHA-256 后启用。--archive /absolute/release.tar.gz 可离线安装。即使不安装 Betterleaks,内置规则也会屏蔽常见格式的凭据。
使用
像平常一样给 Harness 布置任务即可,由模型自行决定何时检索、保存或分派任务。你也可以直接要求:
先检索本项目的记忆。把实现排查和测试审查分别交给两个独立的子代理,由你亲自修复问题,验证通过后保存结论。
| 工具 | 用途 |
| project_memory_search | 检索当前项目;查询为空时列出最近的记录 |
| project_memory_save | 保存带证据的已验证事实、工作流程或踩坑经验 |
| project_memory_forget | 按键名和当前修订号删除一条记录 |
| project_memory_status | 查看存储后端、存储路径、健康状态和配置问题 |
| team_start | 启动最多两个独立调查 |
| team_wait | 等待一次原生子任务完成,并列出各任务状态 |
| workflow_status | 查看一轮任务的步数、输出量、重试次数和耗时分解 |
json
{
"key": "viewport-acceptance",
"title": "Prerequisites for 1440px acceptance",
"kind": "pitfall",
"summary": "Close overlays before checking button clickability at 1440px.",
"evidence": "Playwright trace showed the cookie banner intercepting clicks.",
"files": ["tests/layout.test.js"]
}
证据文件只记录指纹,不复制内容;文件一旦变化,该记录就不再被自动召回。替换已有记录时需要提供当前的 expected_revision,可以从检索结果中获得。
配置
所有设置均为可选,可在插件设置中修改。
| 设置 | 默认值 | 说明 |
| database | $DSH_PROFILE_DIR/data/dsh-memory-team.sqlite | SQLite 数据库(绝对路径) |
| knowledgeRoot | 未设置 | 已存在的 Markdown 知识库的绝对路径 |
| knowledgeProject | 所有项目 | 仅此项目使用知识库,其他项目使用 SQLite |
| projectRoot | 自动 | 绝对路径;该目录及其子目录视为同一个项目 |
| basicMemoryConfig | $DSH_PROFILE_DIR/data/basic-memory | 存放历史版本、回收站和派生索引的状态目录(沿用旧名称) |
| incrementalIndex | true | 设为 false 时派生索引只保存在内存中 |
| betterleaksCommand | 未设置 | Betterleaks 1.9.0 的绝对路径 |
| ttlDays | 30 | 超过该天数(1-365)的记录不再被自动召回 |
| recallLimit / recallChars | 3 / 6000 | 每次自动召回的记录数和字符数上限 |
| maxWorkers | 2 | 插件可并行使用的子代理数量(1-2) |
| repeatThreshold / checkpointSteps / longOutputTokens | 3 / 20 / 4000 | 执行提醒的触发条件 |
为保持兼容,basicMemoryCommand 仍可配置,但会被忽略。默认数据库文件等存储路径沿用旧名称 dsh-memory-team,因此改名后仍能找到已有数据。
隐私
所有数据都以明文保存在本地。召回的摘录会随正常请求发送给你使用的模型服务商,因此请不要保存凭据或私密对话。保存、记录和召回之前都会筛查凭据;如果已配置的扫描器出现故障,插件会阻止记忆传输,而不是直接放行。在 Windows 上,文件沿用所在目录的权限,详见 docs/windows-acceptance.md。
项目状态
- 已验证:macOS arm64 上的 DeepSeek Harness 0.2.1-rc.3 桌面运行时(安装、工具调用、保存以及跨进程重启后的召回),以及 Node.js 22.17、24 和 26 上的测试套件。详情见 docs/compatibility.md。
- 尚未验证:Windows 和 Linux,以及桌面窗口本身的冷启动。
- 部分 0.5.x 用户反馈启用插件后宿主无法启动或意外退出,原始原因至今尚未查明。0.6 消除了最可能的故障点:激活时不进行任何文件、进程或网络操作,不运行后台进程或文件监听,所有后台错误都在插件内部处理。
如果 Harness 无法启动,请在恢复对话框中选择 Disable third-party plugins, back up profile patch, and restart(这也会影响其他第三方插件)。反馈问题请使用 Bug 报告模板,附上对话框给出的 crash-...-host.log 和 project_memory_status 的输出,并删除其中的凭据和隐私信息。
从 0.5.x(dsh-memory-team)升级
0.6 起以新名称 dsh-relink 发布。请先从配置中移除 dsh-memory-team,再安装 dsh-relink。如果两者同时启用,后加载的那个会激活失败,你可能在不知情的情况下继续运行旧版本。已有的设置、数据库和 Markdown 笔记会被原样沿用,无需转换数据。如果你的配置补丁(profile patch)用 id: dsh-memory-team 覆盖了插件配置,请改为 id: dsh-relink。
回退时,移除 dsh-relink 并重新安装 dsh-memory-team 0.5.3-beta.3 即可。新版插件不再启动 Basic Memory,如果你需要使用它的工具,请自行运行。完整步骤和检查工具 scripts/migrate.mjs 见 docs/migration.md。
文档
以下文档为英文:
| 文档 | 内容 |
| Architecture | 设计决策、数据归属、同步方式与故障状态 |
| Migration | 从 0.5.x 升级、回退及接口变化 |
| Compatibility | 支持的版本以及各环境的验证情况 |
| Benchmarks | 测试方法、结果与取舍 |
| Windows acceptance | Windows 上仍需人工完成的验收项 |
| Slow-session notes | 执行提醒和耗时分类的设计背景 |
开发 sh
pnpm install --frozen-lockfile --ignore-scripts
pnpm check
pnpm test
pnpm bench
测试使用 Harness 官方组件和模拟模型,不会调用任何付费 API。设置 BASIC_MEMORY_TEST_COMMAND、BETTERLEAKS_TEST_COMMAND 或 DSH_RELINK_BASELINE_ENTRY 可额外运行真实服务和回退测试。pnpm release:prepare 会构建并交叉校验安装包和源码包。
旧版流式请求守卫仍可通过 dsh-relink/legacy-stream-guard 使用,但已弃用,将在 0.7.0 中移除(详情)。
许可证
MIT。可选工具需另行安装,并遵循各自的许可证:Betterleaks(MIT)、Basic Memory(AGPL-3.0-or-later)。Obsidian 只是可选的编辑器,不是本项目的依赖。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ytsu-ki/dsh-relink
按项目召回已验证结论,并调度子代理分工调查
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目