Obsidian-skills 测试实战:5 个代理技能的三层最小验证法
【免费下载链接】obsidian-skillsAgent skills for Obsidian. Teach your agent to use Obsidian CLI and open formats including Markdown, Bases, JSON Canvas.项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-skills
Obsidian-skills 收录了 obsidian-markdown、obsidian-bases、json-canvas、obsidian-cli、defuddle 五个面向 Obsidian 开放格式的代理技能。本文把验证拆成静态检查、命令闭环、渲染抽查三层,每层给出可直接执行的最小测试集与判定口径。
一个测试库:准备最小验证环境
先给结论:不要造大数据集。五个技能的产出分三类——文本文件、结构化文件、命令输出,一个小测试库即可全覆盖。
- 测试对象是仓库的
skills/目录;产出物统一写入独立的test-vault/。 - 固定夹具:1 篇笔记(含维基链接、标注框、frontmatter)、1 个
.canvas(2 节点 1 边)、1 个.base(1 公式加 1 表格视图)、2~3 个待提取的网页链接。 - 每个技能的 SKILL.md 自带 validate 环节,直接把它当验收清单,不必另起炉灶。
git clone https://gitcode.com/GitHub_Trending/ob/obsidian-skills mkdir -p test-vault/fixtures本文的 obsidian 技能测试用例都遵循最小集原则:每种语法、每个关键字段一条,不重复造变体。
静态验证层:打开 Obsidian 之前就能查
canvas 与 bases 的产物是纯文本文件,结构问题在打开 Obsidian 之前就能暴露。这一层成本最低,任何改动都应当先跑它。
如何判定 Canvas 节点ID是否合法
skills/json-canvas/SKILL.md给了 8 项校验清单,翻车率最高的是重复 ID 与悬空边引用。写成脚本一次性过:
import json, re c = json.load(open("sample.canvas")) node_ids = {n["id"] for n in c["nodes"]} ids = list(node_ids) + [e["id"] for e in c["edges"]] assert len(ids) == len(set(ids)), "duplicate id" assert all(re.fullmatch(r"[0-9a-f]{16}", i) for i in ids) for e in c["edges"]: assert e["fromNode"] in node_ids and e["toNode"] in node_ids最小用例:
- 输入:2 个文本节点加 1 条边的画布,
fromSide取right - 预期:脚本无任何输出、无异常退出
- 判定:把任一 ID 改成 15 位、或将
toNode指向不存在的节点,脚本必须报错,否则校验无效
布局另有两条线:节点间距 50–100px,中等文本节点宽 300–450px,超出即按布局缺陷记录。
Markdown 技能的最小测试集
obsidian-markdown 产出.md,静态层只负责确认语法"写得出来",渲染交给动态层。最小集一条笔记打尽:
- 输入:包含
[[Note#Heading]]、> [!warning]、![[img.png|300]]、#nested/tag的笔记 - 预期:frontmatter 可被 YAML 解析,四类语法各出现一次
- 判定:frontmatter 缺
---或 wikilink 被写成标准 markdown 链接(库内链接必须用[[...]])即判失败
Bases YAML 的三个自检点
skills/obsidian-bases/SKILL.md列了三类高频错误:特殊字符未加引号、公式内外引号不配对、formula.X未定义就被引用。用这份夹具验证:
filters: and: - file.hasTag("task") - 'file.ext == "md"' formulas: days_until_due: 'if(due, (date(due) - today()).days, "")' views: - type: table name: "Active" order: [file.name, formula.days_until_due]- 输入:上述
.base,库内放 3 篇带task标签的笔记,其中 1 篇故意缺due字段 - 预期:缺字段的笔记在公式列显示空值,而不是报错
- 判定:Obsidian 弹 YAML 错误先查引号;公式列整体为空先查过滤条件;函数名拿不准时对照
skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md
命令执行层:CLI 与提取工具的闭环验证
obsidian-cli 依赖运行中的 Obsidian,验收口径是"输入与输出对得上";defuddle 是纯提取工具,口径是"内容完整、无导航残留"。
obsidian-cli 命令测试怎么跑闭环
obsidian create name="T1" content="# T1\nstatus: draft" silent obsidian read file="T1" obsidian property:set name="status" value="done" file="T1" obsidian search query="status: done" limit=5- 输入:依次执行上面 4 条
- 预期:read 的返回与写入内容一致,set 之后搜索命中 1 条
- 判定:命中为 0 时先查
file=的名称解析,再看索引是否更新;silent能避免目标笔记弹窗干扰观察
开发向命令用同一模式:改代码 →plugin:reload→dev:errors应无新增报错 →dev:screenshot截图与上一版比对。
defuddle 的内容提取核对
defuddle parse <url> -p title defuddle parse <url> --md | head -20- 输入:选 2~3 个真实页面,覆盖文章页、文档页、导航重的页面
- 预期:title 非空且与页面主标题一致,
--md输出不含菜单和广告位文字 - 判定:输出 token 数相对原始 HTML 降幅不足 30% 时怀疑提取质量;以
.md结尾的链接不走该工具,skills/defuddle/SKILL.md已注明这类输入应直接取原文
动态渲染层:三个目测检查点
静态检查替代不了眼睛。用 Obsidian 打开测试库,抽查三处:
- 笔记切到阅读视图:标注框图标、
==高亮==是否生效,嵌入图片是否按指定宽度 300px 显示 - 打开
.base:表格视图公式列是否出值,再切卡片视图看布局是否塌陷,多视图渲染是重灾区 - 打开
.canvas:节点位置与坐标一致,边标签正常显示,锚点方向与fromSide/toSide字段一致
每处抽查记一个通过/失败加一张截图编号,后续回归时直接比对同一编号的截图。
回归回路:何时重跑完整验证
有人问 obsidian-skills 如何验证,答案是按层跑,每层都有判据,不用等发版才做全量。三个触发点:
- 改过某个
SKILL.md或其references/(例如skills/obsidian-markdown/references/CALLOUTS.md),重跑对应技能的最小集 - 新增语法或字段时,夹具同步加一条"输入 → 预期",与旧用例一起跑
- 修复失败项后,把同层全部用例重跑一遍再下结论
团队场景下,把静态层的 canvas 脚本挂进流水线即可,一条命令的事,不需要专门的测试框架。
最小验证清单
- canvas 脚本通过:ID 唯一且为 16 位十六进制,边引用全部解析成功
- markdown 夹具在阅读视图中:wikilink、标注框、嵌入、frontmatter 四项全部正常渲染
.base打开无 YAML 错误,缺字段笔记的公式列显示空值而非报错- cli 闭环四命令:read 内容与写入一致,search 恰好命中 1 条
- defuddle:title 非空,
--md输出无导航残留,token 降幅不低于 30%
【免费下载链接】obsidian-skillsAgent skills for Obsidian. Teach your agent to use Obsidian CLI and open formats including Markdown, Bases, JSON Canvas.项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考