1实现原理 · 为什么它能做到
它不是单个 SKILL.md,而是 6 个并列 skill 组成的集合,按 Obsidian 的载体类型分工:Markdown、Bases、Canvas 三种开放格式各一个,vault 操作、网页抽取、模板渲染各一个。
"description": "Create and edit Obsidian vault files including Markdown, Bases, and Canvas. Use when working with .md, .base, or .canvas files in an Obsidian vault."
实现方式是把 Obsidian 的格式规格内联进 SKILL.md:模型不是靠『自由发挥』写笔记,而是照抄 skill 内给出的 schema、运算符表和陷阱说明产出合法文件。
Base files use the `.base` extension and contain valid YAML.
每个格式类 skill 都把『校验』写进工作流结尾,要求模型自查结构与引用完整性,而不是交出去就算完。
**Validate**: Confirm all IDs are unique and all edge references resolve to existing nodes
vault 操作走官方 Obsidian CLI,而不是直接改文件系统——因此它作用的是一台正在运行的 Obsidian 实例。
Use the `obsidian` CLI to interact with a running Obsidian instance. Requires Obsidian to be open.
CLI 的参数/开关语法被显式规定(k=v 取值、裸开关为布尔、多行用 \n 与 \t),减少模型瞎拼参数导致的误操作。
**Parameters** take a value with `=`. Quote values with spaces:
把两个外部单用途 CLI 纳入工作流:defuddle 负责把网页抽成干净 Markdown,knap 负责用模板把 JSON/CSV 批量渲染成笔记,两者可管道串起来。
defuddle parse https://example.com/article --md --json \ | knap render template.md --data - -o note.md
写入类操作有显式的『覆盖需授权』契约,避免静默毁坏既有笔记。
Existing files require `--overwrite`, including during a dry run.
发布形态是跨宿主插件/技能包:README 分别给出 Claude Code(/plugin marketplace)、npx skills、Codex(~/.codex/skills)、OpenCode(~/.opencode/skills)四条落盘路径,并提示整仓克隆而非只拷 skills/。
Do not copy only the inner `skills/` folder — clone the full repo so the directory structure is `~/.opencode/skills/obsidian-skills/skills/<skill-name>/SKILL.md`.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | obsidian(官方 Obsidian CLI,需本机 Obsidian 处于运行状态) |
| cli | defuddle(npm 全局 CLI,网页正文抽取) |
| cli | knap(npm 全局 CLI,要求 Node.js 20+,模板渲染/批量生成) |
| network | 任意用户给定 URL(defuddle parse 会实际抓取该网页) |
| network | Obsidian 官方文档站(SKILL.md 中作为『最新命令清单』的指针,非运行时抓取) |
| network | JSON Canvas 规范与仓库(文档引用) |
4风险提醒 风险提醒:黄色 · 留意使用
- 抓回的网页正文是不可信输入,未被设为防线 — defuddle 的产物(第三方网页文本)会经 knap 渲染或直接写入 vault,SKILL.md 未要求把该内容当数据而非指令处理;若网页内嵌提示词,存在把内容写偏/写进 vault 的可能。
- obsidian eval / dev:* 权限高且作用于真实 vault — SKILL.md 列出 'obsidian eval code=...' 与 'additional developer commands including CDP and debugger controls'。虽为官方功能、由用户驱动,但一旦 agent 误用,作用对象是用户的全部笔记数据。
- 默认目标是『最近聚焦的 vault』 — obsidian-cli 原文:不指定 vault= 时命令作用于最近聚焦的 vault。多 vault 用户存在写错库的风险,需靠 vault=<name> 显式指定。
- 依赖三个仓外 CLI,其内部行为不可从本仓审计 — obsidian(应用内)、defuddle、knap 的源码不在本仓(verification 中记为 unlocatable),且需 `npm install -g`——供应链判断需另查上游包。
- 格式细节靠 references 按需加载,漏读会导致静默产出不合规文件 — PROPERTIES/CALLOUTS/EMBEDS/FUNCTIONS_REFERENCE/EXAMPLES 五个引用文件不读则属性类型、callout 别名、公式函数只能凭记忆写;skill 未强制读取。
5第二遍独立确认
- [ok] skill.path 定位(任务表标『待定位』);合集条目指向哪个具体 skill — 本条目展示名『Obsidian Skills』对应的是 6 个 skill 的合集,仓库根无集合级 SKILL.md。skill.path 现指向其中的代表 skill:skills/obsidian-markdown —— 它是 README 技能表首项、覆盖面最广(Obsidian Flavored Markdown,含 wikilinks/embeds/callouts/properties),也是『Claude Skills for Obsidian 笔记与知识管理』这一展示描述的最直接载体。其余 5 个并列 skill 为:skills/obsidian-bases(.base)、skills/json-canvas(.canvas)、skills/obsidian-cli(官方 CLI)、skills/defuddle(网页正文抽取)、skills/knap(模板渲染/批量生成);本 JSON 的 capabilities 与 internal_assets 覆盖的是全部 6 个(逐条 evidence 均指向对应子目录),analysis 亦按合集口径书写。
- [discrepancy] 官方 description 取哪一份(集合无单一 frontmatter description) — 本条目代表的是一个 6-skill 集合,仓库内不存在『集合级 frontmatter description』。meta.official_desc 因此采用 .claude-plugin/plugin.json 的 description 原文(对集合范围的官方表述),并在字段内注明口径来源与『子 skill description 见别处』。6 个子 skill 的 frontmatter description 各自原文已逐条取证(例如 knap: 'Render Markdown templates from structured data using Knap CLI...'、defuddle: 'Extract clean markdown content from web pages using Defuddle CLI...'),未被改写或合并。
- [discrepancy] official_desc 取哪一份(合集无集合级 frontmatter description) — 合集在仓库根没有集合级 SKILL.md/frontmatter description(6 个 skill 各有自己的 description)。本条目 official_desc 采用代表 skill skills/obsidian-markdown 的 frontmatter description 逐字原文(与 skill.path 指向的具体 skill 一致,满足『official_desc = SKILL.md frontmatter 原文』的取证规则);集合级口径(.claude-plugin/plugin.json 的 'Create and edit Obsidian vault files including Markdown, Bases, and Canvas. Use when working with .md, .base, or .canvas files in an Obsidian vault.')已逐字记入 internal_assets 的 plugin.json 条目说明,不丢失信息。
- [ok] 『零脚本』结论的反例搜索 — 13 个受控文件的后缀全为 .md/.json;无 .sh/.py/.js/.mjs/.ts;仓库无 .github(无 CI 引入的第三方 action)。所有可执行动作均来自外部 CLI(obsidian/defuddle/knap),它们的代码不在本仓,本仓无法审。
- [ok] 『无凭证读取』是否漏网 — 对 api_key/API_KEY/token/secret/.env/os.environ/process.env/keychain 全仓扫描零命中。obsidian CLI 依赖的是本机 Obsidian 登录/本地会话,SKILL.md 未要求读取任何 key 或 cookie。
- [ok] 网络外发清单是否有遗漏 — 出现的 http(s) 串共 3 类:① help.obsidian.md(文档指针,SKILL.md 里作为『命令清单永远最新』的说明而非抓取指令);② jsoncanvas.org / github.com/obsidianmd/jsoncanvas(规范出处);③ defuddle 示例中的 https://example.com/article 与 knap 示例(示例数据 URL)。真正的运行时抓取只有 defuddle parse <用户 URL> 一条。
- [ok] obsidian eval 的定级是否过轻 — 重新核对:`obsidian eval code="app.vault.getFiles().length"` 确为 SKILL.md 中的示例,属官方 CLI 文档化子命令;本集合既不自行注入代码也不隐藏该能力,且其作用域是本机运行中的 Obsidian(用户自己的应用)。按六档范式,red 针对『安全降级/反反爬/任意代码执行面』的自造绕过;此处是官方 CLI 功能的常规使用,故维持 yellow 并在 scripts_executed 中显式点名,让读者知情。
- [ok] 写入门禁(--dry-run / --overwrite)是真实契约还是文档口号 — knap SKILL.md 原文明确 'Use `--dry-run` to validate and list output paths without writing files. Existing files require `--overwrite`, including during a dry run.' 与 'Duplicate output names within a batch are errors even with `--overwrite`.';`-o` 的行为也写明 '`-o` creates parent directories and overwrites the destination after rendering succeeds'。均为外部 CLI 的行为描述,本仓无代码可验,属『依赖第三方 CLI 实现』。
6结论
e2fbc06a174fb6bf…8ccef29ae8