dsh-tool-notion

DSH PLUGIN记忆与知识

仓库 yuehancn/dsh-tool-notion

记忆与知识 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

为 DeepSeek Harness 提供 Notion 区块与 Markdown 双向转换,离线把导出区块转成 Markdown,或把 Markdown 转成可回写的区块数组。

一句话选型结论

按资料字段整理

dsh-tool-notion 是记忆与知识类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,列出 4 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类记忆与知识 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-10-02 创建于 2026-10-02
README 10.2 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:yuehancn/dsh-tool-notion
  1. 1
    确认版本与运行环境

    兼容的 DSH 版本为 0.2.0-rc.2;版本不匹配时安装会报错。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本0.2.0-rc.2版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

4 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-tool-notion:DeepSeek Harness 里的 Notion 区块与 Markdown 互转工具

  • 区块与 Markdown 双向转换
  • 离线运行,无网络请求
  • 校验数据能否安全往返
  • 查询支持的块类型

适用场景

文件读写

上游标签

blocksconverterdeepseek-harnessdsh-pluginexportmarkdownmcpnotesnotionrich-text

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-10-04): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
  • L4.4_RESOLVED_ARTIFACT 安装版本已解析 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询

风险详情

  • 审查结论 通过
  • 结论说明 vet 静态分析未发现可疑行为,判定为干净(clean)。
  • 风险计数 严重 0 / 高 0 / 中 0
  • 风险详情 未发现严重或警告级问题。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 标注了兼容的 DSH 版本(0.2.0-rc.2),按版本装不容易报错。
  • 列出了 4 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在记忆与知识场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-tool-notion当前 L5 · 运行验证通过 低风险 0 0.2.0-rc.2 有
ruflo L3 · 安装规范通过 低风险 7.4 万 未标注 无
OpenViking L3 · 安装规范通过 低风险 3.9 万 未标注 无
WeKnora L4 · 沙盒安装通过 低风险 3.3 万 未标注 有
distilly L4 · 沙盒安装通过 低风险 2.5 万 未标注 有
EverOS L4 · 沙盒安装通过 低风险 1.3 万 未标注 有

仓库档案

记忆与知识
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方yuehancn仓库 dsh-tool-notion · 默认分支 main
分类记忆与知识knowledge
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-02 · 2026-10-02最后推送 2026-10-02
本站收录2026-10-02首次进入本站目录的时间

README 全文

10.2 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-tool-notion

Notion 区块与 Markdown 的双向转换插件,给 DeepSeek Harness 用。

没有 API 客户端,没有外部依赖。 你从 Notion 导出(或从 API 拿到)一份区块数组,它转成 Markdown;你有一份 Markdown,它转成可以直接回写的区块数组。中间不做网络请求 —— 所以它能离线跑、能进测试、也不会因为一个 token 过期就整个失败。

notion_to_md      blocks  →  Markdown
notion_to_blocks  Markdown →  blocks
notion_validate   两边都收,报出结构问题
notion_status     先说清楚哪些块类型它认得

为什么要单独做这个

看起来是「数组 ↔ 字符串」,写起来才知道反了。

Notion 的段落是一组富文本 run,Markdown 的段落是一个字符串。

Notion:  [ {content:"Hello ",annotations:{}}, {content:"world",annotations:{bold:true}} ]
Markdown: "Hello **world**"

一个段落能有任意多个 run,每个 run 带自己的 bold / italic / strikethrough / underline / code,还能各带各的链接。要变成一行文本,就得在每一个注解边界切开插标记;要从一行文本变回去,就得把相邻的、注解相同的 run 合并才能得到 Notion 原本想要的形状。

这两个方向不是互逆操作。 一个是切分,一个是合并。这就是本插件里代码量的主要来源,也是测试里绝大多数断言在盯的地方。


安装

# cordis.patch.yml
plugins:
dsh-tool-notion:
workDir: "."
outputDir: "notion-output"
dsh plugin add dsh-tool-notion

工具

notion_status

在转换之前先问它。它返回:

  • toMarkdown —— 能转成 Markdown 的块类型列表和它们的标记
  • toBlocks —— 能转回区块的 Markdown 构造
  • annotations —— 认识哪五个注解键
  • callouts —— 五种 callout 标签 ↔ emoji 的对应表
  • directories —— workDir / outputDir 的绝对路径

先看这个,就能把「不支持的块类型」变成一条已知边界,而不是转换到一半发现丢了东西。

notion_to_md

收一份区块数组,产出 Notion 风格的 Markdown。

