把 Markdown 记忆存进自己的 Git 仓库,随时检索同步
29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add auraflame-ywt/dsh-memory-git该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · ui
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 20 处,展示前 20 条)
- 写入本地文件lib/index.js:134
await mkdir(target, { recursive: true }) - 读取本地文件lib/index.js:135
await access(target, fsConstants.W_OK) - 写入本地文件lib/memory.mjs:155
await mkdir(join(dir, NOTES_DIR), { recursive: true }) - 读取本地文件lib/memory.mjs:167
names = await readdir(join(dir, NOTES_DIR)) - 读取本地文件lib/memory.mjs:175
const text = await readFile(join(dir, relative), 'utf8') - 读取本地文件lib/memory.mjs:216
const old = parseFrontmatter(await readFile(abs, 'utf8')) - 读取本地文件lib/memory.mjs:227
await stat(join(dir, candidate)) - 写入本地文件lib/memory.mjs:247
await writeFile(abs, text, 'utf8') - 读取本地文件lib/memory.mjs:273
text = await readFile(abs, 'utf8') - 写入本地文件lib/memory.mjs:342
await writeFile(path, lines.join('\n'), 'utf8') - 读取本地文件lib/git.mjs:87
const entries = await readdir(dir) - 写入本地文件lib/git.mjs:113
await mkdir(dir, { recursive: true }) - 读取本地文件lib/git.mjs:224
await stat(absolute.startsWith('/') ? absolute : join(dir, absolute)) - 读取本地文件lib/git.mjs:336
const info = await stat(join(dir, '.git')) - 读取本地文件lib/git.mjs:356
realStore = await realpath(storeDir) - 读取本地文件lib/git.mjs:360
realStore = join(await realpath(dir), relativePath(dir, storeDir)) - 读取本地文件lib/config.mjs:66
text = readFileSync(path, 'utf8') - 写入本地文件lib/config.mjs:91
mkdirSync(dirname(path), { recursive: true }) - 写入本地文件lib/config.mjs:92
writeFileSync(path, `${JSON.stringify(next, null, 2)}\n`, 'utf8') - 写入本地文件lib/config.mjs:94
chmodSync(path, 0o600)
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-memory-git
把用户自己的 git 仓库当作 DeepSeek Harness 的长期记忆:配一个仓库地址,智能体就获得 memory_write / memory_search / memory_read / memory_sync 四个工具,记忆以「一篇一事实」的 Markdown 文件落盘,自动 commit、按需 push。
用户配置 repo ──► 首次调用时 clone ──► notes/*.md + memory-index.md │ memory_write ──┴─► debounce 30s ──► git commit ──► push
为什么是 Markdown + git
- 人可读、可迁移:Obsidian / VSCode / 任意编辑器都能直接打开,不锁定格式
- 冲突天然小:一篇一个文件,两个人改不同记忆就是不同文件,git 不会打架
- 免费的多端同步与历史:用户已经有 git 就够,不需要插件内建任何云服务
- 零依赖检索:索引文件 + 子串扫描,不引入 embedding、不调模型 API
工具
| 工具 | 作用 |
| memory_write | 写一条记忆;给 path 则原地更新(保留 created) |
| memory_search | 子串检索,标题权重 > 标签 > 正文,返回片段 |
展开完整文档(README 剩余 1 节)
dsh-memory-git
把用户自己的 git 仓库当作 DeepSeek Harness 的长期记忆:配一个仓库地址,智能体就获得 memory_write / memory_search / memory_read / memory_sync 四个工具,记忆以「一篇一事实」的 Markdown 文件落盘,自动 commit、按需 push。
用户配置 repo ──► 首次调用时 clone ──► notes/*.md + memory-index.md │ memory_write ──┴─► debounce 30s ──► git commit ──► push
为什么是 Markdown + git
- 人可读、可迁移:Obsidian / VSCode / 任意编辑器都能直接打开,不锁定格式
- 冲突天然小:一篇一个文件,两个人改不同记忆就是不同文件,git 不会打架
- 免费的多端同步与历史:用户已经有 git 就够,不需要插件内建任何云服务
- 零依赖检索:索引文件 + 子串扫描,不引入 embedding、不调模型 API
工具
| 工具 | 作用 |
| memory_write | 写一条记忆;给 path 则原地更新(保留 created) |
| memory_search | 子串检索,标题权重 > 标签 > 正文,返回片段 |
| memory_read | 按路径读全文 |
| memory_sync | 合并提交 → pull --rebase → push,失败原因翻译成人话 |
| memory_status | 报告存储位置、条数、仓库/远端、最近提交、待同步;未配远端时给配置指引 |
同步失败怎么读
memory_sync / memory_status 把 git 失败归类成稳定原因码,而不是甩 stderr:
| 原因码 | 含义 | 建议 |
| no-remote | 没配远端 | 记忆只在本机;git remote add origin <url> 后重试 |
| conflict | 远端与本地改到同一处 | 自动执行 git rebase --abort 回滚,手动 git pull 解决后再 sync |
| network | 域名解析/连接超时 | 检查网络或代理 |
| auth | SSH key / 权限问题 | 检查 key 与仓库访问权限 |
| rejected | 远端有别人的新提交 | 先拉取再推送 |
| timeout | 单次操作超时 | 稍后重试 |
冲突不会把仓库留在半 rebase 状态——同步是后台动作,卡住会拖累用户下一次普通操作。
存储布局
<dir>/
├── memory-index.md # 自动生成的索引(勿手改) ├── notes/ │ ├── 偏好编辑器.md │ └── Tarot-推广渠道.md └── .git/
每条记忆:
title: 偏好编辑器 type: preference created: 2026-10-28 updated: 2026-10-28
tags: [工具]
source: dsh-memory-git
用户偏好 Neovim,希望保持 vim 键位。
安装
从 npm 安装(推荐)
在 DSH 的 设置 → 插件 → 安装 里填包名:
@liuxinye/dsh-memory-git
装完默认启用,重启 DSH 生效。
命令行等价:
dsh plugin --profile desktop add @liuxinye/dsh-memory-git
从源码链接(开发调试)
1. 把包链接进 profile
dsh plugin --profile desktop add "link:/绝对路径/dsh-memory-git"
2. 在 profile 的 dsh.profile.bundles 末尾追加 "@liuxinye/dsh-memory-git" 或者直接在 设置 → 插件 页启用
cordis.patch.yml 里可以覆盖任何配置项。
配置(三种方式,按侵入性排序)
1. 零配置:装完就能用
不配任何东西时,记忆落在 $DSH_HOME/memory,本地 git init。不会丢,但没有异地备份。
2. 让 AI 配置(推荐,无需重启)
对 AI 说「把记忆仓库设成 git@github.com:me/memory.git」,它会调:
memory_configure({ repo: "git@github.com:me/memory.git", autoPush: true })
写入 $DSH_HOME/memory.config.json,下一次工具调用立即生效,不用改 YAML、不用重启。
想换存储位置就传 dir(支持 ~/...,必须是绝对路径)。不带参数调用 = 打印当前配置。
3. profile patch(最高优先级,需要重启)
在 $DSH_HOME/profiles/<name>/cordis.patch.yml 里写:
- id: memory-git
name: 'dsh-memory-git'
config:
repo: git@github.com:me/memory.git
dir: /Users/me/memory
优先级:profile patch > 配置文件 > 默认值。 在 patch 里写了的字段, memory_configure 改不动(它会明说哪些字段被覆盖)。
| 字段 | 默认 | 说明 |
| repo | '' | 记忆仓库地址;留空 = 本地目录模式(只 init 不 push) |
| dir | $DSH_HOME/memory | 本地存储目录 |
| branch | main | 分支 |
| autoPush | true | 自动提交后是否 push;无远端自动跳过 |
| commitIntervalMs | 30000 | 写入后合并提交的 debounce |
| maxNoteBytes | 262144 | 单条正文上限,超出报错,不截断 |
| searchLimit | 20 | 单次检索返回上限 |
| authorName / authorEmail | DSH Memory | 提交作者,不依赖全局 git 配置 |
安全边界
- 只提交记忆目录:commitAll 用 pathspec,记忆目录嵌在用户既有仓库里时不会误提交无关文件
- 路径逃逸拦截:所有 path 都过 safeJoin,拒绝 ..、绝对路径与 NUL
- 不拼 shell:所有 git 调用走 execFile('git', argv)
- 不挂死:GIT_TERMINAL_PROMPT=0 + 超时 + 输出上限,网络问题报错,不阻塞对话
- 失败不中断回合:工具错误渲染成 ✗ CODE: message 返回给模型
测试
node --test # 60 个用例:存储/检索/索引/路径安全/git 提交与 clone/冲突回滚/插件接线
路线图
- P0(已完成):4 个工具 + 本地/git 同步 + 索引,能自用
- P1(已完成):memory_status(配置自检/向导)、冲突自动回滚与人话提示、本地时间格式、发布元数据
- P2:发 npm、插件市场条目、i18n、evaluatePluginCompatibility 兼容性声明、多设备 pull 策略
与 Obsidian 的关系
dir 可以指向 Obsidian vault 里的子目录(例如 知识库/记忆)。此时插件只提交该子目录, vault 的其他笔记不受影响;记忆文件本身也能在 Obsidian 里作为普通笔记阅读。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
auraflame-ywt/dsh-memory-git
把 Markdown 记忆存进自己的 Git 仓库,随时检索同步
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,327已汉化DSH
71.5
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,021已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 150,724已汉化DSH
71.1