# Obsidian Note

> 将当前对话内容创建为结构化的 Obsidian 笔记，自动命名并分类到合适目录。仅通过 /obsidian-note 主动调用，不响应对话中的关键词。

- Skill: `rainzzzyyy/obsidian-note` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add rainzzzyyy/obsidian-note`
- Raw SKILL.md: https://api.skillmd.com/api/skills/rainzzzyyy/obsidian-note/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: RainZZZYYY (https://skillmd.com/u/rainzzzyyy)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/rainzzzyyy/obsidian-note

---


# Obsidian 笔记助手

基于当前对话内容，在 `/mnt/e/StudyNotes` 中创建或更新笔记。一次对话可能产出多篇——操作过程记成项目日记，提炼的理解合并到已有笔记或新建永久笔记，二者通过双向链接关联。

## 仓库结构

```
/mnt/e/StudyNotes/
├── 00_收件箱/              # 临时草稿，每周整理归类
├── 10_项目/                # 有终点的项目
│   ├── 任务总控.md          # 全局仪表盘，所有项目状态一览
│   └── 项目名/              # 一个项目一个文件夹
│       ├── 任务清单.md       # 该项目的详细任务待办
│       ├── 2026-05-10_xxx.md # 项目日记
│       └── ...
├── 20_笔记/                # 永久知识，按领域分
│   ├── 工具与环境/
│   ├── Python/
│   ├── OpenCV/
│   ├── PyTorch/
│   ├── 深度学习/
│   ├── ROS2/
│   └── 数学基础/
├── 30_资源/                # 速查表、命令集、模板、外部链接
└── 90_归档/                # 已完成的项目
```

文件夹只做大类区分，细节靠 Properties 中的 `tags`、`aliases` 组织。

## 执行步骤

### 第 1 步：扫描对话，拆成两类内容

回顾本轮对话，从中提取：

| 类型 | 是什么 | 判断标准 |
|------|------|---------|
| **操作过程** | 今天做了什么、踩了什么坑、怎么解决的 | 有时序、有具体操作命令、有踩坑记录 |
| **理解收获** | 概念理解了、原理想通了、能一句话说清 | 脱离时间也有价值、以后能反复翻看和延伸 |

一次对话两种都可能有，也可能只有一种。如实提取即可。

### 第 1.5 步：检查学习工作文档

检查 `40_中间产物/当前学习.md` 是否存在：

- **存在且未完成**（frontmatter 中 `current_point` 未指向最后一个知识点） → 将已完成的知识点（✅标记的）内容纳入本次归档素材，在文档末尾已归档部分加上 `> 📝 以上学习部分已归档于 YYYY-MM-DD`，不删除文档
- **存在且已完成**（所有知识点 ✅） → 将全部内容纳入本次归档素材，归档完成后提示用户：
  ```
  📂 学习工作文档已归档完毕
  
  40_中间产物/当前学习.md 可删除。
  [1] 删除  [2] 保留
  ```
- **不存在** → 跳过，正常流程

### 第 2 步：检查已有笔记，决定新建还是更新

**这一步最关键。** 对于每个「理解收获」，**先搜索再决定操作**，不要直接建新笔记。

1. 在 `20_笔记/` 中用 Glob + Grep 搜索相同主题的已有笔记（按主题关键词搜文件名和标题）
2. 对每个理解收获，判断属于以下哪种情况：

| 情况 | 判断标准 | 操作 |
|------|---------|------|
| **同一概念的新理解** | 已有笔记讲了这个概念，本次有新角度、新深度、新踩坑 | **更新已有笔记**：追加关键点、补充怎么用、添加踩坑经验、新增关联链接 |
| **全新的独立概念** | 仓库中没有这个主题的笔记 | **新建笔记** |
| **内容已被覆盖** | 已有笔记已经包含了本次的理解，没有新东西 | **跳过**，只在日记中链接已有笔记 |

**日记不受此限制**——每次对话一定新建一篇日记（日期不同，记录不同）。

### 第 3 步：落成笔记

**操作过程 → 项目日记**（`10_项目/项目名/YYYY-MM-DD_做了什么.md`）

文件名严格使用 ISO 8601 日期格式 `YYYY-MM-DD`。每次对话一篇。

**理解收获 → 永久笔记**（`20_笔记/领域/主题.md`）

- 新建：文件名用主题命名，不加数字前缀、不加日期
- 更新：在已有笔记中追加内容，保持原有结构不变

如果对话中出现了新的可复用命令/模板/链接 → 问用户要不要在 `30_资源/` 下额外建一篇速查笔记。

拿不准分类 → `00_收件箱/`。

### 第 4 步：写笔记内容

**新建永久笔记**（第 5 步会应用 `[未看]` 前缀 + `00_收件箱/` 路径，此处只需写入正文内容）：

模板（遵循 [Obsidian Properties 官方文档](https://help.obsidian.md/Editing+and+formatting/Properties)）：

```markdown
---
aliases:
  - 别名1
  - 别名2
