Files
SkyJourney 98522ef9be feat(obsidian): 描述去冗余 + 核心补 OFM 语法 + workflow 补 Web Clip
对标社区基准(kepano/obsidian-skills 31.8k★、AgriciDaniel/claude-obsidian
15 技能完整体系)后的 P1-P6 优化合集:

- P1: 8 个子技能 description 末尾去"伴随激活"冗余句(路由不识别该声明)
- P5: obsidian-plugins 描述聚焦环境层(插件/主题/CSS/Templates/快捷键/命令)
- P6: obsidian-workflow-pkm 描述加"多步骤复合需求优先匹配"前置引导
- P3: 核心 obsidian skill 增补 OFM 语法速查章节
       (wikilinks/embeds/callouts/block refs/highlight/math 全表)
- P4: workflow-pkm 新增 Workflow 8 Web Clip → Permanent
       (引用 defuddle 社区标准,WebFetch 兜底)
2026-06-12 19:48:45 +08:00

248 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: obsidian-meta
description: 管理 Obsidian 笔记元数据:YAML frontmatter 属性(status/tags/created/due 等)读写、tag 统计与体系治理、aliases 别名、bookmarks 书签、为 Dataview/Bases 设计字段规范。触发词:frontmatter、设置属性、tag、标签、别名、书签、属性读写。不用于全文搜索(obsidian-search)或 Bases 视图查询(obsidian-bases)。
---
# Obsidian Meta · 元数据管理
> Frontmatter 属性、标签、别名、书签——Obsidian 的四大元数据系统。这是让 AI agent 结构化理解笔记的关键。
---
## 何时使用
- 给一篇笔记**设置或读取** frontmatter 属性(`status: draft` / `tags: [tech, arch]` / `due: 2026-05-01`
- **批量维护** YAML 头(比如给所有 `50-Zettel/` 笔记补 `created` 字段)
- 统计 vault 中有哪些 tag、每个 tag 下有多少笔记
- 管理笔记的 **aliases**(别名,影响 wikilink 解析)
- 管理 **bookmarks**(收藏夹,快速跳转)
-**Dataview****Obsidian Bases** 做字段规划
## 不用于
- 全文搜索 / 图谱分析 → **obsidian-search**
- Bases 视图的结构化查询 → **obsidian-bases**
- 任务状态管理(`- [ ]`/`- [x]`)→ **obsidian-tasks**
---
## 命令速查
### Tags 标签
```bash
obsidian tags # 列出 vault 所有 tag
obsidian tags counts # 含出现次数
obsidian tags sort=count # 按次数降序
obsidian tags format=json # JSON 输出
obsidian tags file=<name> # 某文件的 tags
obsidian tags active # 当前激活文件的 tags
obsidian tags total # 仅返回 tag 数量
obsidian tag name="tech" # 某 tag 详情
obsidian tag name="tech" verbose # 含使用该 tag 的文件列表
obsidian tag name="tech" total # 仅返回出现次数
```
### PropertiesFrontmatter YAML
```bash
obsidian properties # 列出 vault 所有属性名(YAML 默认)
obsidian properties counts # 含占用文件数
obsidian properties sort=count # 按出现次数排序
obsidian properties format=json # JSON 输出
obsidian properties file=<name> # 某文件的所有属性
obsidian properties name="status" # 查看某属性的使用情况
obsidian property:read name="status" file="项目A"
obsidian property:set name="status" value="done" file="项目A"
obsidian property:set name="tags" value="tech,arch,java" type=list file="技术笔记"
obsidian property:set name="due" value="2026-05-01" type=date file="项目A"
obsidian property:set name="priority" value=5 type=number file="项目A"
obsidian property:set name="published" value=true type=checkbox file="文章"
obsidian property:remove name="old_field" file="项目A"
```
**属性类型**`text | list | number | checkbox | date | datetime`
### Aliases 别名
```bash
obsidian aliases # 列出 vault 所有别名
obsidian aliases verbose # 含文件路径
obsidian aliases total # 仅返回数量
obsidian aliases file=<name> # 某文件的别名
obsidian aliases active # 当前激活文件的别名
```
> 💡 Aliases 通过 frontmatter `aliases: [...]` 设置,影响 wikilink 解析——`[[别名]]` 会解析到原笔记。
### Bookmarks 书签
```bash
obsidian bookmarks # 列出所有书签(tsv 默认)
obsidian bookmarks verbose # 含类型(file/folder/search/url
obsidian bookmarks format=json
obsidian bookmark file="重要笔记" # 添加文件书签
obsidian bookmark file="重要笔记" subpath="## 章节" # 指定标题/块
obsidian bookmark folder="10-Projects" # 文件夹书签
obsidian bookmark search="TODO" # 搜索书签
obsidian bookmark url="https://..." title="官方文档" # URL 书签
```
---
## AI Agent 最佳实践
### 场景 1 · Frontmatter 规范模板(写在 SCHEMA.md
```yaml
---
# 身份
title: 笔记标题
aliases: [] # 别名列表
# 时间
created: 2026-04-09
updated: 2026-04-09
# 分类
type: note | project | area | resource | zettel | literature | moc
status: draft | active | done | archived
tags: [domain, subdomain]
# 项目专属
due: 2026-05-01
priority: 1-5
owner: name
# 永久笔记专属(Zettelkasten
zettel_id: 202604091530
refs: [[[相关笔记1]], [[相关笔记2]]]
source: book | paper | url
---
```
**字段选型原则**
- **通用字段**(所有笔记都有):`title / created / updated / status / tags`
- **可选字段**(按 type 触发):`due / priority / owner / zettel_id / source`
- **机器字段**(agent 写入):`last_ai_touched / ai_summary / review_count`
### 场景 2 · 批量补全 created/updated 字段
```bash
# 找出所有缺 created 字段的笔记
obsidian files folder="50-Zettel" format=json | \
# 由 agent 逐个 property:read name=created file=...
# 如果返回空,则从文件 mtime 推断
# obsidian property:set name=created value="2024-01-15" type=date file=...
```
### 场景 3 · 状态机流转
```bash
# 项目从 active → done
obsidian property:read name=status file="项目Alpha" # 先读现状
obsidian property:set name=status value=done file="项目Alpha"
obsidian property:set name=updated value=$(date +%Y-%m-%d) type=date file="项目Alpha"
# 可配合 obsidian-workflow-pkm 做 PARA 归档:
# done → 2 周无动作 → 移到 40-Archive/
```
### 场景 4 · Tag 体系治理
```bash
# 1. 扫描所有 tag 统计
obsidian tags counts sort=count format=json > /tmp/tags.json
# 2. 由 agent 分析:
# - 低频 tag(< 3 次)是否可合并
# - 命名不一致(#Tech vs #tech)的归一化
# - 层级化(#area/tech、#area/design
# 3. 找出含某 tag 的所有文件,批量替换
obsidian tag name="Tech" verbose # 拿到文件列表
# 对每个文件: property:set name=tags value="..." type=list
```
**tag 层级推荐**(结合 Obsidian 原生层级 tag 支持):
```
#area/tech #status/draft
#area/design #status/active
#area/ops #status/done
#status/archived
#project/alpha
#project/beta #type/zettel
#type/moc
#type/literature
```
### 场景 5 · 用属性替代文件夹(动态视图)
Obsidian 的现代理念:**属性优于文件夹**。不用深层目录,而是用 frontmatter 做动态筛选。
```bash
# 所有 "active 项目" 用 property 查(配合 obsidian-bases
obsidian property:set name=status value=active file="项目X"
# 然后在 obsidian-bases 里建一个视图:
# view: "进行中项目" where: status == "active" sort: due asc
```
### 场景 6 · 别名用于多语言/多写法
```yaml
---
title: Virtual Threads
aliases: [虚拟线程, 协程-Java 版, Project Loom]
---
```
wiki 中写 `[[虚拟线程]]``[[Project Loom]]` 都能链到同一篇。
---
## Dataview / Bases 字段设计建议
> 参考:dsebastien《Dataview frontmatter guide》、blacksmithgu/obsidian-dataview 文档
| 字段类型 | 示例 | Dataview 友好 | Bases 友好 | 备注 |
|---------|------|-------------|-----------|------|
| `text` | `title: 笔记` | ✅ | ✅ | 基础字符串 |
| `list` | `tags: [a,b]` | ✅ | ✅ | 多值用列表 |
| `number` | `priority: 3` | ✅(支持运算) | ✅ | 可排序可筛选 |
| `checkbox` | `done: true` | ✅ | ✅ | 布尔值 |
| `date` | `due: 2026-05-01` | ✅(支持 duration | ✅ | 必须用 ISO 格式 |
| `datetime` | `created: 2026-04-09T10:30` | ✅ | ✅ | 含时间戳 |
| inline 字段 | `Key:: Value` | ✅ 仅 Dataview | ❌ Bases 不支持 | **Bases 只认 frontmatter,不认 inline** |
**铁律**:如果你用 Bases**永远用 frontmatter**,不要用 `Key:: Value` inline 字段。
---
## 与其他技能的协作
| 场景 | 链路 |
|-----|------|
| 搜索命中后筛选 | **obsidian-search** → obsidian-meta(按 tag/status 二次过滤) |
| 批量属性维护 | obsidian-meta + **obsidian**files 列出目标) |
| 按属性查询 | obsidian-meta(写入)→ **obsidian-bases**(查询展示) |
| 任务联动 | obsidian-meta`status: done`+ **obsidian-tasks**`- [x]` |
| 每日笔记自动打标签 | **obsidian-daily** + obsidian-meta |
---
## 常见陷阱
| 现象 | 原因 | 对策 |
|------|------|------|
| `property:set` 后 Obsidian 不显示 | 打开的是缓存视图 | `obsidian reload` 或重新打开笔记 |
| 日期字段在 Dataview 里无法排序 | 写成了 text 类型 | `property:set type=date` 明确类型 |
| Bases 读不到 `Key:: Value` | Bases 只认 frontmatter | 把 inline 字段改写到 YAML 头 |
| 属性值含特殊字符报错 | YAML 特殊字符未引号 | 含 `: [] {} #` 的值必须加 `""` |
| tag 层级识别错误 | 中间有空格 | 层级 tag 不能有空格:`#area/tech` ✅,`#area/ tech` ❌ |
| 批量改 tag 覆盖了已有 tag | `property:set` 是覆盖不是追加 | 先 `property:read`,合并后再 `set` |