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

MD 笔记 XieZongChen/dsh-md-notes

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

DeepSeek Harness(DSH)的笔记插件,带完整 MD 笔记管理器和 MD 笔记编辑器,能把对话内容快速存成笔记,还能同步到 Git 仓库来维护。

41.1/100
综合分
17
GitHub 星标
245
npm 周下载
—/5
用户评分

数据截至 2026/9/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-md-notes
npm 源 · dsh-md-notes 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · market
装得上吗
静态安装检查通过
未做真实安装
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 39 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-md-notes @ 0.13.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 02:20:18

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 69 处,展示前 43 条)
  • 发起网络请求
    lib/index.js:176
    const requestApproval = (reason) => approval.request({
  • 删除本地文件递归
    lib/host/git.js:40
    await rm(dir, { recursive: true, force: true });
  • 写入本地文件
    lib/host/git.js:41
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/host/git.js:48
    await writeFile(join(dir, `${stem}.base.md`), baseContent, 'utf8');
  • 写入本地文件
    lib/host/git.js:50
    await writeFile(join(dir, `${stem}.remote.md`), remoteContent, 'utf8');
  • 写入本地文件
    lib/host/git.js:55
    await writeFile(join(dir, `${stem}.local-deleted`), '', 'utf8');
  • 读取本地文件
    lib/host/git.js:57
    else if (!existsSync(join(notesDir, name))) {
  • 写入本地文件
    lib/host/git.js:58
    await writeFile(join(dir, `${stem}.local-deleted`), '', 'utf8');
  • 删除本地文件递归
    lib/host/git.js:69
    await rm(join(notesDir, CONFLICTS_DIR), { recursive: true, force: true });
  • 读取本地文件
    lib/host/git.js:88
    const parsed = JSON.parse(readFileSync(join(repoDir, '.git', ...SYNC_STATE_PATH), 'utf8'));
  • 读取本地文件
    lib/host/git.js:99
    synced = JSON.parse(readFileSync(join(repoDir, '.git', ...SYNC_STATE_PATH), 'utf8')).synced ?? [];
  • 写入本地文件
    lib/host/git.js:106
    writeFileSync(join(repoDir, '.git', ...SYNC_STATE_PATH), JSON.stringify({ synced }, null, 2));
  • 读取本地文件
    lib/host/git.js:231
    const raw = await readFile(join(repoDir, MAPPING_NAME), 'utf8');
  • 读取本地文件
    lib/host/git.js:290
    names = (await readdir(srcDir)).filter((n) => n.endsWith('.md'));
  • 读取本地文件
    lib/host/git.js:302
    const st = await stat(to).catch(() => undefined);
  • 发起网络请求
    lib/host/git.js:369
    await dedup.fetch(ctx, repo);
  • 发起网络请求
    lib/host/git.js:443
    async fetch(ctx, repo) {
  • 删除本地文件
    lib/host/git.js:555
    await rm(join(remoteDir, name));
  • 读取本地文件
    lib/host/http.js:305
    const data = await readFile(svgPath);
  • 读取本地文件
    lib/host/context-inject.js:92
    notes.push({ path: abs, content: await readFile(abs, 'utf8') });
  • 读取本地文件
    lib/host/sessions-repair.js:210
    const text = decompressFrames(await readFile(file));
  • 写入本地文件
    lib/host/sessions-repair.js:218
    await copyFile(file, backup, fsConstants.COPYFILE_EXCL);
  • 写入本地文件
    lib/host/sessions-repair.js:224
    await writeFile(tmp, repack(rewritten.text));
  • 写入本地文件
    lib/host/sessions-repair.js:225
    await rename(tmp, file);
  • 读取本地文件
    lib/host/sessions-repair.js:238
    projects = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    lib/host/sessions-repair.js:247
    sessions = await readdir(join(root, project), { withFileTypes: true })
  • 读取本地文件
    lib/host/sessions-repair.js:256
    files = (await readdir(join(root, project, session))).filter(isSessionLog);
  • 读取本地文件
    lib/host/sessions-repair.js:265
    const before = await readFile(file);
  • 读取本地文件
    lib/host/sessions-repair.js:270
    for (const kind of sourceKinds(decompressFrames(await readFile(file)))) {
  • 发起网络请求
    lib/host/update.js:39
    const res = await fetch(REGISTRY_URL, { signal: ac.signal });
  • 读取本地文件
    lib/host/notes.js:26
    const raw = await readFile(join(dir, META_NAME), 'utf8');
  • 写入本地文件
    lib/host/notes.js:36
    await writeFile(join(dir, META_NAME), JSON.stringify(meta, null, 2), 'utf8');
  • 写入本地文件
    lib/host/notes.js:44
    await mkdir(dir, { recursive: true });
  • 读取本地文件
    lib/host/notes.js:47
    entries = await readdir(dir);
  • 读取本地文件
    lib/host/notes.js:66
    readFile(join(dir, n), 'utf8'),
  • 读取本地文件
    lib/host/notes.js:67
    stat(join(dir, n)),
  • 写入本地文件
    lib/host/notes.js:92
    await mkdir(dir, { recursive: true });
  • 读取本地文件
    lib/host/notes.js:95
    content = await readFile(join(dir, name), 'utf8');
  • 写入本地文件
    lib/host/notes.js:105
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/host/notes.js:106
    await writeFile(join(dir, name), content, 'utf8');
  • 写入本地文件
    lib/host/notes.js:124
    await mkdir(dir, { recursive: true });
  • 读取本地文件
    lib/host/notes.js:129
    await stat(join(dir, name));
  • 删除本地文件
    lib/host/notes.js:149
    await rm(join(dir, name), { force: true });
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/cosmokit@deepseek-ai/dsh-agent@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-test-runtime@deepseek-ai/dsh-client-ui-chat@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-input-trigger
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • MD笔记管理
  • MD笔记编辑
  • 对话存为笔记
v0.13.02026-09-11内容较长已截断
· 破坏性变更 · 升级到 dsh ≥ 0.1.5-alpha.1 后,在旧版 dsh 上用过 @ 笔记引用的历史会话打不开了:dsh 0.1.5-alpha.1 把会话日志格式升到 V3,V2→V3 迁移会用白名单校验消息的 source.kind,而旧版插件注入的上下文用的是自定义 kind 'md-notes',不在白名单里,所以任何含这类事件的日志都会被整体拒绝(无法安全转换未分类的消息来源)。根因在 dsh 的格式迁移策略,插件修不了已经写好的日志(日志文件归 dsh 管,插件只产生事件,从不碰存储)。缓解办法:升级 dsh 前先导出或归档用过 @ 引用的会话,或者等 dsh 上游把 'md-notes' 加进迁移白名单(见 docs/TODO.md 顶部的兼容性条目)。从这个版本起注入改用官方 source 结构,新会话不受影响——新版插件在旧版 dsh 上写的会话(V2 日志)也能顺利迁移。设置面板新增一键「修复旧会话」操作(见下方「新增」),就地重写受影响的日志。 · 新增 · 设置:「修复旧会话」:一键扫描所有本地会话日志,把旧版插件写入的 md-notes 消息来源改写成官方插件最小形式(按 v0→v1 迁移的精确键集丢弃 path 等多余成员;幂等——再跑一遍会清掉上一轮的中间产物),恢复 dsh 0.1.5+ 拒绝打开的历史记录的可读性。每份原件都在旁边备份(*.dsh-md-notes-repair.bak),替换是原子操作,无需重启;结果会报告扫描数、修复数、失败项,以及仍可能卡住会话的 dsh 原生旧来源 kind。见 docs/usage.md §6。 · dsh 版本对齐规则(仅稳定版):从现在起插件只对齐 dsh 的 rc 和(未来的)正式版——dsh 的 npm latest dist-tag 指向 rc,用户实际装的就是它;alpha 不再逐版本检查(一次 rc 检查覆盖整条线的 alpha 范围;只在用到某个 alpha 引入的能力或确认破坏性变更时才抽查具体 alpha)。见 README 兼容性章节和 docs/compatibility.md。 · @ 笔记芯片点击预览:在输入框里点击已插入的笔记芯片,发送前会在右侧栏查看器里打开该笔记(dsh 0.1.5+ 的引用预览手势);没有右侧栏的版本点击行为不变。见 docs/usage.md §4.1。 · @ 候选行现在以插件 logo 打头,和芯片一致(之前是通用文件图标)。 · 搜索结果「在侧栏查看」:笔记管理器搜索结果里的每条笔记都多了一个面板操作——在右侧栏笔记查看器里打开该笔记(绝对文件地址经 openResource 路由;同一笔记复用其标签页)并关闭全屏管理器。需要 dsh 0.1.5+ 的右侧栏;旧版本上该操作隐藏。见 docs/usage.md §9。 · 预览中渲染本地图片:笔记里的本地路径图片(、../shot.png、绝对路径)会在管理器预览和侧栏查看器里内联显示——经 MarkdownText 的 pathImages 词汇改写为同源鉴权的 /api/file URL(目标按笔记自身目录解析)。在 dsh /… 上不启用
v0.12.02026-09-06
· What's Changed · Added · AI conflict resolution: the push-blocked and update-conflict dialogs gain an "AI resolve" action — a conversation is created in the conflicting workspace and the local/base/remote versions of each conflicting note are handed to the model for a semantic merge (undecidable points are asked back via ask_user); when done the AI requests the push through dsh's native approval panel, and the remote is only touched after you confirm. See docs/ai-conflict.md. · Note search: the notes manager gains a search box in its top bar — full-text search across every workspace's notes (titles and bodies, case-insensitive; space-separated keywords combine with AND). Results are grouped by workspace with matched-line snippets and keyword highlighting; clicking a hit opens the note in the editor on that line with the keyword selected. See docs/usage.md §2 "Searching notes". · The settings panel's Git-mode dropdown now opens the harness-style custom menu (portaled card, check-marked rows, outside-click/Escape dismissal) instead of the OS-native select popup, and text-input borders/focus follow the harness settings form. See docs/usage.md §6. · Fixed · Fixed saves stalling 10+ seconds on slow networks: the per-workspace git status requests fired when the manager opens were parallel (on shared-repo mode the server serializes them anyway, so the extra connections just sat parked); together with the auto-pull they could occupy every same-origin browser connection, queueing the save POST behind git fetches. Statuses are now fetched strictly one at a time. · Fixed the git clone being permanently wedged after "merge remote & retry" hit a merge conflict (an uncleaned MERGE_HEAD broke every later sync); the leftover merge is now aborted automatically and the clone recovers. --- · Added · AI 解决 Git 冲突:推送拦截与更新冲突的确认弹窗新增「AI 解决」按钮——在冲突工作区 新建对话,把冲突笔记的本地版/基线/远端版提交给 AI 做语义合并(无法确定的合并点会向 你提问);完成后 AI 经 dsh 原生审批面板请求推送,确认后才覆盖远端。详见 docs/ai-conflict.md。
v0.11.02026-09-04
· [0.11.0] - 2026-09-04 · Breaking · Removed the unused gitSuggest API method (and its client wrapper): nothing in the plugin ever called it, and it exposed workspace paths to any caller. · Removed the route config option. The HTTP API prefix is now the fixed constant /plugins/md-notes on both sides: the browser frontend always hardcoded it, so overriding the backend prefix only severed the frontend↔backend link. Existing configs carrying a route key keep loading (schemastery passes unknown keys through; the value is ignored). · Added · New checkUpdate config (default true): set it to false and the host never contacts registry.npmjs.org — for offline or managed deployments the update check used to be an unconditional outbound call. · Fixed · Fixed two Git first-sync defects on a fresh device (fresh clone + empty notes dir): ① pulling did nothing — an absent local file read as a local edit (skipped), and the auto-pull short-circuited on "no new remote commits", so remote notes never came down; ② pushing from that state mirror-deleted the ENTIRE remote without confirmation. The last-synced baseline is now empty until the first completed sync (a marker persisted inside the clone's .git/, never committed): the first pull brings all remote notes down, and the first push blocks with remote-changed asking for confirmation. · Fixed the sidebar footer entries squeezing/overflowing each other ([#2]): dsh's .footerActions lays its width:100% children (the default-bundled cordis entry and the notes entry) out in one non-wrapping row. The plugin now stacks them via a [data-slot]-anchored rule — one declarative of its own (auto-removed on unload), no ancestor inline styles, visually unchanged when only one entry is present. (The root fix belongs upstream; see docs/TODO.md.) · Security: the plugin's HTTP API and icon routes now run behind the same trust fence as dsh's official /api channel (connection.requestRejection): requests without an authenticate
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-md-notes DSH 第三方插件(bundle):MD Notes Manager 用户指南 · 功能 · 架构 · 上下文 · AI 冲突 · 路线图 · 更新日志 概览 这是给 DeepSeek Harness(DSH)用的笔记插件。它提供完整的 MD 笔记管理器和 MD 笔记编辑器,让你把对话内容快速记成笔记。笔记可以同步到 Git 仓库来维护。 适合谁用:想要本地、基于文件的笔记(不用数据库,不上云)的 DSH Web 用户——一键把对话记成笔记,随时继续编辑 .md,再用 Git 仓库备份 / 同步。 当前功能: - 侧边栏笔记入口 → 全屏笔记管理器:按工作区列出笔记(分组、可折叠),支持 markdown 编辑 / 预览、保存、删除(页内确认)、一键新建。 - 笔记搜索:管理器顶栏的搜索框会扫描每个工作区——标题和正文都搜(空格分隔关键词,AND 逻辑,不区分大小写);结果按工作区分组,命中行高亮,点击命中项会在编辑器中打开该笔记并定位到那一行、选中关键词;每条笔记还有「在侧边栏查看」操作(dsh ≥ 0.1.5-rc)。
展开完整文档(README 剩余 1 节)
dsh-md-notes

DSH 第三方插件(bundle):MD Notes Manager

用户指南 · 功能 · 架构 · 上下文 · AI 冲突 · 路线图 · 更新日志

概览

这是给 DeepSeek Harness(DSH)用的笔记插件。它提供完整的 MD 笔记管理器和 MD 笔记编辑器,让你把对话内容快速记成笔记。笔记可以同步到 Git 仓库来维护。

适合谁用:想要本地、基于文件的笔记(不用数据库,不上云)的 DSH Web 用户——一键把对话记成笔记,随时继续编辑 .md,再用 Git 仓库备份 / 同步。

当前功能:

- 侧边栏笔记入口 → 全屏笔记管理器:按工作区列出笔记(分组、可折叠),支持 markdown 编辑 / 预览、保存、删除(页内确认)、一键新建。
- 笔记搜索:管理器顶栏的搜索框会扫描每个工作区——标题和正文都搜(空格分隔关键词,AND 逻辑,不区分大小写);结果按工作区分组,命中行高亮,点击命中项会在编辑器中打开该笔记并定位到那一行、选中关键词;每条笔记还有「在侧边栏查看」操作(dsh ≥ 0.1.5-rc)。
- 右侧边栏笔记查看器(dsh ≥ 0.1.5-rc):对话里的文件链接、文件树、搜索、@ chip 点击,都会在 dsh 右侧可停靠边栏里以 markdown 渲染打开笔记;互链会跳到新标签页;正文里的本地图片内联渲染(编辑仍在管理器里进行)。
- 助手消息操作(复制按钮旁边)→ 选一条笔记或新建一条,把这段对话(用户提问 + 回答)立刻追加进去——文本直接从对话本身抓取,所以不用等;小节标签已本地化(不抓取推理内容——只抓最终回答)。
- 在对话中引用笔记(@):输入 @ 挑选笔记(跨工作区也能选,候选行带插件 logo);点击插入的 chip 会在右侧边栏预览笔记;发送时插件后端会把每条笔记的内容注入模型上下文,模型不用去读文件就能引用。引用行只带相对路径,绝不带本地绝对路径。
- Git 同步(可选,由 URL 驱动):共享仓库模式(所有工作区共用一个仓库,按工作区分文件夹)或独立仓库模式(每个工作区单独配置:URL + 分支 + 子路径)。Push = 镜像同步(包含删除),Update = 拉取并三方确认冲突,打开时自动拉取,合并远端后重试。每个工作区在管理器里显示一张 Git 同步卡片:「已同步」/「N 条未推送」状态,远端有新提交时还会给出提示。
- 笔记写入互斥锁:对同一篇笔记的写入跨会话加锁 —— 写入完成前,侧边栏条目、选择器和管理器保持一致。
- 设置面板(dsh Settings → MD Notes):模式、仓库 URL/分支/子路径、自动拉取、提交作者 —— 表单控件沿用 dsh 风格。
- 主题与国际化:基于 token 的颜色(浅色/深色),界面文案跟随 dsh 的语言(中文 / 英文),错误消息本地化。
- 更新通知:npm 上有更新版本时,显示黄色「有可用更新」标签。

路线图(见 docs/TODO.md):可视化 Git 冲突渲染与解决、笔记能力增强(目录 / wiki 链接与反向链接)、交互体验打磨(编辑器未保存提醒、保存快捷键等)。

兼容性

dsh 迭代很快,且不提供向后兼容,所以固定的 dsh 版本只能匹配固定的插件版本。已验证的组合列在下面(完整适配历史见 docs/compatibility.md):

版本对齐规则:插件只对齐 dsh 的稳定版本 —— rc 和(未来的)final 发布。dsh 在 npm 上的 latest dist-tag 指向 rc,用户实际安装的就是它;alpha 每一两天发一次,大约一周内就会被同一线的 rc 取代,所以不按版本逐个适配 —— 检查一次 rc 就覆盖整条线的 alpha 范围,只有插件想用某个 alpha 引入的能力,或要确认破坏性变更时,才检查具体 alpha。因此下表只列 rc/final 版本(早期 alpha 行作为历史保留)。

| 插件版本 | dsh 版本 | 验证日期 |
| 0.13.0 | 0.1.5-rc.2 | 2026-09-11 |
| 0.12.0 | 0.1.3-alpha.2 | 2026-09-07 |
| 0.11.0 | 0.1.3-alpha.2 | 2026-09-07 |

插件不锁定到某个主线提交;需要固定组合时,在安装时锁定插件版本(例如 dsh plugin --profile web add dsh-md-notes@0.13.0)。运行时依赖(@deepseek-ai/、react)声明为可选 peer 依赖,从 dsh 安装中解析。

未发布版本(NEXT_VERSION):适配 dsh 0.1.7-rc.1(Session V4 由生产者持有消息源;16 图标系列更名为 *Medium),并要求 dsh ≥ 0.1.7-rc.1 —— 0.1.7 用 SettingsForms + volatile Config 字段取代了 ctx.settings.register(),为它构建的插件在更旧的 dsh 上无法加载。在它发布之前,请在 dsh 0.1.5-rc.2 上使用 0.13.0。

安装 / 卸载

前置条件:已安装 dsh 命令行,目标配置档为 web。

从 npm 安装(推荐):

dsh plugin --profile web add dsh-md-notes

然后重启 dsh web(bundle 层和客户端包元数据会缓存在进程里,必须重启才能生效)。

升级:

dsh plugin --profile web update dsh-md-notes

需要重启 dsh web 才能生效。

卸载:

dsh plugin --profile web remove dsh-md-notes

从源码开发/调试:在插件项目的父目录下运行 dsh plugin --profile web add ./dsh-md-notes。

快速开始

1. 安装插件(见上),重启 dsh web。
2. 新建笔记:点击侧边栏底部的笔记入口(在 Settings 上方)→ 在工作区行上点击 + → 在对话框中输入标题(默认「Untitled note <date>」)和可选的文件名 → 在编辑器中输入内容 → Save。
3. 捕获对话:在任意助手回答下方,点击笔记图标(复制按钮旁边)→ 选择目标笔记(也可以当场新建)→ Write to note。用户提问和回答会以「<session title> -- <timestamp>」小节的形式追加到笔记中。
4. 引用笔记:在聊天输入框输入 @ 选择笔记(支持跨工作区);发送时笔记内容会自动进入模型上下文。

笔记文件存放在各工作区的 .dsh-notes/ 目录(<workspace>/.dsh-notes);你可以用任意编辑器直接打开和编辑。Git 同步是可选的——把插件指向一个仓库 URL,它就会保持笔记同步(共享仓库或按工作区独立仓库)。

插件能做的全部事情——笔记管理器、捕获对话、Git 同步(共享 / 按工作区独立仓库)、推送/更新、冲突处理、设置面板——见用户指南。

配置

所有选项都是插件 Config 键,可在配置档的 cordis.patch.yml 中覆盖(补丁会替换该行的整个 config):

- id: md-notes
config:
gitMode: 'off' # 'off' | 'shared' | 'own'
gitAutoPull: true # pull remote before opening a note

HTTP API 前缀固定为 /plugins/md-notes(浏览器前端硬编码了同一个常量,所以刻意不做成可配置)。

| 键 | 默认值 | 含义 |
| gitMode | 'off' | Git 同步模式:'off' 关闭 / 'shared' 共享仓库 / 'own' 按工作区独立仓库。 |
| gitAutoPull | true | 打开笔记前先拉取远程。 |
| checkUpdate | true | 允许后端向 registry.npmjs.org 查询插件是否有新版本;设为 false 则完全离线。 |

本插件的配置中没有环境变量,也没有密钥。

已知限制

- 不支持 headless / SDK / ACP 部署:插件依赖 webServer 服务,只有 dsh 的 web-app bundle 才提供该服务,所以像 dsh --profile sdk 这样的配置档永不加载(那里既没有笔记也没有记忆)。解锁条件: docs/TODO.md §0.9。
- 图片不会通过 Git 同步:图片放在 .dsh-notes/assets/,而 Git 同步只镜像 .md(git.ts 里的同步/冲突逻辑是按文本设计的)。图片目前是本地文件——在另一台设备上看不到。
- 仅限 Web 形态:右侧边栏的笔记查看器需要 dsh ≥ 0.1.5-rc;在更旧的版本上这部分会静默禁用。
- 笔记按工作区划分:没有跨项目的个人库;每条笔记都属于某个工作区。
- 锁定 dsh 版本范围:本插件要求 dsh ≥ 0.1.7-rc.1(0.1.7 替换了 settings API,并引入 volatile schema;在更旧的 dsh 上用 0.13.0)。dsh 不保持向后兼容——升级 dsh 前先读 Compatibility。

权限与数据

- 文件系统:以纯 .md 文件(外加 meta.json sidecar)读写笔记,位置在每个工作区的 .dsh-notes 目录下(笔记与工作区绑定);git 操作只触碰 $DSH_HOME/md-notes-repos/ 下由插件管理的克隆。
- 网络:一个回环 HTTP API(POST <route>,浏览器 ↔ 本地 dsh 服务器),以及从同一来源提供的图标;唯一的其他出站调用是可选的 npm 更新检查(registry.npmjs.org,设 checkUpdate: false 可完全关闭)。无遥测,无其他外部调用。
- 凭据:不收集、不传输任何凭据。

故障排查

| 现象 | 修复 |
| 安装/升级后改动不生效 | 重启 dsh web——bundle 层和客户端元数据缓存在进程里。 |
| 图标看起来是旧的 | 强制刷新页面;图标以 no-cache 提供,每次请求都反映 assets/dsh-md-notes.svg。 |
| 插件不加载 | 检查层:dsh --profile web --dump-config,找 md-notes 那一行。 |
| 从 git 安装且 add 失败 | pnpm ≥10 默认拦截构建脚本;在配置档的 pnpm-workspace.yaml 里把打印出的包键加到 allowBuilds 下,然后重新运行 add。 |
| 笔记无法创建/保存 | 确认工作区的 .dsh-notes 指向一个存在且可写的目录(先在 dsh 侧边栏创建工作区)。 |
| 感觉有点慢 | 用 docs/debug.md 里的浏览器探针抓请求耗时——以秒为单位区分排队时间与服务器时间。 |

回滚:dsh plugin --profile web remove dsh-md-notes 恢复之前的状态(笔记文件不受影响)。

贡献

详见 CONTRIBUTING.md。

仓库结构

| 路径 | 内容 |
| src/ | 源代码(Node 后端 + 浏览器前端) |
| src/host/ | 笔记领域(notes.ts)+ Git(git.ts)+ HTTP 层(http.ts)+ 上下文注入(context-inject.ts)+ 写互斥锁(keyed-lock.ts) |
| src/client/ | 浏览器前端:入口(index.ts)+ features/ 下的功能模块(每个功能一个目录;当某个功能大到单文件放不下时,会拆出功能私有的 components/ 和 hooks/ 子目录 —— 这种模式见 NotesManager/,以及 docs/architecture.md) |
| src/client/features/locales/ | 中英文 UI 词典(dsh locale 命名空间 md-notes) |
| assets/ | 插件图标(SVG 源文件 + PNG) |
| docs/ | 文档:usage.md/usage.zh.md(用户指南)、features.md(功能说明)、architecture.md、context.md(@ 引用)、git.md(Git 同步)、ai-conflict.md(AI 冲突解决)、state.md / write-lock.md(状态与写互斥设计)、manager-redesign.md(管理器重构)、search.md(笔记搜索设计)、debug.md(性能)、compatibility.md / compatibility.zh.md(dsh ↔ 插件版本兼容矩阵,中英双语)、TODO.md |
| scripts/ | 开发工具(例如 link-deps.mjs) |
| lib/ | 构建产物(已 gitignore;npm 发布的内容) |

许可证与安全

基于 MIT License 授权(见 LICENSE)。

安全问题:请通过仓库的 Security Advisory 私下报告,不要开公开 issue,这样在披露之前还有机会处理。
预览分享卡片长什么样 ↓XieZongChen/dsh-md-notes
分享 · DeepSeek Harness Hub
XieZongChen/dsh-md-notes

DeepSeek Harness(DSH)的笔记插件,带完整 MD 笔记管理器和 MD 笔记编辑器,能把对话内容快速存成笔记,还能同步到 Git 仓库来维护。

回到顶部