created: YYYY-MM-DD
tags:
  - 领域标签
  - 类型标签
---

# 主题（一句话概括）

（正文第一句直接说清这个概念是什么。）

## 关键点

- 第一点
- 第二点
- 第三点

## 怎么用

（贴最小可运行代码。没有则省略整个段落。）

## 关联

- [[相关笔记A]]
- [[相关笔记B]]
```

**更新已有笔记的方法**：

- 保持原有 frontmatter（`created` 不动，`aliases` 如有新别名则追加）
- 在「关键点」末尾追加新要点（前面加 `（更新于 YYYY-MM-DD）` 或直接混入列表）
- 在「怎么用」补充新代码示例
- 在「关联」追加新链接
- **不删原有内容，不重写**——知识笔记是生长的，不是替换的

**模板规范**：

- `tags` 用 YAML list，不加 `#`，用复数 `tags` 而非 `tag`（单数已废弃）
- `aliases` 放中文别名、简称、英文原名
- `created` 用 `YYYY-MM-DD` 格式
- 属性值中的内部链接必须加引号：`"[[链接]]"`
- 属性名用小写英文，值用中文或英文
- 标签不超过 3 个

**项目日记模板**：

```markdown
---
tags:
  - diary
  - 项目标签
created: YYYY-MM-DD
---

# YYYY-MM-DD 做了什么

## 操作步骤

- 步骤 1
- 步骤 2

## 踩坑记录

- 遇到的问题和解决方法

## 关联

- [[永久笔记A]]
- [[永久笔记B]]
```

### 第 5 步：应用阅读状态追踪

所有永久笔记应用三态追踪，**文件名前缀 + 正文勾选框双重标识**。

**勾选框位置**：

```markdown
---
aliases: ...
tags: ...
---

- [ ] 开头已确认

# 笔记标题

...正文...

- [ ] 结尾已确认
```

**状态判定**：

| 文件名 | 开头 | 结尾 | 状态 | 位置 |
|--------|------|------|------|------|
| `[未看] 主题.md` | `[ ]` | `[ ]` | **未看** | `00_收件箱/` |
| `[待看] 主题.md` | `[x]` | `[ ]` | **待看** | `00_收件箱/` |
| `主题.md` | 无 | 无 | **已看** | `20_笔记/领域/` |

**规则**：
- **新建永久笔记** → 文件名 `[未看] 主题.md`，正文两个 `[ ]`，放入 `00_收件箱/`
- **更新已有永久笔记** → 统一操作：
  1. 保留第一个（开头）勾选框状态不变（若笔记原无勾选框则在开头插入 `[ ]`）
  2. **重置第二个（结尾）勾选框为 `[ ]`**
  3. 根据第一个勾选框状态重命名文件：
     - `[ ] [ ]` → `[未看]`
     - `[x] [ ]` → `[待看]`
  4. 确保文件在 `00_收件箱/`（在 `20_笔记/` 的移回收件箱）
