Skip to main content

obsidian

Obsidian vault 专属操作:wikilink/双链、backlink、canvas、daily note、frontmatter 属性等 Obsidian 特有能力。注意:普通的知识库读写(存/搜/读/改笔记)统一走内置 knowledge_* 工具——当用户把知识库后端配成 Obsidian 时,knowledge_* 会自动落到 vault,无需本技能。仅当用户点名 Obsidian、或要用 vault 特有功能(双链/canvas/日记/backlink 维护)时才加载本技能。

Aller à l'installation

Informations de source

Dépôt
llm011/ethan-agent
Dernière activité de la source
12 août 2026 à 14:14
Langue détectée de SKILL.md
Plusieurs langues
Étoiles
8
Forks
0

Options d'installation

Le prompt qui vérifie d'abord la source est sélectionné par défaut. Vous pouvez passer à une commande directe ou télécharger une copie locale.

Vérifiez les fichiers source

Lisez SKILL.md et les fichiers associés affichés par SkillsMP avant de décider de l'installer.

Explorateur de fichiers
5 fichiers

Affichage de SKILL.md

SKILL.md
Instructions source · Aperçu en lecture seule
name
obsidian
title
Obsidian Vault Manager
description
Obsidian vault 专属操作:wikilink/双链、backlink、canvas、daily note、frontmatter 属性等 Obsidian 特有能力。注意:普通的知识库读写(存/搜/读/改笔记)统一走内置 knowledge_* 工具——当用户把知识库后端配成 Obsidian 时,knowledge_* 会自动落到 vault,无需本技能。仅当用户点名 Obsidian、或要用 vault 特有功能(双链/canvas/日记/backlink 维护)时才加载本技能。
version
1.1.0
author
NousResearch
license
MIT
platforms
["linux","macos","windows"]
trigger
["obsidian","Obsidian","ob笔记","vault","wikilink","双链","backlink","canvas","画布","daily note","日记","双链笔记"]
# Obsidian Vault Use this skill for filesystem-first Obsidian vault work: reading notes, listing notes, searching note files, creating notes, appending content, adding wikilinks, managing tags, maintaining backlinks, and editing frontmatter. ## 🚫 硬规则(必须遵守,不可绕过) ### R1:写入笔记只用 knowledge_* 工具 所有写入 Obsidian 笔记的操作,必须通过 `knowledge_add` / `knowledge_edit` 完成。 - ❌ 禁止 `file_write` 直接写 markdown 文件 - ❌ 禁止 `shell` 的 `mkdir` / `cat` / `echo` / `python3 -c "open(...).write(...)"` - ❌ 禁止自己拼接 vault 路径——路径由后端按 scene 自动管理(`<vault>/<scene>/<slug>.md`) - ✅ 新建 → `knowledge_add(title, content, tags, scene, frontmatter)` - ✅ 追加 → `knowledge_edit(source, content, mode="append", scene)` - ✅ 整篇替换 → `knowledge_edit(source, content, mode="replace", scene, frontmatter)` **判断标准**:只要写入的内容是笔记/资料/纪要/PRD/设计文档等知识库条目(即使已经用 lark-cli / web_fetch 拉取了原文),写回时也必须走 knowledge_* 工具。 **为什么**:knowledge_* 工具会自动加 frontmatter(title/type/tags/created/updated,由 `yaml.safe_dump` 安全生成)、自动建子目录、自动建索引支持全文搜索;file_write 直写会绕过这一切,导致路径平铺根目录、frontmatter 字段缺失、搜索查不到。 ### R2:内容来自外部文档/链接时,frontmatter={"source": ...} 必传 凡是笔记内容派生自外部网页/飞书文档/链接(用户提供了 URL,或你用 lark-cli / web_fetch 拉取过原文),调用 `knowledge_add` / `knowledge_edit` 时必须传 `frontmatter={"source": "{原始 URL}"}`。 - 固定字段(`title` / `type` / `tags` / `created` / `updated`)由后端自动管理,**不要**在 frontmatter 里重复传 - `type` 由 `tags[0]` 自动推断,无需手动指定 - 可按需追加 `author` / `published` 等扩展字段 ### R3:scene 按场景区分 | 内容类型 | scene | 示例 | |---|---|---| | 工作向记录 | `work` | PRD、设计文档、会议纪要、技术方案、工作沉淀 | | 个人/生活向 | `life` | 个人学习、生活记录、家庭事项 | | 不确定 | `work` | 默认 work,用户明确说生活类时切 life | scene 决定子目录(`<vault>/work/...` vs `<vault>/life/...`),不传 scene 会平铺到 vault 根目录——这是禁止的。 ## Vault path Use a known or resolved vault path before calling file tools. The documented vault-path convention is the `OBSIDIAN_VAULT_PATH` environment variable, for example from `${ETHAN_HOME:-~/.ethan}/.env`. If it is unset, fall back to `~/Documents/obsidian/work`, then `~/Documents/Obsidian Vault`. File tools do not expand shell variables. Do not pass paths containing `$OBSIDIAN_VAULT_PATH` to `read_file`, `write_file`, `patch`, or `search_files`; resolve the vault path first and pass a concrete absolute path. Vault paths may contain spaces, which is another reason to prefer file tools over shell commands. If the vault path is unknown, `terminal` is acceptable for resolving `OBSIDIAN_VAULT_PATH` or checking whether the fallback path exists. Once the path is known, switch back to file tools. ## Read a note Use `read_file` with the resolved absolute path to the note. Prefer this over `cat` because it provides line numbers and pagination. ## List notes Use `search_files` with `target: "files"` and the resolved vault path. Prefer this over `find` or `ls`. - To list all markdown notes, use `pattern: "*.md"` under the vault path. - To list a subfolder, search under that subfolder's absolute path. ## Search Use `search_files` for both filename and content searches. Prefer this over `grep`, `find`, or `ls`. - For filenames, use `search_files` with `target: "files"` and a filename `pattern`. - For note contents, use `search_files` with `target: "content"`, the content regex as `pattern`, and `file_glob: "*.md"` when you want to restrict matches to markdown notes. ## Create a note 调用 `knowledge_add` 工具创建笔记。**不要**用 `write_file` / `shell` / `file_write` 直写文件——见上方硬规则 R1。 ``` knowledge_add( title="笔记标题", content="Markdown 正文(不要带 frontmatter,后端自动生成)", tags=["coze", "prd"], # 第一个 tag 自动成为 type(不要带 scene 前缀) scene="work", # 必传,决定子目录 frontmatter={"source": "https://...原始 URL..."} # 来自外部链接时必传 R2 ) ``` 后端会自动: - 生成 frontmatter(`title` / `created` / `updated` / `type` / `tags`),用 `yaml.safe_dump` 安全序列化 - 写到 `<vault>/<scene>/<slug>.md`(slug 由标题小写化生成,重名追加 `-1`/`-2`) - 建立全文搜索索引 ### 内容质量要求 写入 Obsidian 的内容必须遵循以下原则: 1. **内容完整性**:不要只保存摘要或片段,尽量保留原始内容的完整信息(正文、代码块、表格、列表等)。如果来源是网页或文档,应提取全部有价值内容。特别是**飞书文档**,必须调用 lark-doc 技能的 `scripts/fetch_doc.py` 脚本获取完整 Markdown 内容,不要仅凭记忆或摘要转写。 2. **格式规范**:使用标准 Markdown 格式,确保标题层级清晰、代码块有语言标识、列表缩进正确、表格对齐。飞书的 `<blockquote>` / `<cite>` / `<colgroup>` 等专有标签需在写入前清理为标准 Markdown(`>` / `[[wikilink]]` / 标准 table)。 3. **图片本地化**:笔记中引用的图片**必须先下载到 vault 的 `assets/` 目录**,然后使用相对路径或 wikilink 引用,不要直接引用外部 URL。 - 下载路径:`<vault>/assets/<有意义的文件名>.png`(按内容命名,避免随机串) - 引用方式:`![[assets/my-image.png]]` 或 `![描述](assets/my-image.png)` - 如果图片无法下载(需认证、已失效等),保留原始 URL 并加注释标记 `<!-- 图片未下载: <url> -->` ## Append to a note 调用 `knowledge_edit(source, content, mode="append", scene)` 追加内容。`source` 是笔记的 slug 或绝对路径(之前 `knowledge_add` 的返回值)。 - ✅ 追加 → `knowledge_edit(source, content, mode="append", scene)` - ✅ 整篇替换 → `knowledge_edit(source, content, mode="replace", scene, frontmatter)` - ❌ 不要用 `read_file` + `write_file` 拼接整篇内容 - ❌ 不要用 `shell` 的 `echo >>` 追加 `mode="replace"` 会保留原文件的 `created` 字段,只刷新 `updated` 为今天。 ## Targeted edits 定向修改用 `knowledge_edit(source, content, mode="replace", scene)` 整篇替换。当前 `knowledge_edit` 不支持局部 patch,需要修改局部内容时:先 `knowledge_read(source)` 读全文 → 在内存里改 → `knowledge_edit(source, modified_content, mode="replace", scene)`。 ## Wikilinks Obsidian links notes with `[[Note Name]]` syntax. When creating notes, use these to link related content. - `[[Note Name]]` — link to a note - `[[Note Name|Display Text]]` — custom display text - `[[Note Name#Heading]]` — link to a heading inside a note - `[[Note Name#^block-id]]` — link to a block reference - `![[Note Name]]` — embed a full note - `![[image.png]]` — embed an image attachment - `![[image.png|300]]` — embed an image with a width hint **正文链接规范**:如果文档中提到了已有的其他笔记或项目,使用 `[[双链]]` 将它们关联起来(例如:关于 AB 灰度配置,可参考 `[[AB 实验灰度方案]]`)。原始链接(如飞书文档 URL)应写入 frontmatter 的 `source` 字段。 ## Frontmatter / Properties 笔记的 frontmatter 由 `knowledge_add` / `knowledge_edit` 后端自动生成,**不要**在 `content` 里手写 frontmatter 块。后端用 `yaml.safe_dump` 安全序列化,避免引号/冒号/反斜杠导致的解析错误。 ### 自动生成的字段(不要手动传) | 字段 | 来源 | 说明 | |---|---|---| | `title` | `knowledge_add(title=...)` | 笔记标题,引号风格由 yaml.safe_dump 按内容自动决定 | | `created` | 后端 | 首次创建时设为今天;`knowledge_edit(mode=replace)` 时从原文件保留 | | `updated` | 后端 | 每次写入刷新为今天 | | `type` | `tags[0]` 自动推断 | 不要手动传,传了也会被忽略 | | `tags` | `knowledge_add(tags=[...])` | 层级标签列表 | ### 扩展字段(通过 frontmatter 参数传入) | 字段 | 何时传 | 示例 | |---|---|---| | `source` | 内容来自外部 URL 时必传(R2) | `frontmatter={"source": "https://..."}` | | `author` | 需要记录作者时 | `frontmatter={"author": "张三"}` | | `published` | 需要记录发布时间时 | `frontmatter={"published": "2026-07-15"}` | ### 标签(Tags)规范 **层级格式**:使用 `分类/子分类` 格式,支持多级嵌套,方便在 Obsidian 中折叠和检索。 常用标签体系(**不要带 `work/`/`life/` 前缀**,scene 参数已决定顶层目录): - `<项目名>` — 项目归属(如 `coze`、`lark`) - `tech/<技术栈>` — 技术研究(如 `tech/electron`、`tech/mcp`) - `prd` — PRD / 设计案(type 自动推断为 `prd`) - `tech-design` — 技术方案(type 自动推断为 `tech-design`) - `meeting` — 会议纪要(type 自动推断为 `meeting`) - `reference` — 参考资料(type 自动推断为 `reference`) - `todo` — 个人待办 - `<分类>` — 生活类内容 **规则**: - YAML 中的标签**不加** `#` 号;正文中的 inline 标签**必须**以 `#` 开头 - 创建新标签前,先运行 `tag_manager.py list` 查询已有标签,优先复用 - 合法字符:字母、数字、`_`、`-`、`/`;不以数字开头 To update frontmatter on an existing note: 调用 `knowledge_edit(source, content, mode="replace", scene, frontmatter={...})` 整篇替换,frontmatter 参数里只传扩展字段(如 `source`),固定字段(`title` / `type` / `tags` / `created` / `updated`)由后端管理。不要用 `read_file` + `patch` 改 frontmatter——这会绕过 yaml.safe_dump,可能产出非法 YAML。 ## Tag Management Tags use the `一级/二级/三级` hierarchical format. Reuse existing tags whenever possible; do not invent new top-level tags impulsively. - **List existing tags**: `python3 ~/.ethan/skills/obsidian/scripts/tag_manager.py list` — scans frontmatter `tags:` fields and inline `#tag` occurrences across the vault. - **Add a tag to a note**: `python3 ~/.ethan/skills/obsidian/scripts/tag_manager.py add "note_path.md" "project/active"` — patches the note's frontmatter (creates one if missing). `note_path` may be absolute, or relative to the vault root. - **Tag format**: `alpha/beta/gamma`, supports unlimited nesting. No leading digits; allowed chars: letters, digits, `_`, `-`, `/`. - **Inline vs frontmatter**: inline `#tag` works anywhere in the body; frontmatter `tags:` is preferred for structured classification. Before creating a new tag, always run `list` first and reuse an existing one if a close match exists. ## Backlinks / Link Maintenance Backlinks are `[[Note Name]]` references pointing TO a note. Obsidian builds them automatically in-app; on the filesystem you maintain them by editing the source notes. - **Find backlinks to a note**: `search_files` with `target: "content"`, `pattern: "\\[\\[Note Name"` and `file_glob: "*.md"` across the vault. The same prefix matches both `[[Note Name]]` and `[[Note Name|...]]`. - **Rename a note safely**: 1. Move the file with `terminal` (`mv "old.md" "new.md"`), or read+write+delete via file tools. 2. Search for `[[Old Name]]` and `[[Old Name|...]]` across the vault. 3. Patch each referring note to use `[[New Name]]` (preserve display text after `|`). - **Delete a note safely**: search for backlinks first; either remove the links or convert them to plain text, then delete the file. ## Daily Notes If the user keeps a daily-notes folder (commonly `Daily/`, `日记/`, or `journals/`), create today's note with `write_file` at the conventional path. Use `YYYY-MM-DD.md` naming unless the user has an existing convention. If unsure, list the vault root first to discover the folder. ## Canvas Files `.canvas` files are JSON describing nodes (text/file/link/group) and edges on a 2D plane. See `references/canvas.md` for the spec. Edit with `write_file` producing valid JSON; do not hand-edit fragments. Coordinates: `x` increases right, `y` increases down; position is the top-left corner. ## Obsidian CLI (optional enhancement) If `obsidian-cli` is installed (check with `terminal` running `which obsidian-cli`), it can automate some operations more safely than raw filesystem edits: - `obsidian-cli print "note"` — print note content - `obsidian-cli search "keyword"` — search note titles - `obsidian-cli search-content "keyword"` — search note content - `obsidian-cli create "path/note.md" --content "..."` — create note - `obsidian-cli daily` — open today's daily note - `obsidian-cli frontmatter "note" --set "key:value"` — write frontmatter field - `obsidian-cli move "old.md" "new.md"` — rename note (auto-updates backlinks) - `obsidian-cli list` — list vault files Prefer the filesystem-first workflows above when `obsidian-cli` is unavailable. Use `obsidian-cli move` for renames when available, since it updates backlinks automatically. ## References - `references/markdown.md` — Obsidian Flavored Markdown reference (wikilinks, embeds, callouts, frontmatter). - `references/canvas.md` — JSON Canvas spec for `.canvas` files.
Voir sur GitHub