DSH 数学笔记助手dsh-math-memory
37.5/100
综合分
8
GitHub 星标
314
npm 周下载
—/5
用户评分
数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-math-memorynpm 源 · dsh-math-memory 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · other
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-math-memory @ 0.8.3
✓Node 引擎要求 >=22.5 · 基线 Node 22.19 满足
✓dsh CLI 依赖要求 >=0.1.7-rc.2 · 最新 0.2.1-rc.5 兼容
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 20:48:37
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 279 处,展示前 81 条)
- 读取本地文件dsh/host/index.mjs:51
const parsed = JSON.parse(readFileSync(join(profileDir, "package.json"), "utf8")); - 读取本地文件dsh/install.mjs:233
if (!overwrite && existsSync(target)) { - 写入本地文件dsh/install.mjs:237
mkdirSync(dirname(target), { recursive: true }); - 写入本地文件dsh/install.mjs:238
writeFileSync(target, content, "utf8"); - 读取本地文件dsh/install.mjs:252
if (!overwrite && existsSync(target)) { - 写入本地文件dsh/install.mjs:260
mkdirSync(dirname(target), { recursive: true }); - 写入本地文件dsh/install.mjs:261
copyFileSync(source, target); - 读取本地文件dsh/install.mjs:271
if (existsSync(target)) { - 删除本地文件dsh/install.mjs:272
rmSync(target, { recursive, force: true }); - 读取本地文件dsh/install.mjs:331
if (existsSync(join(resolved, ".dsh"))) { - 读取本地文件dsh/install.mjs:348
return JSON.parse(readFileSync(join(PACKAGE_ROOT, "package.json"), "utf8")).version ?? "0.0.0"; - 读取本地文件dsh/install.mjs:356
return JSON.parse(readFileSync(path, "utf8")); - 写入本地文件dsh/install.mjs:446
writeFileSync(target, current.slice(0, from) + withLineEnding(block, eol) + current.slice(to + end.length), "utf8"); - 写入本地文件dsh/install.mjs:454
writeFileSync(target, - 执行外部命令固定命令dsh/install.mjs:865
const result = spawnSync("dsh", args, { - 执行外部命令固定命令dsh/install.mjs:1064
const result = spawnSync("dsh", args, { - 执行外部命令固定命令dsh/install.mjs:1428
const result = spawnSync("dsh", args, { - 读取本地文件dsh/host/channel-owner.mjs:105
parsed = JSON.parse(readFileSync(candidate.path, "utf8")); - 读取密钥环境变量dsh/host/math-memory-panel.mjs:75
return (process.env.DSH_MATH_MEMORY_FEEDBACK_TOKEN ?? process.env.DSH_OBSIDIAN_FEEDBACK_TOKEN ?? "").trim(); - 读取本地文件dsh/host/math-memory-panel.mjs:195
return readFileSync(fileURLToPath(new URL("../templates/config.md", import.meta.url)), "utf8"); - 读取本地文件dsh/client-panel/install-into-profile.mjs:76
if (!existsSync(abs)) throw new Error(`closure: missing module ${rel}`); - 读取本地文件dsh/client-panel/install-into-profile.mjs:77
const text = readFileSync(abs, "utf8"); - 读取本地文件dsh/client-panel/install-into-profile.mjs:128
names = readdirSync(profileHome).filter((n) => n.endsWith(".yml")); - 读取本地文件dsh/client-panel/install-into-profile.mjs:132
try { text = readFileSync(join(profileHome, name), "utf8"); } catch { continue; } - 写入本地文件dsh/client-panel/install-into-profile.mjs:159
mkdirSync(to, { recursive: true }); - 读取本地文件dsh/client-panel/install-into-profile.mjs:160
for (const name of readdirSync(from)) { - 读取本地文件dsh/client-panel/install-into-profile.mjs:163
if (statSync(source).isDirectory()) copyTree(source, target); - 写入本地文件dsh/client-panel/install-into-profile.mjs:164
else copyFileSync(source, target); - 写入本地文件dsh/client-panel/install-into-profile.mjs:276
mkdirSync(pkgDir, { recursive: true }); - 写入本地文件dsh/client-panel/install-into-profile.mjs:284
mkdirSync(dirname(dest), { recursive: true }); - 写入本地文件dsh/client-panel/install-into-profile.mjs:285
copyFileSync(join(repo, rel), dest); - 写入本地文件dsh/client-panel/install-into-profile.mjs:287
copyFileSync(join(root, "lib", "client.js"), join(pkgDir, "client.js")); - 删除本地文件dsh/client-panel/install-into-profile.mjs:290
rmSync(join(pkgDir, "index.mjs"), { force: true }); - 写入本地文件dsh/preset/preset-deploy.mjs:84
if (!dryRun) mkdirSync(root, { recursive: true }); - 写入本地文件dsh/preset/preset-deploy.mjs:92
writeFileSync(join(root, name), text, 'utf8'); - 读取本地文件dsh/preset/preset-deploy.mjs:104
return PRESET_BODY_FILES.every((name) => existsSync(join(profileDir, name))); - 读取本地文件dsh/preset/preset-deploy.mjs:120
return readFileSync(join(dir, name), 'utf8'); - 写入本地文件dsh/profile/local-bundle.mjs:149
mkdirSync(dirname(target), { recursive: true }); - 写入本地文件dsh/profile/local-bundle.mjs:150
writeFileSync(target, content, 'binary'); - 写入本地文件dsh/profile/local-bundle.mjs:154
mkdirSync(dirname(manifestPath), { recursive: true }); - 写入本地文件dsh/profile/local-bundle.mjs:155
writeFileSync(manifestPath, `${JSON.stringify(localBundleManifest(meta), null, 2)}\n`, 'utf8'); - 读取本地文件dsh/profile/local-bundle.mjs:174
if (!existsSync(manifestPath)) return false; - 读取本地文件dsh/profile/local-bundle.mjs:177
manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); - 读取本地文件dsh/profile/local-bundle.mjs:185
return existsSync(join(root, ...patch.replace(/^ /, '').split('/'))); - 读取本地文件dsh/profile/local-bundle.mjs:195
if (!existsSync(root)) return false; - 删除本地文件递归dsh/profile/local-bundle.mjs:196
rmSync(root, { recursive: true, force: true }); - 读取本地文件dsh/profile/local-bundle.mjs:224
for (const entry of readdirSync(dir, { withFileTypes: true })) { - 读取本地文件dsh/profile/local-bundle.mjs:230
if (!existsSync(root)) return found; - 读取本地文件dsh/host/memory-admin.mjs:88
const stats = JSON.parse(readFileSync(join(root, '.deepseek', 'cache', 'retrieval-stats.json'), 'utf8')) ?? {}; - 读取本地文件dsh/host/memory-admin.mjs:96
cardText = readFileSync(filePath, 'utf8').toLowerCase(); - 读取本地文件dsh/host/memory-admin.mjs:189
if (existsSync(policyPath)) { - 读取本地文件dsh/host/memory-admin.mjs:190
text = readFileSync(policyPath, 'utf8'); - 写入本地文件dsh/host/memory-admin.mjs:203
mkdirSync(dirname(policyPath), { recursive: true }); - 写入本地文件dsh/host/memory-admin.mjs:204
writeFileSync(policyPath, updated, 'utf8'); - 读取本地文件dsh/host/memory-admin.mjs:231
const text = readFileSync(filePath, 'utf8'); - 写入本地文件dsh/host/memory-admin.mjs:353
if (changed) writeFileSync(filePath, updated, 'utf8'); - 读取本地文件dsh/host/memory-admin.mjs:384
stats = statSync(source); - 写入本地文件dsh/host/memory-admin.mjs:402
mkdirSync(archiveDir, { recursive: true }); - 写入本地文件dsh/host/memory-admin.mjs:410
renameSync(source, target); - 写入本地文件dsh/host/memory-admin.mjs:437
mkdirSync(archiveDir, { recursive: true }); - 写入本地文件dsh/client-panel/build-client.mjs:52
mkdirSync(join(root, "lib"), { recursive: true }); - 写入本地文件dsh/client-panel/build-client.mjs:53
writeFileSync(CLIENT_OUT, wrapped, "utf8"); - 发起网络请求dsh/client-panel/lib/client.js:7
var D=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var re=Object.prototype.hasOwnProperty;var ie=(s, - 发起网络请求dsh/client-panel/src/http-json.mjs:60
const res = await fetch(url, init); - 读取本地文件dsh/preset/math-memory.mjs:383
const size = statSync(path).size; - 读取本地文件dsh/preset/math-memory.mjs:678
children = readdirSync(dir, { withFileTypes: true }); - 读取本地文件dsh/preset/math-memory.mjs:687
const stats = statSync(path); - 读取本地文件dsh/preset/math-memory.mjs:714
buffer = readFileSync(log.path); - 读取本地文件dsh/preset/math-memory.mjs:830
const parsed = JSON.parse(readFileSync(path, "utf8")); - 读取本地文件dsh/preset/math-memory.mjs:882
events = decodeZstdSessionLog(readFileSync(log.path)); - 写入本地文件dsh/preset/math-memory.mjs:922
mkdirSync(dirname(abs), { recursive: true }); - 写入本地文件dsh/preset/math-memory.mjs:931
writeFileSync(abs, `${header}${body}\n`, "utf8"); - 写入本地文件dsh/preset/math-memory.mjs:936
writeFileSync(abs, `${existing}${sep}${body}\n`, "utf8"); - 写入本地文件dsh/preset/math-memory.mjs:956
mkdirSync(join(root, CACHE_DIR), { recursive: true }); - 写入本地文件dsh/preset/math-memory.mjs:957
writeFileSync(join(root, CAPTURE_FILE), JSON.stringify(next, null, 2), "utf8"); - 写入本地文件dsh/preset/math-memory.mjs:981
writeFileSync(indexPath, `${text}${line}\n`, "utf8"); - 读取密钥环境变量dsh/preset/math-memory.mjs:4701
const linkToken = (process.env.DSH_MATH_MEMORY_FEEDBACK_TOKEN ?? process.env.DSH_OBSIDIAN_FEEDBACK_TOKEN)?.trim() ?? ""; - 读取本地文件dsh/preset/note-tools.mjs:1333
if (existsSync(statsPath)) stats = JSON.parse(readFileSync(statsPath, "utf8")) ?? {}; - 读取本地文件dsh/preset/note-tools.mjs:1333
if (existsSync(statsPath)) stats = JSON.parse(readFileSync(statsPath, "utf8")) ?? {}; - 写入本地文件dsh/preset/note-tools.mjs:1366
mkdirSync(dirname(statsPath), { recursive: true }); - 写入本地文件dsh/preset/note-tools.mjs:1367
writeFileSync(statsPath, JSON.stringify(stats, null, 2), "utf8");
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 读写数学笔记
- 维护分层长期记忆
展开完整介绍(138 字)↓
面向数学笔记的 DeepSeek Harness 助手,驻留在 Obsidian 右侧栏。可直接读写数学笔记,维护分层长期记忆(画像、主题、类型化记录、原始证据),按 Rethlas 风格证明工作流工作,内置个人定理索引与问题模板库,并能把关键想法捕捉到备忘录、主动提醒打磨。
最近更新
在 GitHub 查看全部 →0.8.32026-10-18
· [0.8.3] - 2026-10-18
本版适配 dsh 0.2.1-rc.2,并移除拖拽引用与侧栏的皮肤中心/性能设置。
· 其他变更
· 移除把笔记拖进输入框自动插入引用的功能;直接输入笔记名即可。
· 移除「侧栏性能模式」与「侧栏加载皮肤动态装饰」两个设置;侧栏按 dsh 原样显示,回复里的笔记链接仍不会打开外部浏览器。
· 移除侧栏的「皮肤中心」相关设置;皮肤只在主 dsh web 里使用(此前若把皮肤中心装进过侧栏,已装的包不会被卸载)。
0.8.22026-10-16
· [0.8.2] - 2026-10-16
本版修复每次打开 Obsidian 都出现的红字错误提示,助手改为先给出完整回答再询问用户,记忆面板的读写改走 dsh 服务。⚠️ 助手的询问纪律重启 dsh 服务后生效。
· 问题修复
· 修复每次打开 Obsidian 都弹出「dsh 配置由「npm」通道安装」红字提示的问题。
· 修复插件配置的安装方式可能被静默改变的问题。
· 体验优化
· 助手请用户拍板时,改为先在回复里说明判断,再弹出选项。
· 记忆面板改为向 dsh 服务读取数据;服务不可用时明确报错,而不是显示为空面板。
· 记忆面板现在会说明本次体检把哪些卡片移入了归档目录。
· 其他变更
· 助手的询问纪律写在助手协议里,不是界面上的硬限制,仍有违反的可能。
0.8.12026-10-05
· [0.8.1] - 2026-10-05
本版主要包含四个方面:记忆卡开始记录来源(这张卡是人写的还是助手写的,此前只记"是否核实过"),笔记里助手补写的段落与尚未定稿的内容会在搜索结果中标明,助手不再每轮自动把对话整理成记忆卡,以及一批针对 dsh 0.2.0-rc.2 的修复。⚠️ 本版重装或重启后生效;首次体检会给已有卡片补上来源一行(可撤销)。
· Added
· 记忆卡开始记录「来源」——记录是人写的、助手写的、还是外部导入的。此前只记录"是否核实过",于是一条助手写的内容可能被当成用户的原话引用。这个字段由插件写入,助手不能写;已有卡片先显示"来源未知"。它不影响搜索结果的顺序。
· 笔记里由助手补写的段落会被标出来——一篇笔记里可能既有用户写的部分、也有助手补写的证明或定义,此前搜索看不出区别,助手补的内容和用户原文一样被返回、一样被当成用户的话。现在搜索结果会注明一篇笔记里有多少处助手补写的内容,体检也会单列一份名单。
· 搜索结果会提醒哪些内容还没定稿——笔记里带"待核对/待补"这类标记,或含助手补写的段落时,搜索结果会连同这些标记一起说明,助手据此重新推导,而不是把一篇旧笔记当成结论直接复述(同一篇旧综述被反复当成结论使用,是助手回答雷同的常见原因)。
· Changed
· 助手不再每轮自动把对话整理成记忆卡——此前每轮结束都会把对话内容整理成卡片或索引行。现在未经用户同意,助手不会写这类内容;要不要记会与已有的提问合并成一次询问,所以弹窗不会变多。用户当场说"记一下",或此前给过长期授权,才会直接写入。"这次没记"没有损失:整场对话原文仍由插件自动保存。
· "别处也提到了同一个模式"不再自动算作"互相印证"——那份文档若与卡片出自同一个来源,只是同一件事被写了两遍,不算第二个见证,可信等级不升;体检会把这种情况单列出来。
· README 两版写明"已在 dsh 0.2.0-rc.2 上实测",版本下限仍留在 >=0.1.7-rc.2。
· Fixed
· "工具返回值经过 dsh 校验器校验"此前是假的绿——唯一执行这项校验的断言被一个不存在的路径挡住,整块跳过却仍报 9/9。现在按候选顺序查找,找不到就明确跳过并写明原因。
· "按插件自己的指示改配置"不再让检查一直报错——安装清单把 dsh 设置面板本来就会重写的配置文件当成了固定文件,于是用户保存一次设置,校验摘要就永久过期并被当成故障。现在区分"安装器私有"与"共享":共享文件不做摘要校验、卸载时无条件保留;不用重装即已恢复正常。
· 老版本装过的 profile 不再静默失去"默认预设"——0.1.5 时代的遗留配置行在 0.2.0 里已不存在,而匹配不到时 dsh 只警告并跳过,于是"默认预设"静默失效且没有任何报错。现在安装和引导会把它迁移成现行配置(内容保留、重复执行安全)。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成DSH 数学笔记助手(dsh-math-memory)
English · 简体中文
住在 Obsidian 右侧栏里的数学笔记助手,会记住你上次做到哪里。
普通对话助手聊完就忘。这个插件把笔记和长期记忆都放在你自己的 vault 里,新会话能接着上次继续。所有数据都在本机。
它做什么
- 跨会话记得住。 它把画像、记忆卡、想法备忘录和对话原文都存进 .deepseek/,全是可读可改的 Markdown。
- 一次搜索就找得到。 note_recall 同时搜笔记和所有记忆层,先读最相关的几条再回答。
- 看得见、改得动。 记忆面板列出它记住的东西,每张卡可以确认、标错或归档,回复里也会标出引用了哪张卡。
- 不越界。 笔记留在你的 vault,服务只监听本机,助手没有 shell、不能上网、也没有删除工具。
现在到哪一步
版本 0.8.3,还是试做型。「记住、找到、改得动」这条线已经能完整跑通。还差更难的一半:帮你建立数学理解——知道你卡在哪、下一步该练什么、怎么复用你自己的技巧。那才是 1.0。当前状态和待办放在 docs/README.md。
安装
A. 从 Obsidian 装(推荐)。 设置 → 第三方插件 → 浏览,搜索 DSH Math Notes Assistant,安装并启用。
展开完整文档(README 剩余 1 节)
DSH 数学笔记助手(dsh-math-memory) English · 简体中文 住在 Obsidian 右侧栏里的数学笔记助手,会记住你上次做到哪里。 普通对话助手聊完就忘。这个插件把笔记和长期记忆都放在你自己的 vault 里,新会话能接着上次继续。所有数据都在本机。 它做什么 - 跨会话记得住。 它把画像、记忆卡、想法备忘录和对话原文都存进 .deepseek/,全是可读可改的 Markdown。 - 一次搜索就找得到。 note_recall 同时搜笔记和所有记忆层,先读最相关的几条再回答。 - 看得见、改得动。 记忆面板列出它记住的东西,每张卡可以确认、标错或归档,回复里也会标出引用了哪张卡。 - 不越界。 笔记留在你的 vault,服务只监听本机,助手没有 shell、不能上网、也没有删除工具。 现在到哪一步 版本 0.8.3,还是试做型。「记住、找到、改得动」这条线已经能完整跑通。还差更难的一半:帮你建立数学理解——知道你卡在哪、下一步该练什么、怎么复用你自己的技巧。那才是 1.0。当前状态和待办放在 docs/README.md。 安装 A. 从 Obsidian 装(推荐)。 设置 → 第三方插件 → 浏览,搜索 DSH Math Notes Assistant,安装并启用。首次运行时插件会找到 DeepSeek Harness、装好配置和 vault 模板,并启动服务。 B. 命令行安装。 npm install -g dsh-math-memory dsh-math-memory install --vault "<你的 vault 路径>" dsh --profile notes-assistant --port 3180 C. 手动安装。 从最新 Release 下载 main.js、manifest.json 和 styles.css,放进 <vault>/.obsidian/plugins/dsh-math-assistant/。 环境要求 - Obsidian 桌面版,Node.js 22.5 或更新。 - DeepSeek Harness(@deepseek-ai/dsh,要求 ≥ 0.1.7-rc.2),并配好 DeepSeek 模型。 - 默认端口 3180。普通 dsh web 用 3080,两者可以同时运行。 vault 里放什么 vault/ AGENTS.md 工作约定,自动加载 .deepseek/ memory/profile.md 你是谁、习惯怎么工作 memory/notation.md 记号表 memory/records/ 记忆卡片 memory/episodes/ 对话原文证据 memory/topics/ 主题索引 inbox/ 想法备忘录 capture-policy.md 哪些内容会自动记住 装好之后 打开右侧栏开始聊天。每次会话开始时,助手会读 AGENTS.md 和记忆索引。想看或改它记住了什么,打开记忆面板;想改自动记忆的范围,用面板里的捕获策略一行或插件设置。 项目与开发 - 当前状态与待办:docs/README.md - 两个组件怎么配合:ARCHITECTURE.md - 安装与发布细节:docs/installation.md、docs/release.md - 为什么这样改:docs/changelog.md - 改记忆或检索之前:docs/memory/README.md - 助手的工具:四个笔记工具(note_recall、note_strategy、note_create、note_links),外加文件读写与搜索。 开发命令: npm test # 语法 + 478 项零 token 回归 + 路由回归(69 项路由断言) + 侧栏认证握手回归(8 项,对真实 dsh)+ 侧栏反代回归(24 项)+ 安装器 e2e(漂移检测) npm run qa # 引擎探针(不花 API 钱) node scripts/build-obsidian.mjs # 改共享文件后重建 main.js - 版本:0.8.3 隐私 全部在本机运行:服务只监听 127.0.0.1,记忆是 vault 里的 Markdown,会话索引不出本机。 License MIT
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
maple110011/dsh-obsidian-math
DSH 数学笔记助手dsh-math-memory
相关插件 · 其他
模型破甲清洗YuJunZhiXue/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,148已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,266已汉化DSH
70.7