- **用户升级未看→待看** → 勾选开头 `[ ]` 为 `[x]`，重命名 `[未看] 主题.md` → `[待看] 主题.md`，文件留在 `00_收件箱/`
- **用户确认已看** → 去除文件名前缀、去除两个勾选框，移动到 `20_笔记/` 对应领域
- **更新日记** → 不受此规则影响，日记直接存入 `10_项目/` 对应位置
- **归档完成后** → 在汇总确认中询问用户：
  ```
  👁️ 阅读状态
    以下笔记在 00_收件箱/，可升级状态：
    - [未看] Python变量.md → 勾选开头 → 变 [待看]
    - [待看] Git核心概念.md → 勾选结尾 → 移入 20_笔记/
    [回复笔记名升级状态，或回复"跳过"]
  ```

### 第 6 步：双向链接

- 用 Glob 搜索仓库中已有的相关笔记
- 日记必须链接到本次产出的 / 更新的所有永久笔记，以及之前的相关笔记
- 永久笔记之间互相链接
- **大胆使用空链接**—— `[[一个还不存在的笔记]]` 完全合法，以后补建即可

### 第 7 步：维护任务清单

如果用户正在执行某个项目的任务，建完日记后要同步更新 `10_项目/项目名/任务清单.md`：

1. 检查 `10_项目/项目名/任务清单.md` 是否存在
2. 如果存在，将本次完成的任务勾选为 `[x]`，补上日记和笔记的链接
3. 如果不存在但用户有任务列表，问用户"要不要先把任务清单生成出来？"

同时更新 `10_项目/任务总控.md` 中的项目进度，并同步更新 `> 🎯 下一任务` 为当前阶段第一个未完成的任务。

### 第 8 步：维护技能清单

**仅当本轮对话涉及创建或修改了 Claude 技能时触发。** 检查 `30_资源/Claude技能清单.md` 是否存在：

- **不存在** → 新建该笔记，将所有已有技能都扫描一遍写入
- **存在** → 更新对应技能的条目，无变化则跳过

每个技能条目格式：

```markdown
## 技能名

- **触发**：仅主动调用 / 对话中关键词触发
- **功能**：一句话描述做什么
- **流程**：2-3 句话说明怎么工作
- **建议场景**：什么时候用
```

示例条目：

```markdown
## obsidian-note

- **触发**：`/obsidian-note`（仅主动调用）
- **功能**：将对话内容自动拆分为项目日记和永久笔记，先搜再建避免重复，更新任务清单进度
- **流程**：扫描对话 → 拆分操作过程和理解收获 → 检查已有笔记决定新建或更新 → 写笔记 → 双向链接 → 维护任务清单
- **建议场景**：完成一个学习任务后整理产出、讨论出重要结论后沉淀知识、踩坑后保存经验
```

如果 `Claude技能清单.md` 中已有该技能的条目，对比新旧内容，有变化才更新，无变化跳过。

### 第 9 步：汇总确认

一次性展示所有操作，区分「新建」「更新」「跳过」：

```
📔 项目日记（1 篇）
  新建：10_项目/视觉工程学习/2026-05-12_阈值分割调试.md

📝 永久笔记
  新建：00_收件箱/[未看] Otsu算法.md
  更新：00_收件箱/[待看] 阈值分割.md — 追加踩坑经验

⏭️ 跳过
  OpenCV图像读取 — 现有笔记已覆盖，无新内容

👁️ 阅读状态
  以下笔记在 00_收件箱/，是否有已确认阅读的？
  - 未看：Otsu算法.md
  - 待看：阈值分割.md

📋 任务清单
  更新：任务清单.md — 勾选任务 16

📄 学习工作文档
  40_中间产物/当前学习.md — 未完成，已归档部分加标记
  或
  40_中间产物/当前学习.md — 已完成，归档后可删除

🔗 交叉链接
  日记 → 阈值分割、Otsu算法
  阈值分割 → Otsu算法

📋 README
  更新：README.md — 进度同步

📦 Git
  已提交并推送：3 个文件变更
  或
  push 失败：网络超时，笔记已本地保存

🔧 技能
  已推送：learn/SKILL.md, obsidian-note/SKILL.md
  或
  技能目录无变更，跳过
```

