feat: 新增 obsidian 插件族(9 个技能)

- 新增 plugins/obsidian 插件目录,含 9 个 obsidian-* 技能
- 核心技能重构:去除 README.md 分散路由,合并 vault 自动检测
  SOP(.obsidian/ 目录置信度表 + 标准进入动作)到 SKILL.md
- 所有技能 description 精简重写:触发信号 + 边界 + .obsidian/
  联动激活信号,字数从 300+ 压缩至 220-250
- 更新 marketplace.json 追加 obsidian 插件条目

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
SkyJourney
2026-05-01 13:20:31 +08:00
co-authored by Claude Sonnet 4.6
parent f13bd26f59
commit 1e35ee4d9f
11 changed files with 2473 additions and 0 deletions
@@ -0,0 +1,266 @@
---
name: obsidian-bases
description: Obsidian 1.9+ 原生数据库视图(Bases):查询 .base 文件中的结构化视图(JSON/CSV/MD 输出)、在 base 中创建新条目。触发词:Bases、base 视图、数据库视图、结构化查询笔记、base query。不用于 Dataview(社区插件,用其原生 DQL 语法)。依赖 YAML frontmatter 属性,与 obsidian-meta 配合使用;需 Obsidian ≥ 1.9。检测到 .obsidian/ 时与核心技能同步激活。
---
# Obsidian Bases · 原生数据库视图
> **Obsidian 1.9+ 的杀手级特性**:把 vault 当成数据库,把每篇笔记当成一条记录,把 frontmatter 当成字段。用 `.base` 文件定义视图和筛选,不用写一行 JS(对比 Dataview)。
> **为什么 Bases 对 AI agent 意义重大**:它把"非结构化笔记 + frontmatter 属性"变成了"可查询的结构化数据"agent 可以直接 `base:query` 拿到 JSON,不需要先全文搜索再解析。
---
## 何时使用
- 列出 vault 中所有 `.base` 数据库视图文件
- **查询某个 base** 的结果(支持多种输出格式)
- 在 base 中**创建新条目**(自动写入符合 base 视图规则的 frontmatter
- 列出某 base 的所有**视图**views
- 把"项目管理面板"、"阅读清单"、"文章管理"等做成可视化看板
## 不用于
- **Dataview** 查询(社区插件,用 DQL 语法,不是 Bases)
- 简单的属性读写 → **obsidian-meta**
- 全文搜索 → **obsidian-search**
---
## 前置条件
- **Obsidian ≥ 1.9**(检查:`obsidian version`
- 知识库中存在至少一个 `.base` 文件(通过 Obsidian UI 创建,或从社区模板复制)
- 参与 base 的笔记必须使用 **YAML frontmatter**(不是 Dataview inline 字段,Bases 不认)
---
## 命令速查
### Base 文件与视图管理
```bash
obsidian bases # 列出 vault 所有 .base 文件
obsidian base:views # 列出当前 base 的所有视图
obsidian base:views file="项目管理" # 列出某 base 的视图
```
### 查询 Base
```bash
# 基础查询(默认 JSON
obsidian base:query file="项目管理"
obsidian base:query path="20-Areas/项目管理.base"
# 指定视图
obsidian base:query file="项目管理" view="进行中"
obsidian base:query file="项目管理" view="按截止日" format=csv
obsidian base:query file="项目管理" view="逾期" format=md # Markdown 表格
obsidian base:query file="项目管理" view="全部" format=paths # 只返回路径列表
obsidian base:query file="项目管理" view="全部" format=tsv
```
**输出格式**
- `json`(默认):最完整,含所有字段
- `csv`:表格,适合导出到 Excel
- `tsv`:表格,Bash 处理友好
- `md`:Markdown 表格,直接粘贴到笔记
- `paths`:只返回文件路径列表
### 在 Base 中创建新条目
```bash
# 在某视图下创建新笔记(自动套用该视图的默认字段)
obsidian base:create file="项目管理" view="进行中" name="新项目Alpha" \
content="# 新项目 Alpha" open
# 完整参数
obsidian base:create \
file="项目管理" \
view="进行中" \
name="新项目" \
content="初始内容" \
open \
newtab
```
> 💡 `base:create` 的威力:它会按视图规则**自动填充 frontmatter**(例如 "进行中" 视图可能强制 `status: active`),省去手动 `property:set`。
---
## Bases vs Dataview 选型表
| 维度 | Bases(官方 1.9+ | Dataview(社区插件) |
|-----|-------------------|---------------------|
| 语法 | YAML 配置(声明式) | JS/DQL(命令式) |
| 数据源 | 仅 YAML frontmatter | frontmatter + inline `Key::` |
| 写入 | ✅ 支持 `base:create` | ❌ 只读 |
| 性能 | ✅ 原生 C++,极快 | ⚠ JS 运行时,大 vault 卡 |
| 多视图 | ✅ 一个 base 多视图 | 每个查询一段代码 |
| AI agent 友好 | ✅ CLI 直接 query JSON | ⚠ 需要模拟 Dataview JS 运行 |
| 社区模板 | 🟡 起步阶段 | ✅ 海量模板 |
| 版本要求 | Obsidian ≥ 1.9 | 任意版本 |
**选型建议**
- **新项目 / AI agent 驱动** → 首选 Bases
- **已有 Dataview 资产** → 继续用,或逐步迁移
- **需要复杂计算** → Dataview(Bases 未来会支持公式字段)
---
## AI Agent 最佳实践
### 场景 1 · 项目面板作为 AI 决策依据
```bash
# Agent 问:"今天我该优先处理哪个项目?"
# Step 1: 查询"进行中"项目,按 due 排序
obsidian base:query file="项目管理" view="按截止日" format=json
# Step 2: Agent 分析返回的 JSON,找出:
# - due 最近的 3 个
# - priority 最高的 3 个
# - blocked 状态已解除的
# Step 3: 生成建议写入每日笔记
obsidian daily:append content="\n## 📌 AI 建议优先级\n..."
```
### 场景 2 · 阅读清单 Base 设计
创建 `30-Resources/reading-list.base`(通过 Obsidian UI),字段规划:
```yaml
# frontmatter 规范(每本书/文章一个笔记)
---
type: book | article | paper | video
title:
author:
url:
status: to-read | reading | done | abandoned
priority: 1-5
started: 2026-03-15
finished:
rating: 1-5
tags: [topic1, topic2]
---
```
视图设计:
- **待读**: `status == "to-read"`, 按 `priority desc`
- **在读**: `status == "reading"`
- **已读高分**: `status == "done" AND rating >= 4`
- **按主题**: group by `tags`
```bash
# Agent 查询:我的待读列表前 5
obsidian base:query file="reading-list" view="待读" format=md | head -20
```
### 场景 3 · 用 Base 做 AI 工作日志
创建 `99-Log/ai-actions.base`,每次 agent 写入操作创建一条记录:
```bash
# 不手动建笔记,直接通过 base:create
obsidian base:create \
file="ai-actions" \
view="今日" \
name="$(date +%Y%m%d%H%M%S)-property-set" \
content="---
action: property:set
target: 项目Alpha
field: status
value: done
agent: claude-sonnet-4-6
reason: 用户确认项目完成
---"
```
之后查询:
```bash
obsidian base:query file="ai-actions" view="今日" format=md
obsidian base:query file="ai-actions" view="本周 action 统计" format=csv
```
### 场景 4 · Base 作为 RAG 检索的结构化索引
传统 RAG:全文搜索 → 召回 → 喂模型。
Bases 增强:**先用 base 做结构化筛选,缩小召回范围,再做全文搜索**。
```bash
# 问题:"最近 3 个月我写的关于虚拟线程的读书笔记"
# Step 1: 用 base 筛出结构化候选
obsidian base:query file="reading-list" view="近 3 个月" format=paths > /tmp/candidates.txt
# Step 2: 在候选范围内全文搜索
obsidian search query="虚拟线程" path="$(xargs -a /tmp/candidates.txt)" format=json
```
---
## Base 文件结构(了解即可,通常由 UI 生成)
`.base` 文件是 YAML 格式:
```yaml
# 20-Areas/项目管理.base
filters:
and:
- file.inFolder: "10-Projects"
- status: ["active", "paused"]
views:
- name: 进行中
type: table
filters:
- status: active
order:
- due ASC
columns:
- file.name
- status
- due
- priority
- owner
- name: 按截止日
type: table
order:
- due ASC
- name: 逾期
type: list
filters:
- due < today()
- status: active
```
> 💡 推荐通过 Obsidian UI 创建 `.base` 文件,再用 CLI 查询。直接手写 `.base` 容易语法错。
---
## 与其他技能的协作
| 场景 | 链路 |
|-----|------|
| 属性设计 → 视图落地 | **obsidian-meta**frontmatter 规范)→ obsidian-bases(查询) |
| 结构化召回 + 全文精读 | obsidian-bases → **obsidian-search** |
| 决策支持 | obsidian-bases → **obsidian-daily**(写建议) |
| 项目看板自动化 | obsidian-bases + **obsidian-tasks**(进度) |
| AI 日志归档 | 所有技能写操作 → obsidian-bases`base:create` 到 ai-actions.base |
---
## 常见陷阱
| 现象 | 原因 | 对策 |
|------|------|------|
| `bases` 命令返回空 | Obsidian 版本 < 1.9 | 升级到 1.9+ |
| `base:query` 字段缺失 | 笔记用了 Dataview inline 字段 | 改写到 YAML frontmatter |
| `base:create` 报错 | view 名称拼写错 | 先 `base:views` 列出 |
| 视图不更新 | 缓存 | `obsidian reload` |
| 日期排序错 | frontmatter 日期是 text 类型 | `property:set type=date` |
| 查询慢 | base filter 过于宽松 | 增加 `file.inFolder` 限定 |
| agent 写的 base 条目违反 schema | 没先读 base 规则 | `base:views` + 手动验证字段 |