Compare commits
4
Commits
a9a89e57c3
...
bd960dbddd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bd960dbddd | ||
|
|
fad7335ba8 | ||
|
|
ff48dcf072 | ||
|
|
98522ef9be |
@@ -18,7 +18,7 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian",
|
"name": "obsidian",
|
||||||
"source": "./plugins/obsidian",
|
"source": "./plugins/obsidian",
|
||||||
"description": "Obsidian 知识库 AI 协作插件族:检测到 .obsidian/ 目录自动激活,含 vault 管理、搜索图谱、frontmatter、任务、每日笔记、Bases 数据库、版本历史、插件配置、PKM 编排工作流共 9 个技能"
|
"description": "Obsidian 知识库 AI 协作插件族:检测到 .obsidian/ 目录自动激活,含 vault 管理、搜索图谱、frontmatter、任务、每日笔记、Bases 数据库、Canvas 视觉层、版本历史、插件配置、PKM 编排工作流共 10 个技能"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# Memory Index
|
# Memory Index
|
||||||
> _Last synced: 2026-06-12 | Base commit: `38beecb`_
|
> _Last synced: 2026-06-12 | Base commit: `fad7335`_
|
||||||
|
|
||||||
| 文件 | 描述 | 类型 | 引用 | Commit |
|
| 文件 | 描述 | 类型 | 引用 | Commit |
|
||||||
|------|------|------|------|--------|
|
|------|------|------|------|--------|
|
||||||
| decisions.md | 关键架构决策:无版本号/userConfig/Bearer Token/SKILL.md规范/路径锁定/memcore三项优化/memcore-shared共享层/lint_report保活/Base commit兜底 | project | 1 | 38beecb |
|
| decisions.md | 关键架构决策:无版本号/userConfig/Bearer Token/SKILL.md规范/路径锁定/memcore三项优化/memcore-shared共享层/lint_report保活/Base commit兜底/obsidian社区对标审查 | project | 3 | fad7335 |
|
||||||
| project_overview.md | 项目定位、目录结构、插件规范、发布流程(huanxi/memcore/obsidian) | project | 1 | 38beecb |
|
| project_overview.md | 项目定位、目录结构、插件规范、发布流程(huanxi/memcore/obsidian 10 技能) | project | 1 | fad7335 |
|
||||||
| feedback_plugin_dev.md | 插件开发协作规范:同步四处/路径解析/工具签名对照/MCP docstring单一真相/签名变更全量扫描 | feedback | 1 | 38beecb |
|
| feedback_plugin_dev.md | 插件开发协作规范:同步四处/路径解析/工具签名对照/MCP docstring单一真相/签名变更全量扫描 | feedback | 1 | 38beecb |
|
||||||
| lint_report.md | memory-lint 最新执行结果 | lint | 0 | 38beecb |
|
| lint_report.md | memory-lint 最新执行结果 | lint | 0 | 38beecb |
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ name: 架构决策
|
|||||||
description: Marketplace 设计中的关键技术决策及其原因
|
description: Marketplace 设计中的关键技术决策及其原因
|
||||||
type: project
|
type: project
|
||||||
last_updated: 2026-06-12
|
last_updated: 2026-06-12
|
||||||
commit: 38beecb
|
commit: fad7335
|
||||||
---
|
---
|
||||||
|
|
||||||
# 关键架构决策
|
# 关键架构决策
|
||||||
@@ -136,3 +136,29 @@ commit: 38beecb
|
|||||||
**Why**:Claude Code 插件规范中 SKILL.md frontmatter 只定义了 `name` 和 `description`。`version` 字段不在规范内,silently ignored,且与 plugin.json 层面的版本管理重复。已从所有 huanxi skill 文件中移除。
|
**Why**:Claude Code 插件规范中 SKILL.md frontmatter 只定义了 `name` 和 `description`。`version` 字段不在规范内,silently ignored,且与 plugin.json 层面的版本管理重复。已从所有 huanxi skill 文件中移除。
|
||||||
|
|
||||||
**How to apply**:新建 SKILL.md 时只写这两个字段。`description` 字段写用户实际口语触发词(第三人称描述),不要用"当需要…时触发"的内部视角表达。
|
**How to apply**:新建 SKILL.md 时只写这两个字段。`description` 字段写用户实际口语触发词(第三人称描述),不要用"当需要…时触发"的内部视角表达。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## obsidian skill 集对标社区基准的审查 + 优化(2026-06-12)
|
||||||
|
|
||||||
|
**结论**:基于公开社区调研结果(kepano/obsidian-skills 31.8k★、AgriciDaniel/claude-obsidian 15 技能、qhuang20/obsidian-skills、pablo-mano/Obsidian-CLI-skill),对本地 9 技能完成全量审查并执行方案 B(中等扩展):
|
||||||
|
|
||||||
|
1. **P1 描述去冗余**:8 个子技能 description 末尾"检测到 .obsidian/ 时与核心技能同步激活"全部删除——Claude Code 路由器按关键词独立打分,没有"伴随激活"机制,此声明纯占预算。
|
||||||
|
2. **P5 obsidian-plugins 缩范围**:从"控制面板"宽泛定位收敛到"环境层(插件/主题/CSS/Templates/快捷键/命令)",加"首次配置 vault 批量装常用插件"高频场景。
|
||||||
|
3. **P6 obsidian-workflow-pkm 加引导**:description 显式声明"多步骤复合需求优先匹配本技能,单一原子操作走子技能",让"清理 inbox"等短指令更易命中编排层。
|
||||||
|
4. **P3 核心 obsidian 补 OFM 语法速查**:在第 4 章末尾增"Obsidian Flavored Markdown 语法速查"小节,覆盖 wikilinks/embeds/callouts/block refs/highlight/math 全表 + 写入时高频陷阱。
|
||||||
|
5. **P4 workflow-pkm 补 Workflow 8 Web Clip → Permanent**:单篇网页剪藏轻量流,引用 defuddle(Obsidian 团队官方 web→md 清洗工具)+ WebFetch 兜底,明确与 Workflow 7(批量文献)的边界。
|
||||||
|
6. **P2 新增 obsidian-canvas skill**:JSON Canvas 1.0 schema 速查 + 16 hex ID 生成 + 直接 Read/Write JSON 路线(社区共识:obsidian-cli 不原生支持 .canvas 写入)+ 安全 SOP 4 选项对照表(A git stash / B .bak / C 原子写 / D File Recovery)。
|
||||||
|
|
||||||
|
**Why**:
|
||||||
|
- 社区呈现两条路线:kepano「按文件格式分技能」(5 技能/精)、AgriciDaniel「按方法论分技能」(15 技能/全)。我们的「按工作域分技能」(9→10 技能)取中间路线,保留跨插件感知和职责互斥声明的独特优势。
|
||||||
|
- 8 处"伴随激活"提示是隐蔽设计错误——它假设了 Claude Code 路由器看不懂的联动语义,是单次审查中最大的描述质量收益点(每技能省 ~28 字符预算给真触发词)。
|
||||||
|
- canvas 是 Obsidian 开放格式且独立于 Markdown 体系,社区标杆都作为独立 skill 维护;不加 canvas 等于把"视觉知识图"这类高频场景拱手让人。
|
||||||
|
|
||||||
|
**How to apply**:
|
||||||
|
- 新增 skill 时,description 末尾**不要写"检测到 X 时与 Y 同步激活"**——Claude Code 路由按关键词独立打分。
|
||||||
|
- 触发词列表用 `触发词:A、B、C` 显式列;`不用于:X(技能名)` 显式互斥;这种结构提升路由准确率。
|
||||||
|
- 涉及 vault 内格式(.canvas/.base/.md)的能力,**默认独立成 skill**——不要塞进核心 obsidian。
|
||||||
|
- 学习模式契机:obsidian-canvas 的"AI 大批量写入回滚策略"4 选项对照表留给团队/用户决策,AI 不强制做掉,默认采用 C+D 作为决策前兜底。
|
||||||
|
|
||||||
|
**See Also**:[[feedback_plugin_dev.md#签名变更全量扫描]]、kepano/obsidian-skills、AgriciDaniel/claude-obsidian
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ name: 记忆健康检查报告
|
|||||||
description: memory-lint 最新一次执行的检查结果与待处理项
|
description: memory-lint 最新一次执行的检查结果与待处理项
|
||||||
type: lint
|
type: lint
|
||||||
last_updated: 2026-06-12
|
last_updated: 2026-06-12
|
||||||
commit: 38beecb
|
commit: fad7335
|
||||||
---
|
---
|
||||||
|
|
||||||
# 记忆健康检查报告
|
# 记忆健康检查报告
|
||||||
|
|
||||||
> _执行时间: 2026-06-12 | Base commit: `38beecb` | Last synced: 2026-06-12_
|
> _执行时间: 2026-06-12 | Base commit: `fad7335` | Last synced: 2026-06-12_
|
||||||
>
|
>
|
||||||
> **如何使用**:NEED-HUMAN 条目末尾有 `<!-- id: xxxxxxxx -->` 标记。处理完或决定不处理时,在同段追加 `<!-- resolved: DATE, 简要原因 -->`,下次 lint 该条目自动跳过。
|
> **如何使用**:NEED-HUMAN 条目末尾有 `<!-- id: xxxxxxxx -->` 标记。处理完或决定不处理时,在同段追加 `<!-- resolved: DATE, 简要原因 -->`,下次 lint 该条目自动跳过。
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ commit: 38beecb
|
|||||||
|
|
||||||
| 检查项 | AUTO-FIX | NEED-HUMAN |
|
| 检查项 | AUTO-FIX | NEED-HUMAN |
|
||||||
|--------|---------|-----------|
|
|--------|---------|-----------|
|
||||||
| 1 孤儿 / 2 幽灵 / 3A 引用 / 3B 双链 | 0 / 0 / 0 / 1 | — / — / 0 / 0 |
|
| 1 孤儿 / 2 幽灵 / 3A 引用 / 3B 双链 | 0 / 0 / 1 / 0 | — / — / 0 / 0 |
|
||||||
| 4 矛盾 / 5 过期 / 6 污染 | — | 0 / 0 / 0 |
|
| 4 矛盾 / 5 过期 / 6 污染 | — | 0 / 0 / 0 |
|
||||||
|
|
||||||
**AUTO-FIX 已执行 1 项 | NEED-HUMAN 新列出 0 项 | 历史已 resolved 跳过 0 项**
|
**AUTO-FIX 已执行 1 项 | NEED-HUMAN 新列出 0 项 | 历史已 resolved 跳过 0 项**
|
||||||
@@ -25,8 +25,16 @@ commit: 38beecb
|
|||||||
|
|
||||||
## AUTO-FIX 已执行清单
|
## AUTO-FIX 已执行清单
|
||||||
|
|
||||||
- [x] 双链补全(Phase 3B):`feedback_plugin_dev.md#skill 不要重写 MCP 参数表,引用 docstring` 末尾追加对 `[[decisions.md#memcore-shared:路径锁定 + 全局常量的单一来源]]` 的反向引用
|
- [x] 文件级引用计数刷新(Phase 3A):decisions.md 新增 obsidian 审查 Section 引入新引用关系,更新 MEMORY.md「引用」列:decisions 1→3(按源去重,新增 lint_report 与 feedback_plugin_dev 作为源);project_overview / feedback_plugin_dev 仍为 1(同源去重)
|
||||||
- [x] MEMORY.md「引用」列已刷新(4 文件)
|
- [x] **核心枢纽阈值达成**:`decisions.md` 文件级引用数 = 3(feedback_plugin_dev / lint_report / project_overview 三源),达到 SYNTHESIS_THRESHOLD(3),列入下方核心枢纽节点
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 核心枢纽节点(文件级引用 ≥ SYNTHESIS_THRESHOLD = 3)
|
||||||
|
|
||||||
|
| 文件 | 引用源数 | 含义 |
|
||||||
|
|------|--------|------|
|
||||||
|
| **decisions.md** | 3 | 该文件已成为记忆体系的中心节点(被 3 个不同 memory 文件引用);新增决策时优先考虑是否会形成跨多领域影响 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -38,7 +46,7 @@ commit: 38beecb
|
|||||||
|------|----------|------|
|
|------|----------|------|
|
||||||
| — | — | 无候选 |
|
| — | — | 无候选 |
|
||||||
|
|
||||||
当前所有 decisions/feedback 条目的跨文件引用数均 < 3,无 synthesis 升级候选。
|
当前所有 decisions/feedback 条目的**单 section 级**跨文件引用数均 < 3,无 synthesis 升级候选。文件级已达阈值不触发 section 升级。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -54,7 +62,7 @@ commit: 38beecb
|
|||||||
|
|
||||||
| 文件 | 被引用次数(去重源) | 引用来源 |
|
| 文件 | 被引用次数(去重源) | 引用来源 |
|
||||||
|------|-------|---------|
|
|------|-------|---------|
|
||||||
| project_overview.md | 1 | decisions.md(2 个章节,同一源文件去重为 1) |
|
| **decisions.md** | **3** | feedback_plugin_dev.md / lint_report.md / project_overview.md |
|
||||||
| decisions.md | 1 | project_overview.md |
|
| project_overview.md | 1 | decisions.md(含 2 个 wikilink,同源去重为 1) |
|
||||||
| feedback_plugin_dev.md | 1 | decisions.md |
|
| feedback_plugin_dev.md | 1 | decisions.md(含 2 个 wikilink:memcore-shared 共享层 + obsidian 审查 See Also,同源去重为 1) |
|
||||||
| lint_report.md | 0 | — |
|
| lint_report.md | 0 | — |
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ name: 项目概述
|
|||||||
description: yixiong-claude-marketplace 的定位、目录结构、插件规范和发布流程
|
description: yixiong-claude-marketplace 的定位、目录结构、插件规范和发布流程
|
||||||
type: project
|
type: project
|
||||||
last_updated: 2026-06-12
|
last_updated: 2026-06-12
|
||||||
commit: 38beecb
|
commit: fad7335
|
||||||
---
|
---
|
||||||
|
|
||||||
# 蚁熊内部 Claude Code Marketplace
|
# 蚁熊内部 Claude Code Marketplace
|
||||||
@@ -62,7 +62,7 @@ description: "触发描述(用户实际口语,不用内部视角)"
|
|||||||
|------|------|------|
|
|------|------|------|
|
||||||
| `huanxi` | 6 个(report/leader/task/weekly/org/shared) | userConfig Bearer Token + MCP Server(URL 走 office 子域,无端口) |
|
| `huanxi` | 6 个(report/leader/task/weekly/org/shared) | userConfig Bearer Token + MCP Server(URL 走 office 子域,无端口) |
|
||||||
| `memcore` | 4 个(memory-sync/lint/update/shared) | 纯技能,无 MCP;memcore-shared 作内部 include(路径锁定 + 阈值常量 + PROJECT_DIR 解析),支持 synonyms.md 等价词表、Phase 3C 即时引用快扫、Phase 0 并发冲突保护、lint_report 稳定 ID + resolved 跳过、Base commit 兜底 |
|
| `memcore` | 4 个(memory-sync/lint/update/shared) | 纯技能,无 MCP;memcore-shared 作内部 include(路径锁定 + 阈值常量 + PROJECT_DIR 解析),支持 synonyms.md 等价词表、Phase 3C 即时引用快扫、Phase 0 并发冲突保护、lint_report 稳定 ID + resolved 跳过、Base commit 兜底 |
|
||||||
| `obsidian` | 9 个(obsidian/bases/daily/history/meta/plugins/search/tasks/workflow-pkm) | 纯技能,无 MCP |
|
| `obsidian` | 10 个(obsidian/bases/canvas/daily/history/meta/plugins/search/tasks/workflow-pkm) | 纯技能,无 MCP;对标社区基准(kepano/obsidian-skills 31.8k★、AgriciDaniel/claude-obsidian)后扩展 canvas 视觉层;核心 obsidian 含 OFM 语法速查;workflow-pkm 含 Web Clip 子流程 |
|
||||||
|
|
||||||
**See Also**:[[decisions.md#huanxi plugin 使用 userConfig 而非环境变量传 Token]]
|
**See Also**:[[decisions.md#huanxi plugin 使用 userConfig 而非环境变量传 Token]]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<!-- Last updated: 2026-06-12 | Commit: 38beecb -->
|
<!-- Last updated: 2026-06-12 | Commit: fad7335 -->
|
||||||
# CLAUDE.md
|
# CLAUDE.md
|
||||||
|
|
||||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
@@ -78,7 +78,7 @@ description: 一句话说明该技能的用途(Claude 用此判断何时触发
|
|||||||
|------|------|------|
|
|------|------|------|
|
||||||
| `huanxi` | `/huanxi-shared` `/huanxi-report` `/huanxi-leader` `/huanxi-task` `/huanxi-weekly` `/huanxi-org` | 寰汐企业管理系统完整工作流,含 MCP Server 自动配置 |
|
| `huanxi` | `/huanxi-shared` `/huanxi-report` `/huanxi-leader` `/huanxi-task` `/huanxi-weekly` `/huanxi-org` | 寰汐企业管理系统完整工作流,含 MCP Server 自动配置 |
|
||||||
| `memcore` | `/memory-sync` `/memory-update` `/memory-lint` `/memcore-shared`(内部 include) | 项目记忆体系核心引擎 |
|
| `memcore` | `/memory-sync` `/memory-update` `/memory-lint` `/memcore-shared`(内部 include) | 项目记忆体系核心引擎 |
|
||||||
| `obsidian` | `/obsidian` `/obsidian-bases` `/obsidian-daily` `/obsidian-history` `/obsidian-meta` `/obsidian-plugins` `/obsidian-search` `/obsidian-tasks` `/obsidian-workflow-pkm` | Obsidian 知识库完整工作流(9 个技能) |
|
| `obsidian` | `/obsidian` `/obsidian-bases` `/obsidian-canvas` `/obsidian-daily` `/obsidian-history` `/obsidian-meta` `/obsidian-plugins` `/obsidian-search` `/obsidian-tasks` `/obsidian-workflow-pkm` | Obsidian 知识库完整工作流(10 个技能;对标 kepano/obsidian-skills 31.8k★ 与 AgriciDaniel/claude-obsidian) |
|
||||||
|
|
||||||
### memcore 技能调用关系
|
### memcore 技能调用关系
|
||||||
|
|
||||||
@@ -111,8 +111,8 @@ description: 一句话说明该技能的用途(Claude 用此判断何时触发
|
|||||||
```
|
```
|
||||||
.claude/memory/
|
.claude/memory/
|
||||||
├── MEMORY.md # 索引(入口)
|
├── MEMORY.md # 索引(入口)
|
||||||
├── decisions.md # 关键架构决策(含 memcore-shared/lint_report 保活/Base commit 兜底等 11 项)
|
├── decisions.md # 关键架构决策(含 memcore-shared/lint_report 保活/Base commit 兜底/obsidian 社区对标审查等 12 项)
|
||||||
├── project_overview.md # 项目定位与结构(huanxi/memcore/obsidian 已发布插件)
|
├── project_overview.md # 项目定位与结构(huanxi/memcore/obsidian 10 技能 已发布插件)
|
||||||
├── feedback_plugin_dev.md # 插件开发协作规范(含 MCP docstring 单一真相、签名变更全量扫描)
|
├── feedback_plugin_dev.md # 插件开发协作规范(含 MCP docstring 单一真相、签名变更全量扫描)
|
||||||
└── lint_report.md # 记忆健康检查报告(按需)
|
└── lint_report.md # 记忆健康检查报告(按需)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian",
|
"name": "obsidian",
|
||||||
"description": "Obsidian 知识库 AI 协作插件族。检测到 .obsidian/ 目录时自动激活全套技能:vault 管理(obsidian)、全文搜索与图谱(obsidian-search)、frontmatter 元数据(obsidian-meta)、Markdown 任务与 GTD(obsidian-tasks)、每日笔记(obsidian-daily)、Bases 数据库视图(obsidian-bases)、版本历史与恢复(obsidian-history)、插件与环境配置(obsidian-plugins)、PKM 编排工作流(obsidian-workflow-pkm)。",
|
"description": "Obsidian 知识库 AI 协作插件族。检测到 .obsidian/ 目录时自动激活全套技能:vault 管理(obsidian,含 OFM 语法速查)、全文搜索与图谱(obsidian-search)、frontmatter 元数据(obsidian-meta)、Markdown 任务与 GTD(obsidian-tasks)、每日笔记(obsidian-daily)、Bases 数据库视图(obsidian-bases)、Canvas 视觉层(obsidian-canvas,JSON Canvas 1.0)、版本历史与恢复(obsidian-history)、插件与环境配置(obsidian-plugins)、PKM 编排工作流(obsidian-workflow-pkm,含 Web Clip 子流程)。",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "姜顺志"
|
"name": "姜顺志"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-bases
|
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/ 时与核心技能同步激活。
|
description: Obsidian 1.9+ 原生数据库视图(Bases):查询 .base 文件中的结构化视图(JSON/CSV/MD 输出)、在 base 中创建新条目。触发词:Bases、base 视图、数据库视图、结构化查询笔记、base query。不用于 Dataview(社区插件,用其原生 DQL 语法)。依赖 YAML frontmatter 属性,与 obsidian-meta 配合使用;需 Obsidian ≥ 1.9。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian Bases · 原生数据库视图
|
# Obsidian Bases · 原生数据库视图
|
||||||
|
|||||||
@@ -0,0 +1,228 @@
|
|||||||
|
---
|
||||||
|
name: obsidian-canvas
|
||||||
|
description: Obsidian 视觉层操作——读写 .canvas 文件(JSON Canvas 1.0 开放格式):思维导图、项目看板、视觉知识图、AI 生成节点布局。支持 4 种 node 类型(text/file/link/group)+ edges 连线(fromNode/toNode/fromSide/toSide)。触发词:canvas、画布、思维导图、视觉知识图、项目看板、白板、可视化笔记、mind map、白板视图、节点图。不用于 Markdown 笔记 CRUD(obsidian 核心)、不用于 Bases 数据库视图(obsidian-bases,那是表格不是画布)。社区共识:obsidian-cli 不原生支持 .canvas 写入,本技能走直接 JSON 文件 Read/Write 路线。
|
||||||
|
---
|
||||||
|
|
||||||
|
# Obsidian Canvas · JSON Canvas 视觉层
|
||||||
|
|
||||||
|
> **为什么独立成技能**:Canvas 是 Obsidian 的开放格式(`.canvas` = JSON),社区标杆(kepano/obsidian-skills、AgriciDaniel/claude-obsidian)都把它作为独立 skill 维护,因为它的 schema 完全独立于 Markdown 笔记体系——AI 不能用一句 wikilink 替代一张画布。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 何时使用
|
||||||
|
|
||||||
|
- 用户说"把这些笔记画成一张图/思维导图/项目看板"
|
||||||
|
- 用户给一个 `.canvas` 文件让 AI 读取/修改
|
||||||
|
- 大主题展开时,AI 主动建议"做成 canvas 更清晰"
|
||||||
|
- 项目启动时,用 canvas 做"模块 - 任务 - 负责人"鸟瞰图
|
||||||
|
- 把研究网络(多篇笔记 + 几张图片 + 几个外链)摆到一张画布上
|
||||||
|
|
||||||
|
## 不用于
|
||||||
|
|
||||||
|
- Markdown 笔记本身的 CRUD → `obsidian` 核心技能
|
||||||
|
- 结构化数据库视图(表格、列表、卡片) → `obsidian-bases`
|
||||||
|
- 笔记间的双向链接图(Obsidian 自带 Graph View) → `obsidian-search` 的 graph 子集
|
||||||
|
- 单纯画流程图/时序图(Mermaid 块) → 写在 Markdown 笔记里即可
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. JSON Canvas 1.0 Schema 速查
|
||||||
|
|
||||||
|
`.canvas` 文件结构:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"nodes": [ /* 数组顺序 = z-index(先画的在底层) */ ],
|
||||||
|
"edges": [ /* 连线,order 不影响 z-index */ ]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.1 Node 公共字段
|
||||||
|
|
||||||
|
| 字段 | 类型 | 必填 | 说明 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| `id` | string | ✅ | **16 字符小写 hex**(Obsidian 约定,64-bit 随机) |
|
||||||
|
| `type` | enum | ✅ | `text` / `file` / `link` / `group` |
|
||||||
|
| `x`, `y` | number | ✅ | 画布坐标(左上原点,向右/下为正,无单位) |
|
||||||
|
| `width`, `height` | number | ✅ | 节点尺寸(像素) |
|
||||||
|
| `color` | string | ❌ | `"1"`-`"6"`(预设色)或 `"#RRGGBB"`(自定义) |
|
||||||
|
|
||||||
|
预设色:`1`=红, `2`=橙, `3`=黄, `4`=绿, `5`=青, `6`=紫。
|
||||||
|
|
||||||
|
### 1.2 四种 Node 专属字段
|
||||||
|
|
||||||
|
| `type` | 专属字段 | 用途 |
|
||||||
|
|--------|---------|------|
|
||||||
|
| `text` | `text`: string(Markdown 内容,**换行用 `\n`,不要字面量 `\\n`**) | 在画布上写笔记片段 |
|
||||||
|
| `file` | `file`: string(vault 内相对路径,如 `"50-Zettel/abc.md"`);可选 `subpath`: 跳转锚点(`#标题` 或 `#^blockid`) | 嵌入一篇笔记/图片/PDF |
|
||||||
|
| `link` | `url`: string | 嵌入外部网页 |
|
||||||
|
| `group` | `label`: string(分组标题);通常配 `color` 区分 | 视觉容器(不是真包含,只是覆盖矩形) |
|
||||||
|
|
||||||
|
### 1.3 Edge 字段
|
||||||
|
|
||||||
|
| 字段 | 类型 | 必填 | 说明 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| `id` | string | ✅ | 同 16 字符 hex |
|
||||||
|
| `fromNode` / `toNode` | string | ✅ | 引用 node 的 `id` |
|
||||||
|
| `fromSide` / `toSide` | enum | ❌ | `top` / `right` / `bottom` / `left`(默认自动选最近边) |
|
||||||
|
| `fromEnd` / `toEnd` | enum | ❌ | `none` / `arrow`(默认 `toEnd=arrow`,`fromEnd=none`) |
|
||||||
|
| `color` | string | ❌ | 同 node color |
|
||||||
|
| `label` | string | ❌ | 连线上的文字 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 16 字符 hex ID 生成
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Bash(Git Bash 可用)
|
||||||
|
openssl rand -hex 8 # 推荐
|
||||||
|
# 或
|
||||||
|
head -c 8 /dev/urandom | xxd -p # POSIX 兼容
|
||||||
|
|
||||||
|
# Python
|
||||||
|
python -c "import secrets; print(secrets.token_hex(8))"
|
||||||
|
|
||||||
|
# 节点和边的 ID 不要复用;同一 canvas 内全局唯一
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 标准操作模式
|
||||||
|
|
||||||
|
> **社区共识**:obsidian-cli **不**原生支持 `.canvas` 写入。本技能走 `Read` + `Write` 工具直接编辑 JSON。
|
||||||
|
|
||||||
|
### 3.1 读取一张 canvas
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 列 vault 中所有 canvas
|
||||||
|
obsidian files ext=canvas format=json
|
||||||
|
|
||||||
|
# 直接读(用 Read 工具或 cat)
|
||||||
|
cat "MyVault/项目鸟瞰.canvas" | jq .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 新建一张空 canvas
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo '{"nodes":[],"edges":[]}' > "MyVault/项目鸟瞰.canvas"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 添加节点(Python helper 比 bash 安全)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# add_node.py
|
||||||
|
import json, secrets, sys
|
||||||
|
|
||||||
|
path = sys.argv[1]
|
||||||
|
with open(path, 'r', encoding='utf-8') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
data['nodes'].append({
|
||||||
|
"id": secrets.token_hex(8),
|
||||||
|
"type": "text",
|
||||||
|
"x": 0, "y": 0, "width": 250, "height": 60,
|
||||||
|
"text": "新节点"
|
||||||
|
})
|
||||||
|
|
||||||
|
with open(path, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.4 布局建议
|
||||||
|
|
||||||
|
- **网格起步**:节点 250×60,间隔 80px,AI 先排成网格再让用户手动调
|
||||||
|
- **文本节点行高**:每行约 22px,预估 `height = 行数 × 22 + 16`(padding)
|
||||||
|
- **group 覆盖范围**:先算所有子节点的 bounding box,再 `x -= 20, y -= 40, width += 40, height += 60`
|
||||||
|
- **文件节点**:默认 400×400(带预览渲染),单行文本节点 250×60
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 与 Markdown 笔记的协作模式
|
||||||
|
|
||||||
|
最强用法:**canvas 当成"鸟瞰图 + 入口",节点 = 笔记 file 引用**。
|
||||||
|
不要在 canvas 里写大段正文——那是 Markdown 的活;canvas 只承担**空间关系**。
|
||||||
|
|
||||||
|
| 模式 | 怎么做 |
|
||||||
|
|------|--------|
|
||||||
|
| 项目板 | 4 个 group(Backlog/Doing/Done/Archive),每个任务一个 file 节点 |
|
||||||
|
| 主题鸟瞰 | 中心 group = 主题名,周围环绕 file 节点(每篇相关 zettel) |
|
||||||
|
| 研究地图 | text 节点写问题,file 节点放参考资料,edge 标关系("支持/反驳/引用") |
|
||||||
|
| AI 生成 | AI 读多篇笔记后生成 canvas:自动布局 + 用 edge.label 标"先验/同源/对立" |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 安全 SOP(AI 大批量写入的回滚策略)
|
||||||
|
|
||||||
|
> ⚠ **决策待定**:以下 4 选项需要团队定调。在写入前防止半写状态导致 canvas 损坏。
|
||||||
|
|
||||||
|
| 选项 | 操作 | 依赖 | 失败回退 | 适用边界 |
|
||||||
|
|------|------|------|---------|---------|
|
||||||
|
| **A · git stash** | 写前 `git stash`;失败 `git stash pop` | vault 是 git repo | stash 仍在 stash 栈 | vault 用 git 托管 |
|
||||||
|
| **B · .bak 备份** | 写前 `cp x.canvas x.canvas.bak`;失败手动 `mv` 回滚 | 无 | 半人工 | 任何 vault |
|
||||||
|
| **C · 原子写** | 写 `x.canvas.tmp` → `mv .tmp .canvas`(rename 原子操作) | 无 | tmp 残留可清理 | 任何 vault |
|
||||||
|
| **D · 依赖 File Recovery** | 不做额外保护,靠 Obsidian 内置 File Recovery(默认 7 天)回滚 | Obsidian 内置 | 需手动进入 obsidian-history 找版本 | vault 用户启用 File Recovery 且能及时发现失败 |
|
||||||
|
|
||||||
|
<!-- TODO(user): 由你最终拍板。建议复用 memcore 的并发冲突保护哲学保持一致性。
|
||||||
|
请用 5-10 行写入下方"决策"段落,包含:
|
||||||
|
1. 选哪个(A/B/C/D 或组合)
|
||||||
|
2. 为什么这个最适合本团队的 vault 使用场景
|
||||||
|
3. 失败时具体怎么回退(命令级)
|
||||||
|
4. 不适用边界(什么情况下不要这么做)
|
||||||
|
-->
|
||||||
|
|
||||||
|
### 决策(团队规范)
|
||||||
|
|
||||||
|
> **当前**:[ 留待填入 ]
|
||||||
|
>
|
||||||
|
> 在确认前,AI agent **默认采用选项 C(原子写)+ 选项 D(File Recovery 兜底)**——成本最低、不依赖 git、对 vault 无侵入。但这不是最终决策,请团队确认。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 选项 C 默认实现(在团队决策前生效的兜底)
|
||||||
|
canvas_atomic_write() {
|
||||||
|
local path="$1"
|
||||||
|
local new_content="$2"
|
||||||
|
local tmp="${path}.tmp.$$"
|
||||||
|
echo "$new_content" > "$tmp" && \
|
||||||
|
python -c "import json,sys; json.load(open('$tmp'))" && \
|
||||||
|
mv "$tmp" "$path"
|
||||||
|
# JSON 校验失败时不 mv,原文件不受影响,tmp 残留待清理
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 常见陷阱
|
||||||
|
|
||||||
|
| 现象 | 原因 | 对策 |
|
||||||
|
|------|------|------|
|
||||||
|
| Canvas 打开后空白 | JSON 不合法(缺逗号、注释) | JSON Canvas 不支持注释;用 `jq .` 先校验 |
|
||||||
|
| 节点位置错乱 | x/y 用了字符串 | 必须是 number,不要 `"x": "100"` |
|
||||||
|
| 中文字符乱码 | 编码不是 UTF-8 | Python 打开/保存必须 `encoding='utf-8'`,`ensure_ascii=False` |
|
||||||
|
| `\n` 显示为字面量 | 用了 `\\n`(双反斜杠) | JSON 字符串里换行就是单 `\n` |
|
||||||
|
| Edge 不显示 | `fromNode`/`toNode` 引用的 ID 不存在 | 写 edge 前先确认两端 node 已写入 |
|
||||||
|
| 文件节点没预览 | `file` 路径错误(不是 vault 内相对路径) | 用 `obsidian files` 获取的标准路径 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 与社区 schema 兼容性
|
||||||
|
|
||||||
|
本技能严格遵循 [JSON Canvas Spec 1.0](https://jsoncanvas.org/)(Obsidian、Logseq、Anytype 等多家共用)。
|
||||||
|
即便用户离开 Obsidian,`.canvas` 文件依然可被其他兼容工具读取——这是 Obsidian 开放格式承诺的核心价值。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 与其他 obsidian-* 技能的关系
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
canvas["obsidian-canvas<br/>(视觉层)"]
|
||||||
|
core["obsidian<br/>(Markdown CRUD)"]
|
||||||
|
search["obsidian-search<br/>(找节点要的笔记)"]
|
||||||
|
meta["obsidian-meta<br/>(节点的 frontmatter)"]
|
||||||
|
workflow["obsidian-workflow-pkm<br/>(MOC 编排时调用)"]
|
||||||
|
|
||||||
|
workflow -- "MOC Builder 可输出 canvas" --> canvas
|
||||||
|
canvas -- "file 节点引用" --> core
|
||||||
|
canvas -- "新建 file 节点前查重" --> search
|
||||||
|
canvas -- "节点字段约定" --> meta
|
||||||
|
```
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-daily
|
name: obsidian-daily
|
||||||
description: Obsidian 每日笔记工作流:读取/追加今日笔记内容、晨间规划注入、晚间回顾、AI 操作审计日志写入、快速灵感捕获。触发词:每日笔记、daily note、今天的笔记、晨间笔记、晚间回顾、写日志、快速捕获、quick capture。周报/月报汇总请用 obsidian-workflow-pkm,跨日搜索请用 obsidian-search。需 Obsidian Daily Notes 核心插件已启用。检测到 .obsidian/ 时与核心技能同步激活。
|
description: Obsidian 每日笔记工作流:读取/追加今日笔记内容、晨间规划注入、晚间回顾、AI 操作审计日志写入、快速灵感捕获。触发词:每日笔记、daily note、今天的笔记、晨间笔记、晚间回顾、写日志、快速捕获、quick capture。周报/月报汇总请用 obsidian-workflow-pkm,跨日搜索请用 obsidian-search。需 Obsidian Daily Notes 核心插件已启用。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian Daily · 每日笔记工作流
|
# Obsidian Daily · 每日笔记工作流
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-history
|
name: obsidian-history
|
||||||
description: Obsidian 版本历史与同步管理:查看/恢复/对比 File Recovery 本地快照(`history:*`)、管理 Obsidian Sync 的暂停与恢复(`sync:*`)、从云端回收站恢复误删文件。触发词:误删、恢复笔记、文件历史、版本恢复、版本对比、diff 笔记、Obsidian Sync、同步暂停。不用于 git 版本控制(直接 Bash git 命令)。Sync 相关命令需付费 Obsidian Sync 订阅。检测到 .obsidian/ 时与核心技能同步激活。
|
description: Obsidian 版本历史与同步管理:查看/恢复/对比 File Recovery 本地快照(`history:*`)、管理 Obsidian Sync 的暂停与恢复(`sync:*`)、从云端回收站恢复误删文件。触发词:误删、恢复笔记、文件历史、版本恢复、版本对比、diff 笔记、Obsidian Sync、同步暂停。不用于 git 版本控制(直接 Bash git 命令)。Sync 相关命令需付费 Obsidian Sync 订阅。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian History · 版本历史与同步
|
# Obsidian History · 版本历史与同步
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-meta
|
name: obsidian-meta
|
||||||
description: 管理 Obsidian 笔记元数据:YAML frontmatter 属性(status/tags/created/due 等)读写、tag 统计与体系治理、aliases 别名、bookmarks 书签、为 Dataview/Bases 设计字段规范。触发词:frontmatter、设置属性、tag、标签、别名、书签、属性读写。不用于全文搜索(obsidian-search)或 Bases 视图查询(obsidian-bases)。检测到 .obsidian/ 时与核心技能同步激活。
|
description: 管理 Obsidian 笔记元数据:YAML frontmatter 属性(status/tags/created/due 等)读写、tag 统计与体系治理、aliases 别名、bookmarks 书签、为 Dataview/Bases 设计字段规范。触发词:frontmatter、设置属性、tag、标签、别名、书签、属性读写。不用于全文搜索(obsidian-search)或 Bases 视图查询(obsidian-bases)。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian Meta · 元数据管理
|
# Obsidian Meta · 元数据管理
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-plugins
|
name: obsidian-plugins
|
||||||
description: 管理 Obsidian 环境配置:核心/社区插件的启用/禁用/安装/卸载、主题切换、CSS snippets 管理、Templates 模板管理、Obsidian 内置命令执行、快捷键查询。触发词:启用插件、社区插件、Obsidian 主题、CSS snippet、Templates、快捷键、hotkey、首次配置 vault。不用于笔记内容 CRUD(obsidian 核心技能)。检测到 .obsidian/ 时与核心技能同步激活。
|
description: 管理 Obsidian 环境层配置——插件(核心/社区,启用/禁用/安装/卸载)、主题切换、CSS snippets、Templates 模板、内置命令(command id)、快捷键 hotkeys。高频场景:首次配置 vault 时批量装常用插件、按团队规范统一主题/CSS。触发词:启用插件、社区插件、Obsidian 主题、CSS snippet、Templates、快捷键、hotkey、内置命令、首次配置 vault、安装插件。不用于笔记内容 CRUD(obsidian 核心技能),不用于 frontmatter 属性(obsidian-meta)。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian Plugins · 环境配置管理
|
# Obsidian Plugins · 环境配置管理
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-search
|
name: obsidian-search
|
||||||
description: Obsidian vault 全文搜索与链接图谱分析。触发场景:搜索笔记内容、查反链/出链、体检图谱健康度(孤立笔记 orphans、断头笔记 deadends、未解析链接 unresolved)、AI 回答前做语义召回(RAG)。触发词:搜索笔记、找笔记、反链、出链、孤立笔记、图谱体检、知识库体检。不用于 tag 查询(obsidian-meta)或 Bases 结构化查询(obsidian-bases)。检测到 .obsidian/ 时与核心技能同步激活。
|
description: Obsidian vault 全文搜索与链接图谱分析。触发场景:搜索笔记内容、查反链/出链、体检图谱健康度(孤立笔记 orphans、断头笔记 deadends、未解析链接 unresolved)、AI 回答前做语义召回(RAG)。触发词:搜索笔记、找笔记、反链、出链、孤立笔记、图谱体检、知识库体检。不用于 tag 查询(obsidian-meta)或 Bases 结构化查询(obsidian-bases)。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian Search · 搜索与图谱分析
|
# Obsidian Search · 搜索与图谱分析
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-tasks
|
name: obsidian-tasks
|
||||||
description: 管理 Obsidian vault 中基于 Markdown 复选框(`- [ ]`/`- [x]`)的任务清单与 GTD 工作流:跨文件列出/筛选任务、切换单条任务状态、项目进度统计、收集-处理-执行流程。触发词:todo、待办、任务清单、完成任务、GTD、任务状态。不用于 Linear/飞书任务(linear/lark-task),不用于 frontmatter status 字段(obsidian-meta)。检测到 .obsidian/ 时与核心技能同步激活。
|
description: 管理 Obsidian vault 中基于 Markdown 复选框(`- [ ]`/`- [x]`)的任务清单与 GTD 工作流:跨文件列出/筛选任务、切换单条任务状态、项目进度统计、收集-处理-执行流程。触发词:todo、待办、任务清单、完成任务、GTD、任务状态。不用于 Linear/飞书任务(linear/lark-task),不用于 frontmatter status 字段(obsidian-meta)。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian Tasks · 任务清单管理
|
# Obsidian Tasks · 任务清单管理
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-workflow-pkm
|
name: obsidian-workflow-pkm
|
||||||
description: Obsidian PKM 高阶编排工作流,组合调用多个 obsidian-* 子技能完成端到端流程:Inbox → Zettelkasten 原子化、MOC 主题地图构建、PARA 项目归档、Karpathy LLM-Wiki、周报/月报汇总、季度知识库体检、文献批量导入。触发词:整理 inbox、原子化笔记、构建 MOC、PARA 归档、LLM wiki、周报、月报、知识库体检、Zettelkasten 流程。单一原子操作请用对应专项子技能。检测到 .obsidian/ 时与核心技能同步激活。
|
description: Obsidian PKM 端到端编排层——专为"多步骤复合需求"设计,组合调用 obsidian-* 子技能。覆盖 Inbox→Zettelkasten 原子化、MOC 主题地图、PARA 项目归档、Karpathy LLM-Wiki、周报/月报汇总、季度知识库体检、文献批量导入、Web Clip→永久笔记。**优先匹配**:当用户说"整理 inbox/构建 MOC/做季度体检/汇总周报/clip 这篇文章"等多步骤指令时,先进入本技能(编排层)再下发子技能;单一原子操作(搜一篇笔记、改一个属性)请直接用 obsidian-search/meta 等专项子技能。触发词:整理 inbox、原子化笔记、构建 MOC、PARA 归档、LLM wiki、周报、月报、知识库体检、Zettelkasten 流程、web clip、网页剪藏、批量导入文献。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Obsidian Workflow · PKM 编排工作流
|
# Obsidian Workflow · PKM 编排工作流
|
||||||
@@ -22,6 +22,7 @@ description: Obsidian PKM 高阶编排工作流,组合调用多个 obsidian-*
|
|||||||
| 生成周报/月报 | **Workflow 5: 周报 / 月报汇总** |
|
| 生成周报/月报 | **Workflow 5: 周报 / 月报汇总** |
|
||||||
| 季度知识库健康度体检 | **Workflow 6: 季度体检** |
|
| 季度知识库健康度体检 | **Workflow 6: 季度体检** |
|
||||||
| 从网页/PDF 批量导入并原子化 | **Workflow 7: 文献批量导入** |
|
| 从网页/PDF 批量导入并原子化 | **Workflow 7: 文献批量导入** |
|
||||||
|
| 单篇网页剪藏 → 永久笔记 | **Workflow 8: Web Clip → Permanent** |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -459,6 +460,120 @@ done
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Workflow 8 · Web Clip → Permanent(单篇网页剪藏)
|
||||||
|
|
||||||
|
**目标**:用户给一个 URL(或一段文字),AI 抓取→清洗→提炼→落 `30-Resources/` 或 `50-Zettel/`,比 Workflow 7(批量文献)更轻量、即时。
|
||||||
|
|
||||||
|
### 与 Workflow 7 的区别
|
||||||
|
|
||||||
|
| 维度 | Workflow 7 | Workflow 8 |
|
||||||
|
|------|-----------|-----------|
|
||||||
|
| 触发 | 一批 URL/PDF | 单条 URL/选文 |
|
||||||
|
| 目录 | `20-Literature/` | `30-Resources/` 或 `50-Zettel/` |
|
||||||
|
| 时机 | 批处理 | 即时单次 |
|
||||||
|
| 决策点 | 一次全批确认 | 每次都确认 |
|
||||||
|
|
||||||
|
### 步骤
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────────┐
|
||||||
|
│ 1. 抓取网页正文 │ defuddle(社区标准)/ WebFetch / curl + readability
|
||||||
|
└────────┬─────────┘
|
||||||
|
↓
|
||||||
|
┌──────────────────┐
|
||||||
|
│ 2. 清洗为 Markdown│ 去广告/导航/评论;保留正文 + 图链 + 代码块
|
||||||
|
└────────┬─────────┘
|
||||||
|
↓
|
||||||
|
┌──────────────────┐ ┌ 决策点 ┐
|
||||||
|
│ 3. 用户预览原文 │ ───→│ 落库? │
|
||||||
|
└────────┬─────────┘ └───┬────┘
|
||||||
|
↓ ↓
|
||||||
|
┌──────────────────┐
|
||||||
|
│ 4. AI 提炼摘要+关键词│
|
||||||
|
└────────┬─────────┘
|
||||||
|
↓
|
||||||
|
┌──────────────────┐
|
||||||
|
│ 5. obsidian-search│ 找已有相关笔记
|
||||||
|
│ 关联召回 │
|
||||||
|
└────────┬─────────┘
|
||||||
|
↓
|
||||||
|
┌──────────────────┐
|
||||||
|
│ 6. 创建笔记 │ frontmatter: source=url, type=clip
|
||||||
|
│ + 双向链接 │
|
||||||
|
└────────┬─────────┘
|
||||||
|
↓
|
||||||
|
┌──────────────────┐
|
||||||
|
│ 7. daily:append │ 审计:URL + 落位路径
|
||||||
|
└──────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bash 实现骨架
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# workflow_web_clip.sh
|
||||||
|
|
||||||
|
URL="$1"
|
||||||
|
TARGET_DIR="${2:-30-Resources}" # 默认 30-Resources,可指定 50-Zettel
|
||||||
|
|
||||||
|
# 1. 抓取 + 清洗(按可用性优先级回退)
|
||||||
|
if command -v defuddle &>/dev/null; then
|
||||||
|
# 社区首选:defuddle 专门为 LLM 设计,去 chrome
|
||||||
|
CLEAN=$(defuddle "$URL" --markdown)
|
||||||
|
elif command -v readability-cli &>/dev/null; then
|
||||||
|
CLEAN=$(readability-cli "$URL" --output md)
|
||||||
|
else
|
||||||
|
# 兜底:让 AI agent 走 WebFetch + 手工清洗
|
||||||
|
CLEAN=$(echo "USE WebFetch tool with prompt: extract main content as clean markdown")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. AI 提炼
|
||||||
|
TITLE=$(echo "$CLEAN" | head -1 | sed 's/^#\s*//')
|
||||||
|
SUMMARY="<AI 300 字摘要>"
|
||||||
|
KEYWORDS="<AI 提炼关键词,逗号分隔>"
|
||||||
|
|
||||||
|
# 3. 关联召回
|
||||||
|
RELATED=$(obsidian search query="$KEYWORDS" limit=5 format=json | jq -r '.[].path')
|
||||||
|
|
||||||
|
# 4. 落库
|
||||||
|
SLUG=$(echo "$TITLE" | tr ' ' '-' | tr -dc 'a-zA-Z0-9-_一-龥')
|
||||||
|
DATE=$(date +%Y-%m-%d)
|
||||||
|
PATH_NEW="${TARGET_DIR}/${DATE}-${SLUG}.md"
|
||||||
|
|
||||||
|
obsidian create path="$PATH_NEW" content="---
|
||||||
|
type: clip
|
||||||
|
title: ${TITLE}
|
||||||
|
source: ${URL}
|
||||||
|
created: ${DATE}
|
||||||
|
tags: [clip]
|
||||||
|
related: [${RELATED}]
|
||||||
|
---
|
||||||
|
|
||||||
|
## TL;DR
|
||||||
|
${SUMMARY}
|
||||||
|
|
||||||
|
## 关键词
|
||||||
|
${KEYWORDS}
|
||||||
|
|
||||||
|
## 正文(清洗后)
|
||||||
|
${CLEAN}
|
||||||
|
|
||||||
|
## 与现有知识库
|
||||||
|
- 见 frontmatter related 字段
|
||||||
|
"
|
||||||
|
|
||||||
|
# 5. 审计
|
||||||
|
obsidian daily:append content="\n- [web-clip] ${URL} → [[${PATH_NEW}]]"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 注意
|
||||||
|
|
||||||
|
- `defuddle` 是 Obsidian 团队官方维护的 web→markdown 清洗工具([github.com/kepano/defuddle](https://github.com/kepano/defuddle)),比 readability-cli 更专为 LLM 优化(去 token 浪费)
|
||||||
|
- 没装 defuddle 时,AI agent 应主动用 **WebFetch 工具** 抓取并 prompt 模型"清洗为正文 markdown"
|
||||||
|
- **去重检查**:落库前先 `obsidian search query="source: ${URL}"`,避免同一篇 clip 两次
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 通用工作流约定
|
## 通用工作流约定
|
||||||
|
|
||||||
### 1. 决策点 × 步骤 × 审计
|
### 1. 决策点 × 步骤 × 审计
|
||||||
|
|||||||
@@ -138,6 +138,37 @@ obsidian open file=<name> newtab # 在 Obsidian 中打开
|
|||||||
|
|
||||||
> ⚠ **只读优先**:AI agent 写入操作默认走 `append`/`create`;`move`/`delete` 前先 `backlinks` 检查依赖。
|
> ⚠ **只读优先**:AI agent 写入操作默认走 `append`/`create`;`move`/`delete` 前先 `backlinks` 检查依赖。
|
||||||
|
|
||||||
|
### Obsidian Flavored Markdown 语法速查
|
||||||
|
|
||||||
|
> AI 写入笔记内容时**必须遵守 OFM 语法**——它是普通 Markdown 的超集,下列特性 Obsidian 解析、其他渲染器忽略。
|
||||||
|
|
||||||
|
| 语法 | 写法 | 用途 | 注意 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| **Wikilink** | `[[Note Title]]` | 内部笔记跳转 | 优先于 `[text](path.md)`;`obsidian move` 会自动重写它 |
|
||||||
|
| Wikilink 别名 | `[[Note Title\|显示文本]]` | 改显示但保持跳转目标 | `\|` 前后无空格 |
|
||||||
|
| **Embed(嵌入)** | `![[Note Title]]` | 嵌入整篇笔记内容 | 比 wikilink 多一个 `!` |
|
||||||
|
| Embed 段落 | `![[Note Title#二级标题]]` | 只嵌入特定章节 | 标题区分大小写 |
|
||||||
|
| Embed 块 | `![[Note Title#^blockid]]` | 嵌入单个块 | 配合下方块引用 |
|
||||||
|
| **块引用 ID** | 段落末尾追加 ` ^blockid` | 给段落起锚点 | `^` 前要有空格,ID 不可含空格 |
|
||||||
|
| **Callout** | `> [!note] 标题`<br>`> 正文` | 信息卡片 | 类型:note/info/tip/warning/danger/success/quote/abstract/example/question/fail/bug/todo |
|
||||||
|
| Callout 可折叠 | `> [!note]+` 默认展开 / `> [!note]-` 默认折叠 | 长内容收纳 | `+`/`-` 紧跟类型后 |
|
||||||
|
| **Tag** | `#tag` 或 `#parent/child` | 分类索引 | 不可有空格;嵌套用 `/` |
|
||||||
|
| **Frontmatter** | 文件首行三横杠 YAML 块 | 笔记元数据 | 详细规范见 `obsidian-meta` 技能 |
|
||||||
|
| **Highlight** | `==高亮文本==` | 视觉强调 | OFM 扩展 |
|
||||||
|
| 数学公式 | 行内 `$E=mc^2$` / 块 `$$...$$` | LaTeX | MathJax 解析 |
|
||||||
|
| 任务 | `- [ ]` / `- [x]` | 复选框 | 详细操作见 `obsidian-tasks` |
|
||||||
|
| Mermaid | ` ```mermaid ` 代码块 | 图表 | 渲染器内置 |
|
||||||
|
|
||||||
|
**写入时高频陷阱**:
|
||||||
|
|
||||||
|
1. **CLI `content=` 参数里 `\n` 是换行**,写 callout 时每行都要加 `> ` 前缀:
|
||||||
|
```bash
|
||||||
|
obsidian append path="note.md" content="\n> [!warning] 注意\n> 这是第二行\n"
|
||||||
|
```
|
||||||
|
2. **Wikilink 不要扩展名**:写 `[[Daily/2026-04-09]]` 而非 `[[Daily/2026-04-09.md]]`
|
||||||
|
3. **Embed 加 frontmatter 时**:被嵌入的笔记如果有 frontmatter,会**整块跟着嵌**——用块引用 `![[Note#^id]]` 精确控制
|
||||||
|
4. **Callout 嵌套**:内层多一个 `>`,即 `>>` 开头
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. AI Agent 协作原则
|
## 5. AI Agent 协作原则
|
||||||
|
|||||||
Reference in New Issue
Block a user