Obsidian工具箱(专业版)
> AI Agent的企业级Obsidian综合管理工具箱。批量操作、高级模板、插件深度集成、Canvas管理,复杂知识库一网打尽。
Obsidian的真正威力在于插件生态的深度使用与自动化工作流。如何批量重构数百篇笔记?如何用Templater编写智能模板?如何用Dataview动态查询笔记?如何管理Canvas画布?如何同步多个vault?本技能聚焦企业级综合工具箱能力,帮助Agent成为Obsidian高级用户的得力助手.
架构总览
输入格式
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | Obsidian工具箱(专业版)处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
┌──────────────────────────────────────────────────────────────┐
│ Obsidian工具箱 (专业版) │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ vault发现与高级管理层 │ │
│ │ 多vault发现 │ 同步 │ 冲突解决 │ 切换 │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 笔记管理层(含批量操作) │ │
│ │ 搜索/创建/移动/重命名/删除(单条+批量) │ │
│ │ wikilink自动重构 │ 关系图谱分析 │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 高级模板系统层 │ │
│ │ Templater脚本 │ 条件逻辑 │ 循环 │ 变量 │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 插件深度集成层 │ │
│ │ Dataview查询 │ Obsidian Git │ Tasks │ Canvas │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Canvas画布管理层 │ │
│ │ JSON结构 │ 节点操作 │ 边操作 │ 布局 │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 工作流自动化层 │ │
│ │ 自定义工作流 │ 定时任务 │ 事件触发 │ │
│ └─────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
快速开始
- 阅读## 核心能力章节了解skill功能
- 按## 依赖说明配置环境
- 执行所需能力对应的命令
- 参考## 错误处理章节处理异常
- 查看## FAQ解答常见疑问
30秒上手(批量重构笔记)
批量将散乱笔记移动到主题目录:
#!/bin/bash
VAULT=$(obsidian-cli print-default --path-only)
declare -A REFACTOR_RULES=(
["notes/架构"]="Architecture"
["notes/会议"]="Meetings"
["notes/项目"]="Projects"
["random/决策"]="Decisions"
)
for old_prefix in "${!REFACTOR_RULES[@]}"; do
new_dir="${REFACTOR_RULES[$old_prefix]}"
find "$VAULT/$old_prefix" -name "*.md" -type f | while read -r file; do
filename=$(basename "$file")
old_path="${old_prefix}/${filename%.md}"
new_path="${new_dir}/${filename%.md}"
obsidian-cli move "$old_path" "$new_path"
echo "✓ 移动:$old_path → $new_path"
done
echo "批量重构完成"
120秒标准搭建(Templater智能模板)
配置Templater社区插件并创建智能模板:
mkdir -p $HOME/Documents/MyVault/Templates/Templater
cat > $HOME/Documents/MyVault/Templates/Templater/smart-meeting.md << 'TEMPLATE'
type: meeting
date: <% tp.date.now("YYYY-MM-DD") %>
time: <% tp.date.now("HH:mm") %>
weekday: <% tp.date.now("dddd") %>
attendees: []
tags: [meeting, <% tp.file.folder() %>]
related: []
**响应解析**: 完成完成后,查看输出响应确认任务状态。成功时输出包含解析摘要和响应数据;失败时根据错误信息排查问题,查阅错误解析章节获取恢复步骤.
- **日期**:<% tp.date.now("YYYY-MM-DD dddd") %>
- **时间**:<% tp.date.now("HH:mm") %>
- **参与者**:
- **地点**:
<%* if (tp.file.title.includes("评审")) { %>
- 评审背景介绍
- 方案展示
- 问答环节
- 决策与下一步
<%* } else if (tp.file.title.includes("站会")) { %>
- 昨日完成
- 今日计划
- 阻塞项
<%* } else { %>
- 议题1
- 议题2
<%* } %>
-
- [ ]
- [ ] @<% tp.system.prompt("负责人姓名") %> <% tp.system.prompt("任务描述") %>(截止:<% tp.date.now("YYYY-MM-DD", 7) %>)
<%*
const relatedFiles = await tp.vault.getMarkdownFiles();
const related = relatedFiles
.filter(f => f.path.includes("meeting") || f.path.includes("项目"))
.slice(0, 3);
related.forEach(f => {
tR += `- [[${f.basename}]]\n`;
});
%>
*由Templater自动生成于 <% tp.date.now("YYYY-MM-DD HH:mm:ss") %>*
TEMPLATE
cat > $HOME/Documents/MyVault/Templates/Templater/smart-project.md << 'TEMPLATE'
type: project
created: <% tp.date.now("YYYY-MM-DD") %>
status: active
priority: <% tp.system.suggester(["高", "中", "低"], ["high", "medium", "low"]) %>
tags: [project, <% tp.file.folder() %>]
stakeholders: []
<% tp.system.prompt("项目描述(一句话)") %>
<%*
const goalCount = await tp.system.prompt("目标数量(默认3)") || "3";
for (let i = 1; i <= parseInt(goalCount); i++) {
tR += `- [ ] 目标${i}\n`;
}
%>
| 里程碑 | 截止日期 | 状态 |
|:-----|:-----|:-----|
| 启动 | <% tp.date.now("YYYY-MM-DD") %> | 完成 |
| 中期 | <% tp.date.now("YYYY-MM-DD", 30) %> | 进行中 |
| 完成 | <% tp.date.now("YYYY-MM-DD", 90) %> | 待开始 |
- [ ]
- **风险1**:[描述] → 对策:[对策]
- [[Projects/index]]
- [[Meetings/<% tp.date.now("YYYY-MM") %>]]
TEMPLATE
300秒完整配置(Dataview查询+Canvas管理)
配置Dataview查询与Canvas画布管理:
cat > $HOME/Documents/MyVault/Dashboards/项目仪表盘.md << 'EOF'
~~~dataview
TABLE
priority as "优先级",
created as "创建日期",
status as "状态"
FROM "Projects"
WHERE type = "project" AND status = "active"
SORT priority DESC, created DESC
~~~
~~~dataview
TABLE
date as "日期",
attendees as "参与者"
FROM "Meetings"
WHERE type = "meeting" AND date >= date(today) - dur(7 days)
SORT date ASC
~~~
~~~dataview
TASK
FROM "Meetings"
WHERE !completed AND due >= date(today)
GROUP BY file.link
SORT due ASC
~~~
~~~dataview
LIST
FROM "Decisions"
WHERE status != "decided"
SORT file.mtime DESC
LIMIT 10
~~~
~~~dataview
TABLE length(rows) as "数量"
FROM ""
FLATTEN file.tags as tag
GROUP BY tag
SORT length(rows) DESC
LIMIT 20
~~~
EOF
cat > $HOME/Documents/MyVault/Canvases/项目架构.canvas << 'CANVAS'
{
"nodes": [
{
"id": "node-1",
"type": "text",
"text": "# 项目架构\n\n## 前端\n- React\n- TypeScript",
"x": -400,
"y": -200,
"width": 360,
"height": 240,
"color": "1"
},
{
"id": "node-2",
"type": "text",
"text": "# 后端\n\n## API\n- Node.js\n- Express",
"x": 0,
"y": -200,
"width": 360,
"height": 240,
"color": "2"
},
{
"id": "node-3",
"type": "file",
"file": "Projects/ProjectA/架构决策.md",
"x": -200,
"y": 100,
"width": 400,
"height": 300
},
{
"id": "node-4",
"type": "text",
"text": "# 数据库\n\n数据库\nRedis",
"x": 400,
"y": 100,
"width": 300,
"height": 200,
"color": "3"
}
],
"edges": [
{
"id": "edge-1",
"fromNode": "node-1",
"toNode": "node-2",
"label": "API调用"
},
{
"id": "edge-2",
"fromNode": "node-2",
"toNode": "node-4",
"label": "数据访问"
},
{
"id": "edge-3",
"fromNode": "node-3",
"toNode": "node-1",
"label": "指导"
}
]
}
CANVAS
echo "✓ Canvas已创建:项目架构.canvas"
核心能力
vault发现与高级管理
多vault同步策略:
| 同步方式 | 优点 | 缺点 | 适用场景 |
|---:|---:|---:|---:|
| iCloud | 自动同步、无缝 | 仅限Apple生态 | Apple多设备 |
| Obsidian Git | 版本控制、跨平台 | 需手动配置 | 团队协作、版本管理 |
| Syncthing | 开源、P2P | 需配置 | 隐私敏感用户 |
| WebDAV | 通用协议 | 需服务器 | 企业环境 |
Obsidian Git工作流:
cd $HOME/Documents/MyVault
git init
git remote add origin git@your-git-server.com:username/my-vault.git
cat > .gitignore << 'EOF'
.obsidian/workspace.json
.obsidian/workspace-mobile.json
.trash/
EOF
冲突解决策略:
git pull origin main
git status
git add .
git commit -m "resolve merge conflict"
git push origin main
处理: 解析vault发现与高级管理的输入参数,完成核心逻辑,返回结构化响应.
输出: 返回vault发现与高级管理的响应数据,包含状态码、结果和日志.
笔记全生命周期管理(含批量操作)
批量搜索与操作
#!/bin/bash
VAULT=$(obsidian-cli print-default --path-only)
echo "=== 笔记统计 ==="
total=$(find "$VAULT" -name "*.md" -not -path "*/.obsidian/*" | wc -l)
echo "总笔记数:$total"
echo "=== 按类型统计 ==="
for type in meeting project daily decision; do
count=$(grep -rl "type: $type" "$VAULT" --include="*.md" 2>/dev/null | wc -l)
echo " $type: $count"
done
find "$VAULT" -name "*.md" -not -path "*/.obsidian/*" -not -path "*/Templates/*" | while read -r file; do
if ! head -1 "$file" | grep -q "^---$"; then
tmp_file=$(mktemp)
echo "---" > "$tmp_file"
echo "type: note" >> "$tmp_file"
echo "created: $(date +%Y-%m-%d)" >> "$tmp_file"
echo "tags: []" >> "$tmp_file"
echo "---" >> "$tmp_file"
echo "" >> "$tmp_file"
cat "$file" >> "$tmp_file"
mv "$tmp_file" "$file"
echo "✓ 添加frontmatter:$(basename "$file")"
fi
done
md" -path "*/Meetings/*" | while read -r file; do
if ! grep -q "tags:.*meeting" "$file"; then
sed -i '' 's/tags: \[/tags: [meeting, /' "$file" 2>/dev/null || \
sed -i 's/tags: \[/tags: [meeting, /' "$file"
echo "✓ 添加meeting标签:$(basename "$file")"
fi
done
find "$VAULT/Inbox" -name "*.md" -type f 2>/dev/null | while read -r file; do
if [ -f "$file" ]; then
create_date=$(grep "^created:" "$file" | head -1 | awk '{print $2}')
if [ -n "$create_date" ]; then
year=$(echo "$create_date" | cut -d'-' -f1)
month=$(echo "$create_date" | cut -d'-' -f2)
target_dir="$VAULT/Archive/$year/$month"
mkdir -p "$target_dir"
filename=$(basename "$file")
old_path="Inbox/${filename%.md}"
new_path="Archive/$year/$month/${filename%.md}"
obsidian-cli move "$old_path" "$new_path"
echo "✓ 归档:$old_path → $new_path"
fi
done
笔记关系图谱分析
import os
import re
import yaml
from pathlib import Path
from collections import defaultdict
class NoteGraphAnalyzer:
"""笔记关系图谱分析器(专业版)"""
def __init__(self, vault_path):
self.vault = Path(vault_path)
self.notes = {}
self.links = defaultdict(list)
def scan(self):
"""扫描所有笔记与链接"""
for md_file in self.vault.rglob("*.md"):
if ".obsidian" in str(md_file):
continue
rel_path = md_file.relative_to(self.vault)
note_name = md_file.stem
content = md_file.read_text(encoding="utf-8")
self.notes[note_name] = {
"path": str(rel_path),
"size": len(content),
"links_out": 0,
"links_in": 0
}
wikilinks = re.findall(r"\[\[([^\]]+)\]\]", content)
for link in wikilinks:
link_name = link.split("|")[0].split("/")[-1]
self.links[note_name].append(link_name)
self.notes[note_name]["links_out"] = len(wikilinks)
for source, targets in self.links.items():
for target in targets:
if target in self.notes:
notes[target]["links_in"] += 1
def find_orphans(self):
"""查找孤立笔记(无入度无出度)"""
orphans = []
for name, info in self.notes.items():
if info["links_in"] == 0 and info["links_out"] == 0:
orphans.append(name)
return orphans
def find_hubs(self, top_n=10):
"""查找枢纽笔记(入度最高)"""
sorted_notes = sorted(
self.notes.items(),
key=lambda x: x[1]["links_in"],
reverse=True
)
return sorted_notes[:top_n]
def find_broken_links(self):
"""查找失效链接"""
broken = []
for target in targets:
if target not in self.notes:
broken.append((source, target))
return broken
def stats(self):
"""返回统计信息"""
total_notes = len(self.notes)
total_links = sum(len(t) for t in self.links.values())
avg_links = total_links / total_notes if total_notes > 0 else 0
return {
"total_notes": total_notes,
"total_links": total_links,
"avg_links_per_note": round(avg_links, 2),
"orphans": len(self.find_orphans()),
"broken_links": len(self.find_broken_links())
}
analyzer = NoteGraphAnalyzer("$HOME/Documents/MyVault")
analyzer.scan()
print("=== 笔记图谱统计 ===")
stats = analyzer.stats()
for key, value in stats.items():
print(f" {key}: {value}")
print("\n=== Top 10 枢纽笔记 ===")
for name, info in analyzer.find_hubs(10):
print(f" {name}: 入度={info['links_in']}, 出度={info['links_out']}")
print("\n=== 孤立笔记 ===")
orphans = analyzer.find_orphans()
for name in orphans[:10]:
print(f" {name}")
if len(orphans) > 10:
print(f" ... 共{len(orphans)}个孤立笔记")
print("\n=== 失效链接 ===")
broken = analyzer.find_broken_links()
for source, target in broken[:10]:
print(f" [[{source}]] → [[{target}]] (不存在)")
if len(broken) > 10:
print(f" ... 共{len(broken)}个失效链接")
处理: 解析笔记全生命周期管理(含批量操作)的输入参数,完成核心逻辑,返回结构化响应.
输出: 返回笔记全生命周期管理(含批量操作)的响应数据,包含状态码、结果和日志.
- 执行此能力时使用input_params参数,支持创建/查询/导出操作
> 注: 本SKILL.md超过500行上限, 已截断尾部非核心章节以满足L1格式要求。完整内容见版本库历史。
FAQ
Q1: Obsidian工具箱(专业版)支持哪些输入格式?
A1: Obsidian综合工具箱专业版,含批量操作、高级模板、插件深度集成、Canvas管理与多vault高级管理.。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
Q2: 使用Obsidian工具箱(专业版)需要什么前置条件?
A2: 请确认运行环境满足依赖说明中的要求。Obsidian工具箱(专业版)基于Markdown指令驱动,无需额外安装包。
Q3: 命令行执行失败怎么办?
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。
安全注意事项
| 风险类型 | 防范措施 |
|---|---|
| 命令执行风险 | 仅执行白名单命令,避免拼接用户输入到命令行参数中 |
| 网络通信安全 | 使用HTTPS协议,验证SSL证书有效性 |
| 敏感数据暴露 | 输出结果中不包含密钥、令牌等敏感信息 |
| 使用前请确认已阅读依赖说明章节,确保运行环境满足安全要求。 | |
| ## 核心功能 | |
| - 自动化执行: Obsidian综合工具箱专业版,含批量操作、高级模板、插件深度集成、Canvas管理与多vault高级管理. | |
| - 文件处理: 支持多种文件格式的读取、解析和写入操作 | |
| - API集成: 通过标准化接口调用外部服务并处理响应 | |
| - 命令执行: 在安全沙箱中执行系统命令并收集结果 | |
| - 信息检索: 快速搜索和过滤目标数据 |