// 参数(三选一)
{ blocks:        [ … ] }        // 区块数组本身
{ blocksJson:    "[…]" }        // 原始 API 响应(字符串),内部 JSON.parse
{ results: { … } }              // 带 results 的 API 包装对象,会自动认出来

为什么要有 blocksJson: defineTool 会在 execute 跑之前就校验参数类型,所以 blocks 这个参数只能收数组。而 Notion API 返回的是一个带 results 的对象。把对象塞进 blocks 会在你还没机会处理之前就被框架拒掉(invalid arguments: "blocks" must be an array)。所以留了一个字符串入口,让原始响应能原样递进来。

输出会在遇到无法表示的结构时显式报告,而不是默默吞掉。

notion_to_blocks

收 Markdown,产出区块数组。

{ markdown: "# Title\n\nSome **bold** text." }
{ path: "notes/export.md" }        // 相对路径,按 workDir 解析

产出的数组可以直接喂给 Notion 的 append 接口。

notion_validate

不转换,只检查。收 blocks / blocksJson,报出:

  • 区块数组的结构错误(缺 type、payload 形状不对)
  • 不认识的块类型
  • 空 run、缺 content 的 run
  • callout 标签无法回读的情况

要判断的是「这份数据能不能安全往返」,不是「这份数据合不合法」。 所以它盯的是会静默丢信息的地方。


五个注解,和有顺序的标记

annotations 有五个键:bold italic strikethrough underline code。

写标记的时候顺序是定死的,因为顺序变了意思就变了:

场景 写法 为什么
粗体 + 斜体 ***x*** 不是 **__x__,粗体在外、斜体在内
行内代码 最内层 反引号会压制其他所有标记,所以代码必须包在最里面
删除线 ~~x~~

INLINE_MARKERS 表是按从长到短扫的(*** 先于 *,___ 先于 _),否则 ***x*** 会被解析成三个独立的 *。

反斜杠奇偶性决定标记是不是活的 —— 这是行内扫描里最容易写错的一条:

"a \** b** c"    → 7 个字符:反斜杠转义了 *,标记没生效
"a \\** b** c"   → 4 个字符:反斜杠自己被转义,标记是活的

同一个形状,一个反斜杠之差,结果完全不同。测试里两种情况都钉了。

反引号要加宽围栏:如果内容里本身有反引号,外面的围栏就得比里面长。行内代码和围栏代码块都是这个规则。


Callout 的标签 ↔ emoji 必须是双射

这是开发过程中测试自己抓出来的一个真 bug,值得单独说。

Markdown 写 callout 用的是语义标签:

> [!WARNING]
> 这会删库。

Notion 存 callout 用的是图标 emoji。所以中间要做一次映射。第一版写了单向映射:解析时把 WARNING 存进 icon,回写时又把 emoji 写进 icon,再读回来时期待看到标签 —— 结果每一个 [!WARNING] 都变成了 [!NOTE]。

一个警告被静默降级成了提示。这种 bug 不会报错、不会崩,只会在某天有人因为没看到警告而删了库。

修法是把它做成真正的双射:

const CALLOUT_EMOJI = { NOTE: "📘", TIP: "💡", IMPORTANT: "❗", WARNING: "⚠️", CAUTION: "🛑" };
const EMOJI_CALLOUT = Object.fromEntries(
Object.entries(CALLOUT_EMOJI).map(([label, emoji]) => [emoji, label])
);

function calloutLabel(payload) {          // 读:emoji → 标签
const icon = payload?.icon;
const emoji = typeof icon === "string" ? icon : icon?.emoji;
if (emoji === undefined) return "NOTE";
return EMOJI_CALLOUT[emoji] ?? "NOTE";  // 不认识的 emoji 退回 NOTE,不是丢 callout
}

五个标签全部在测试里钉了往返。另外还钉了两种输入形状:icon 是裸字符串、icon 是 { type:"emoji", emoji } 对象 —— Notion 两种都会返回。

通用的教训:凡是「语义值 ↔ 表示值」的映射,都要有反向表和反向断言。单向映射静静吃掉信息的方式是无声的。


parseNotionId 要认带 slug 的 URL

Notion 分享链接把 id 粘在人类可读的 slug 后面:

https://www.notion.so/My-Page-1f2e3d4c5b6a7c8d9e0f1a2b3c4d5e6f
^^^^^^^ 这一段不是 hex

所以不能拿最后一段去匹配 ^[0-9a-f]{32}$ —— 会返回 null。正确做法是先剥掉 query 和 hash,再在整串里找 32 位 hex(或者带连字符的标准 UUID 形式):