等用户确认后逐篇写入。

### 第 10 步：同步任务总控到 README

如果本次更新了任务总控，将其「进行中」「等待中」「已完成」和 `🎯 下一任务` 同步到 `README.md`：

1. 读取 `10_项目/任务总控.md`，提取「进行中」区块的所有条目
2. 读取 `/mnt/e/StudyNotes/README.md`，如果不存在则跳过
3. 将 README 中 `## 当前进度` 下的 `### 进行中` 条目替换为任务总控中对应的条目（保持 Obsidian `[[链接|显示名]]` 格式）
4. `### 等待中` 和 `### 已完成` 同理从任务总控同步
5. 更新 `> 🎯 下一任务` 为当前阶段第一个未完成的任务

只替换进度条目和下一任务，不动 README 的其他结构（目录结构、工具说明等）。

### 第 11 步：Git 自动提交

所有笔记写入完成后，自动将变更提交到 StudyNotes 仓库：

1. 检查 `/mnt/e/StudyNotes` 是否是一个 git 仓库（`git status`）
2. 如果不是仓库，跳过本步骤
3. 执行提交：

```bash
cd /mnt/e/StudyNotes
git add -A
git commit -m "笔记: YYYY-MM-DD — 简要描述本次变更"
git push
```

提交信息格式：`笔记: 日期 — 做了什么`，例如：
- `笔记: 2026-05-10 — 搭建 WSL2 环境`
- `笔记: 2026-05-10 — 学习 Git 核心概念`
- `笔记: 2026-05-10 — 新建 Otsu 算法，更新 阈值分割`

4. 如果 push 失败（网络问题等），告知用户但不阻塞流程，笔记已经本地保存。
### 第 12 步：自动推送技能变更

如果本次笔记涉及技能文件的创建或修改（`/home/rainz/.claude/skills/` 下有变更），自动执行 `/push-skills`：

1. 检查技能目录的 git 状态
2. 有未推送的变更 → 执行 push-skills 流程
3. 无变更 → 跳过

在汇总确认中追加：
```
🔧 技能
  已推送：learn/SKILL.md, obsidian-note/SKILL.md
  或
  技能目录无变更，跳过
```

---

5. 在汇总确认的展示中加入 Git 状态：

```
📦 Git
  已提交并推送：3 个文件变更
  或
  push 失败：网络超时，笔记已本地保存
```

## 原则

| 原则 | 说明 |
|------|------|
| **先搜再建** | 每个永久笔记创建前先搜索有无相同主题的已有笔记；已有则更新，不重复建 |
| **知识笔记是生长的** | 更新已有笔记时追加不覆盖，同一个概念随学习深入越来越厚 |
| **日记每次新建** | 日记记录过程，日期不同就是不同篇，不受合并规则影响 |
| **一次对话 = 一套笔记** | 日记 + 永久笔记 + 任务清单更新，不同性质的内容不混在一篇里 |
| **一篇笔记只讲清一件事** | 不写成教科书章节 |
| **任务清单是唯一真相源** | 任务进度、产出链接全在清单里；日记是任务和笔记的桥梁 |
| **两层任务管理** | `任务总控.md` 看全局仪表盘，各项目文件夹内的 `任务清单.md` 看单项目细节 |
| **属性辅助组织，文件夹只做大类** | 文件夹划分领域，细节靠 `tags` 和 `aliases` |
| **大胆链出去** | 每篇永久笔记至少一个 `[[]]`；空链接完全合法 |
| **一致性减少决策负担** | 日期统一 YYYY-MM-DD、标签统一小写英文复数、命名统一格式 |
| **文件优于应用** | 笔记就是本地 `.md` 文件，不依赖任何特定插件才能阅读 |
| **拿不准往收件箱放** | 宁可选错分类也不丢内容 |
| **新建文件夹前先确认** | 不随意扩张目录结构 |

