🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

数学笔记助手 maple110011/dsh-obsidian-math

DeepSeek Harnessv0.8.3
maple11001116 天前有提交已提供中文文档扫描:含敏感能力

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-memory
npm 源 · dsh-math-memory 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · other
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 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 风格证明工作流工作,内置个人定理索引与问题模板库,并能把关键想法捕捉到备忘录、主动提醒打磨。

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
预览分享卡片长什么样 ↓maple110011/dsh-obsidian-math
分享 · DeepSeek Harness Hub
maple110011/dsh-obsidian-math

DSH 数学笔记助手dsh-math-memory

回到顶部