const withoutQuery = text.split(/[?#]/u)[0];
const match = /([0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/iu
.exec(withoutQuery);

一个被测试逼出来的框架规则

defineTool 的 JSON schema 里,每一个嵌套的 { type: "object" } 都必须显式声明 additionalProperties —— 固定形状写 false,自由映射写 true。不写就抛:

JsonSchemaError: … additionalProperties must be explicitly true or false

这个坑在本插件里踩了三次:嵌套的 directories 对象、blocks 数组的 items、以及 byType 这种自由映射。三次都是同一个错误,只是位置不同。数组的 items 也算嵌套对象,也要声明。


测试

node _test/run-all.mjs

三个套件跑在各自独立的子进程里 —— 每个套件都会用 new Function 重建一份插件副本,同进程会互相污染模块缓存。

notion logic:        230 passed, 0 failed
notion integration:  117 passed, 0 failed
notion end to end:    56 passed, 0 failed

共 403 条断言。

三个套件的分工:

  • test-logic.mjs(230) —— 纯函数白盒。行内扫描(含反斜杠奇偶性)、run 合并、注解边界切分、围栏加宽、callout 双射、缩进层级、块校验。
  • test-integration.mjs(117) —— 通过 defineTool 注册后的真实工具调用。参数 schema 形状(required 被提到顶层、parameters.properties 才是子项)、注册开关、错误信息、workDir 解析规则。
  • test-e2e.mjs(56) —— 一份故意难伺候的 "Deploy Runbook" 文档,从 Markdown 一路走到区块再走回来。里面塞了:带 # 注释的 shell 围栏、嵌套围栏、含代码的粗体、粗体链接、嵌套清单、callout、字面星号。

一条钉住的路径规则

path 参数按 workDir 解析 —— 绝对路径会被拼到 workDir 后面,而不是被当成绝对路径使用。这不是 bug,这正是「读不到配置根目录之外」的保证。集成测试里有一条断言专门钉这个行为,免得以后有人「顺手修好」它。

白盒断言的代价与收益

测试通过 new Function 把插件的内部函数(parseInline、mergeRuns、calloutLabel …)取出来直接断言。代价是 harness 要维护一份 INTERNALS 清单,漏一个就是 plugin.X is not a function。收益是不用为了测一个纯函数去套一层 JSON 管道 —— 上面那个 callout bug 就是这么被抓到的。


目录

dsh-tool-notion/
├── lib/index.js               插件本体(4 个工具 + 全部转换逻辑)
├── cordis.patch.yml           插件加载配置
├── _test/
│   ├── harness.mjs            用真实 dsh-tools 重建 apply,并暴露内部函数
│   ├── test-logic.mjs         230 条
│   ├── test-integration.mjs   117 条
│   ├── test-e2e.mjs            56 条
│   └── run-all.mjs            三个套件各自跑在子进程
├── LICENSE                    MIT
└── README.md

License

MIT © yuehancn


本插件属于 DeepSeek Harness 工具插件系列。同一系列还有 dsh-tool-comfyui、dsh-tool-gzh-publisher、dsh-tool-ocr、dsh-tool-media、dsh-tool-subtitle、dsh-tool-invoice、dsh-tool-qrcode、dsh-tool-epub、dsh-tool-podcast、dsh-tool-mining。

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-tool-notion 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:yuehancn/dsh-tool-notion` 即可。

dsh-tool-notion 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-tool-notion 安全吗?

低风险。vet 静态分析未发现可疑行为,判定为干净(clean)。

dsh-tool-notion 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-tool-notion 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.0-rc.2。

dsh-tool-notion 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-tool-notion 有哪些功能?

区块与 Markdown 双向转换、离线运行,无网络请求、校验数据能否安全往返、查询支持的块类型。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

1 条
不同作者的仓库分开列,请确认你要装的是哪一个
记忆与知识
按星标排序,可作替代方案

ruflo

ruflo

L3 · 安装规范通过 7.4 万 星

OpenViking

OpenViking

面向 DeepSeek Harness 的 OpenViking 记忆与上下文插件:pre-step 自动召回与画像注入、会话捕获、`vik

L3 · 安装规范通过 3.9 万 星

WeKnora

WeKnora

把 WeKnora 知识库接入 dsh 的四个只读工具:列出知识库、混合检索原文片段、按顺序还原单篇文档,以及直接取用 WeKnora 自己

L4 · 沙盒安装通过 3.3 万 星

distilly

distilly

Distilly — Distill how they think into reusable Skills for any Agent o

L4 · 沙盒安装通过 2.5 万 星

EverOS

EverOS

L4 · 沙盒安装通过 1.3 万 星

MemOS

MemOS

L4 · 沙盒安装通过 1.2 万 星

yuehancn 的其它插件

6 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-10-04。