Skip to content
Back to skills

Ob Tidy

ASecurity

Obsidian 知识库健康检查与维护。当用户想要检查知识库健康度、修复断链、发现重复概念、整理知识库时触发此 skill。

  • 14 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 27, 2026
data-aipythonrustgobashreactgitapi

Works with

  • api

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add wangjs-jacky/jacky-skills --skill ob-tidy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ob Tidy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ob Tidy
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/wangjs-jacky-ob-tidy/badge)](https://www.skillsdirectory.com/skills/wangjs-jacky-ob-tidy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ob-tidy
description: "Obsidian 知识库健康检查与维护。当用户想要检查知识库健康度、修复断链、发现重复概念、整理知识库时触发此 skill。"
---

<role>Obsidian 知识库维护助手,负责检测并修复知识库中的标题、结构、链接、内容、元数据等各类健康问题。</role>
<purpose>保持知识库健康,确保标题清晰、结构规范、链接有效、概念无重复、元数据完整,让每篇文章对读者友好。</purpose>
<trigger>

```text
触发词:
- 检查知识库
- 健康检查
- 知识库 lint
- ob-tidy
- 整理知识库
- 修复断链
- 去重
- 标题检查
- 知识库体检

示例:
- "ob-tidy"
- "检查一下知识库健康状况"
- "帮我整理一下知识库"
- "知识库有没有断链"
- "检查标题规范"
```

</trigger>
<gsd:workflow xmlns:gsd="urn:gsd:workflow">
  <gsd:meta>requires=OBSIDIAN_REPO; focus=lint,fix,health</gsd:meta>
  <gsd:goal>检测知识库健康问题,生成报告并提供修复建议或自动修复。</gsd:goal>
  <gsd:phase>获取 OBSIDIAN_REPO,扫描 wiki/ 目录下所有文件。</gsd:phase>
  <gsd:phase>运行十四项健康检查:标题清晰度、文章结构、断裂链接、孤立文章、低链接文章、重复概念、缺失概念、长文章、缺失索引、Frontmatter 规范、标签体系、内容新鲜度、偏好规则遵循度、缺少 article_id。</gsd:phase>
  <gsd:phase>生成健康报告,展示问题清单(按优先级排序)。</gsd:phase>
  <gsd:phase>对可自动修复的问题提供修复选项,等待用户确认后执行。</gsd:phase>
</gsd:workflow>

# Obsidian 知识库维护 (ob-tidy)

检测并修复知识库健康问题,生成健康报告。共 14 项检查,覆盖**可读性、链接引用、内容质量、组织规范、元数据完整性、个性化偏好**六个维度。

## 配置检查

1. 检查全局 CLAUDE.md 中 `OBSIDIAN_REPO` 配置变量
2. 如果未定义,使用 AskUserQuestion 询问用户
3. 检查 `$OBSIDIAN_REPO/wiki/` 目录是否存在
4. 如果不存在,提示用户先运行 ob-index 初始化

## 执行流程

### 第一步:扫描知识库

扫描 `$OBSIDIAN_REPO/wiki/` 下所有 `.md` 文件(排除 `index.md`、`log.md`):

1. 读取每个文件的 frontmatter(tags、type、updated_at、created_at、article_id)
2. 提取所有 `[[wikilinks]]` 引用
3. 统计文件字数
4. 提取标题层级结构(H1-H4)
5. 收集所有标签
6. 读取 `$OBSIDIAN_REPO/wiki/index.md` 获取索引条目
7. 如果 `$OBSIDIAN_REPO/wiki/.rating-preferences.md` 存在,读取偏好规则作为个性化检查依据

### 第二步:运行十四项检查

---

#### 维度一:可读性(面向人类阅读体验)

##### 检查 1:标题清晰度

**目标**:确保每篇文章标题能让人一眼看出在讲什么。

**标题命名规范**(根据文章类型):

| 文章类型 | 标题格式 | 合格示例 | 不合格示例 |
|---------|---------|---------|-----------|
| 概念类(type=concept) | `中文名 (英文名)` | `注意力机制 (Attention Mechanism)` | `attention`、`关于注意力的笔记` |
| 教程类(type=tutorial) | `如何在 XXX 中 YYY` | `如何在 Tauri 中创建系统托盘` | `tauri 教程`、`系统托盘` |
| 问题解决类(type=troubleshooting) | `如何解决 XXX 问题` | `如何解决 React 内存泄漏问题` | `react 问题`、`bug 记录` |
| 学习笔记类(type=learning) | `从 XXX 学习/了解 YYY` | `从 Tauri 源码学习 Rust 异步编程` | `学习笔记`、`tauri` |
| 参考类(type=reference) | `XXX 参考指南/速查表` | `Vite 配置参考指南` | `vite`、`配置` |

**检测规则**:

```
对每个 wiki 文件:
  1. 读取 H1 标题(或文件名作为标题)
  2. 检查以下问题:
     a. 标题过短(< 4 个有效字符)→ 标记为"标题过短"
     b. 标题过长(> 60 个字符)→ 标记为"标题过长"
     c. 标题含通用词("笔记"、"总结"、"TODO"、"未命名"、"misc")→ 标记为"标题含糊"
     d. 标题为纯英文且 article type=concept → 建议加中文名
     e. 标题为纯中文且涉及专有名词 → 建议加英文名
     f. 标题符合文件名格式(含连字符、全小写)→ 建议改为自然语言标题
     g. 根据 frontmatter.type 检查标题是否符合对应格式 → 不符合则建议调整
```

**修复建议**:
- 根据文章内容生成建议标题
- 展示当前标题 vs 建议标题对比
- 用户确认后批量更新

---

##### 检查 2:文章结构

**目标**:确保每篇文章有清晰的内部结构,方便阅读和快速定位。

**结构规范**:

| 文章长度 | 最低要求 | 推荐结构 |
|---------|---------|---------|
| < 100 字 | 无强制要求 | 一段话即可 |
| 100-300 字 | 至少 1 个 H2 分段 | 引言 → 核心内容 → 小结 |
| 300-500 字 | 至少 2 个 H2 分段 | 引言 → 2-3 个主题段落 → 小结 |
| > 500 字 | 至少 3 个 H2 + 内部目录 | 目录 → 引言 → 多个主题 → 总结 → 参考链接 |

**检测规则**:

```
对每个 wiki 文件:
  1. 提取所有标题层级(H1-H4)
  2. 检查以下问题:
     a. 无标题(纯文本无结构)→ 标记为"无结构"
     b. 标题层级跳跃(如 H1 后直接 H3,跳过 H2)→ 标记为"层级跳跃"
     c. 文章 > 200 字但无 H2 → 标记为"缺少分段"
     d. 文章 > 500 字但无内部目录 → 标记为"缺少目录"
     e. 缺少引言段落(第一段未说明文章目标/适用场景)→ 标记为"缺少引言"
     f. 缺少总结段落(最后一段没有收束性内容)→ 标记为"缺少总结"
```

**修复建议**:
- 为无结构文章生成建议的标题层级
- 为长文章生成内部目录
- 建议引言/总结的模板内容

---

#### 维度二:链接与引用

##### 检查 3:断裂链接

**检测**:收集所有文章中的 `[[xxx]]` 引用,检查对应文件是否存在。

```
对每个 wiki 文件:
  提取所有 [[wikilinks]]
  对每个 link:
    检查 wiki/ 下是否存在对应文件
    不存在 → 记录为断裂链接
```

**修复建议**:
- 创建占位概念文章(含 stub 标记)
- 或移除断裂链接(如果概念不再相关)

---

##### 检查 4:孤立文章

**检测**:统计每篇文章的入链数(被其他文章引用的次数)。入链为 0 的文章为孤立文章。

**标准**:孤立文章比例应 < 10%

**修复建议**:
- 检查是否有相关文章应该链接到它
- 考虑是否应该从索引中补充引用

---

##### 检查 5:低链接文章

**检测**:统计每篇文章的入链数。入链 < 2 的文章为低链接文章。

**标准**:
- 入链 = 0 → 孤立文章(检查 4 已覆盖)
- 入链 = 1 → 低链接,建议补充关联
- 入链 ≥ 2 → 正常

**修复建议**:
- 列出可能与该文章相关的其他文章
- 建议在相关文章中添加引用链接

---

##### 检查 6:缺失概念

**检测**:扫描所有来源文章和概念文章中的 `[[concepts/xxx]]` 引用,检查对应概念文章是否存在。

**修复建议**:列出待创建的概念文章清单。

---

#### 维度三:内容质量

##### 检查 7:重复概念

**检测**:比较 concepts/ 下所有文章的标题和内容相似度。

**检测方法**:
1. 标题相似(如 `attention` vs `attention-mechanism`)
2. 内容重叠度 > 60%
3. 引用了相同的来源文章

**修复建议**:使用合并功能,将两篇合并为一篇:
1. 读取两篇文章
2. 合并内容(去重保留所有独特信息)
3. 更新所有引用了旧文章的 wikilinks
4. 将旧文章移到 wiki/archive/(保留重定向说明)

---

##### 检查 8:长文章

**检测**:统计每篇文章字数。

**标准**:建议每篇文章 ≤ 500 字。超出不强制拆分,可通过 [[reference]] 链接将详细内容延伸到关联文章。

**修复建议**:对远超 500 字的文章,建议将核心要点控制在 500 字以内,详细展开部分拆分到子概念文章并通过 [[reference]] 链接。

---

##### 检查 9:内容新鲜度

**检测**:检查文章的最后更新时间(读取 frontmatter 中 `updated_at` 字段,无则用文件修改时间)。

**标准**:

| 未更新时长 | 标记 | 建议 |
|-----------|------|------|
| < 3 个月 | ✅ | 无需操作 |
| 3-6 个月 | 🟡 | 提醒关注,可能需要更新 |
| 6-12 个月 | ⚠️ | 建议审查内容是否过时 |
| > 12 个月 | 🔴 | 建议重新审视或标记归档 |

**修复建议**:
- 列出需要审查的文章
- 对确实过时的内容建议归档(移到 wiki/archive/)
- 对仍相关但需更新的文章标记 `needs-update` tag

---

#### 维度四:组织与规范

##### 检查 10:缺失索引

**检测**:比较 wiki/ 下实际文件与 index.md 中的条目。

**修复建议**:直接补充缺失的索引条目(可自动修复)。

---

##### 检查 11:Frontmatter 规范

**目标**:确保每篇文章的元数据完整且规范。

**Frontmatter 规范**:

| 字段 | 是否必需 | 规范 | 示例 |
|------|---------|------|------|
| `tags` | ✅ 必需 | 必须是非空数组 | `[react, hooks]` |
| `type` | ✅ 必需 | 必须是预定义值之一 | `concept` / `tutorial` / `troubleshooting` / `learning` / `reference` / `note` |
| `updated_at` | ✅ 必需 | 有效的日期格式 | `2025-01-15` |
| `created_at` | 推荐 | 有效的日期格式 | `2025-01-10` |

**预定义 type 值**:

| type | 含义 | 用途 |
|------|------|------|
| `concept` | 概念解释 | 解释某个技术概念、术语 |
| `tutorial` | 教程 | 手把手教如何完成某事 |
| `troubleshooting` | 问题解决 | 记录问题及解决方案 |
| `learning` | 学习笔记 | 从某个项目/资源中学习的记录 |
| `reference` | 参考资料 | API 文档、速查表、配置参考 |
| `note` | 普通笔记 | 不属于以上分类的笔记 |

**检测规则**:

```
对每个 wiki 文件:
  1. 读取 frontmatter
  2. 检查以下问题:
     a. 无 frontmatter → 标记为"缺少 frontmatter"
     b. 缺少 tags 字段 → 标记为"缺少标签"
     c. tags 为空数组 → 标记为"标签为空"
     d. 缺少 type 字段 → 标记为"缺少类型"
     e. type 值不在预定义列表中 → 标记为"类型不规范"
     f. 缺少 updated_at → 标记为"缺少更新时间"
     g. updated_at 格式不正确 → 标记为"日期格式错误"
```

**修复建议**:
- 为缺少 frontmatter 的文章生成建议的 frontmatter
- 对不规范的 type 值建议替换为预定义值
- 可自动补充 updated_at 为文件修改时间

---

##### 检查 12:标签体系

**目标**:确保标签体系健康,能真正帮助分类和检索。

**检测规则**:

```
1. 收集所有文章的标签,统计每个标签的使用次数
2. 检查以下问题:
   a. 孤立标签(仅使用 1 次的标签)→ 标记为"孤立标签"
   b. 相似标签(语义相同但写法不同,如 "react" vs "React" vs "react.js")→ 标记为"标签不一致"
   c. 过于宽泛的标签(使用次数 > 总文章数 50%)→ 标记为"标签过于宽泛"
   d. 中英文混用的同类标签 → 建议统一
   e. 无标签文章(与检查 11 交叉,此处单独列出)→ 标记为"无标签"
```

**修复建议**:
- 建议合并相似标签(展示替换预览)
- 建议拆分过于宽泛的标签
- 为无标签文章推荐标签(基于内容分析)

---

##### 检查 13:偏好规则遵循度

**前提**:`$OBSIDIAN_REPO/wiki/.rating-preferences.md` 文件存在。不存在则跳过此检查。

**目标**:根据用户历史评分提炼的偏好规则,检查文章是否符合用户的个性化质量标准。

**检测规则**:

```
读取 .rating-preferences.md 中的偏好规则
对每个 wiki 文件:
  1. 根据偏好规则逐条检查:
     a. "笔记必须有明确的知识价值" — 检查是否为草稿/计划/README 等非正式内容
     b. "内容需要深度和干货" — 检查是否仅有链接堆砌或表面介绍
     c. "标题必须准确反映内容" — 检查标题与内容的匹配度
     d. "文章间应互相串联" — 检查是否有 [[wikilinks]] 或"参见"引用
     e. 其他规则根据偏好文件内容动态应用
  2. 已评分文章参考 .ratings.md 中的历史评价
  3. 未评分文章根据偏好规则推断潜在问题
```

**修复建议**:
- 列出不符合偏好规则的文章及具体问题
- 参考高分文章的特征给出改进方向

---

#### 维度五:元数据完整性

##### 检查 14:缺少 article_id

**目标**:确保每篇文章都有全局唯一的 article_id,便于跨系统引用。

**article_id 规范**:

| 规则 | 说明 |
|------|------|
| 格式 | `OBA-{8位随机小写字母数字}`(如 `OBA-k7jm2p9q`) |
| 存储位置 | YAML frontmatter 的 `article_id` 字段 |
| 唯一性 | 全局唯一,生成后需验证不重复 |

**检测规则**:

```
1. 扫描 wiki/ 下所有 .md 文件
2. 对每个文件:
   a. 无 article_id 字段 → 标记为"缺少 article_id"
   b. article_id 格式不符合 OBA-[a-z0-9]{8} → 标记为"article_id 格式错误"(兼容旧版 OBA-{N} 数字格式,标记为需迁移)
3. 检查所有 article_id 是否有重复 → 标记为"article_id 重复"
```

**修复建议**:

- 自动为缺少 ID 的文章分配 article_id
- 分配方式:随机生成 8 位小写字母数字,验证唯一性后分配
- 实现命令:
  ```bash
  # 生成随机 ID(8位小写字母+数字)
  python3 -c "import random,string; print(''.join(random.choices(string.ascii_lowercase+string.digits,k=8)))"
  ```
- 唯一性验证:
  ```bash
  # 验证生成的 ID 不重复
  grep -rh "OBA-{生成的ID}" "$OBSIDIAN_REPO/wiki/" --include="*.md"
  ```
  如果无结果则 ID 唯一,可使用;否则重新生成
- 修复前展示预览:将给哪些文件分配哪些 ID,确认后批量执行

---

### 第三步:生成健康报告

**健康评分**:根据 14 项检查结果计算总分(满分 105)

```
评分权重:
- 标题清晰度(15 分)- 标题是第一印象
- 文章结构(10 分)
- 断裂链接(15 分)- 影响阅读体验
- 孤立文章(5 分)
- 低链接文章(5 分)
- 缺失概念(10 分)
- 重复概念(5 分)
- 长文章(5 分)
- 内容新鲜度(5 分)
- 缺失索引(10 分)
- Frontmatter 规范(10 分)
- 标签体系(5 分)
- 偏好规则遵循度(5 分)- 基于用户主观评分的个性化标准(偏好文件不存在时满分)
- 缺少 article_id(5 分)- 全局唯一 ID 是跨系统引用的基础
```

**终端摘要**:

```
📊 知识库健康报告

健康评分:82/105 ✅

总览:
- 文章总数:87
- 平均长度:420 字 ✅
- 索引覆盖率:92% ⚠️
- 平均链接数:2.8 ⚠️
- 标题合格率:75% ⚠️
- 结构合格率:85% ✅
- Frontmatter 合格率:90% ✅

问题清单(按优先级):
🔴 严重(必须修复):
  1. 3 个断裂链接
  2. 2 对重复概念
  3. 5 篇文章标题严重含糊

🟡 警告(建议修复):
  4. 7 篇文章缺少索引条目(可自动修复)
  5. 12 篇文章链接数 < 2
  6. 8 篇文章标题不符合类型规范
  7. 4 篇文章缺少 frontmatter

🟢 提示(可选优化):
  8. 4 篇孤立文章
  9. 1 篇文章 > 500 字
  10. 3 篇文章超过 6 个月未更新
  11. 6 个孤立标签
  12. {n} 篇文章缺少 article_id(可自动修复)
```

**完整报告**写入 `$OBSIDIAN_REPO/outputs/lint-{YYYY-MM-DD}.md`:

```markdown
---
tags: [lint, health-report]
type: output
created_at: {日期}
---

# 知识库健康报告 {日期}

## 总览

| 指标 | 值 | 状态 |
|------|-----|------|
| 健康评分 | {n}/100 | ✅/⚠️/🔴 |
| 文章总数 | {n} | — |
| 平均长度 | {n} 字 | ✅/⚠️/🔴 |
| 索引覆盖率 | {n}% | ✅/⚠️/🔴 |
| 标题合格率 | {n}% | ✅/⚠️/🔴 |
| 结构合格率 | {n}% | ✅/⚠️/🔴 |
| 平均链接数 | {n} | ✅/⚠️/⚠️ |
| Frontmatter 合格率 | {n}% | ✅/⚠️/🔴 |

## 严重问题 🔴

### 断裂链接({n} 个)
{每个断裂链接的详情:源文件 → 引用的不存在文件}

### 重复概念({n} 对)
{每对重复的详情:文件 A vs 文件 B,相似度}

### 标题严重含糊({n} 篇)
{标题含糊的文章列表,附建议标题}

## 警告问题 🟡

### 标题不符合类型规范({n} 篇)
{不符合对应类型标题格式的文章列表}

### 文章结构问题({n} 篇)
{缺少分段/目录/引言/总结的文章列表}

### 缺失索引({n} 篇)
{缺少索引条目的文章列表}

### 低链接文章({n} 篇)
{链接数 < 2 的文章列表}

### Frontmatter 问题({n} 篇)
{缺少/不规范的文章列表,附具体缺失字段}

## 提示信息 🟢

### 孤立文章({n} 篇)
{无入链的文章列表}

### 长文章({n} 篇)
{超过 500 字的文章及其字数}

### 内容新鲜度({n} 篇需关注)
{超过 3 个月未更新的文章列表,附最后更新时间}

### 标签体系({n} 个问题)
{孤立标签、相似标签等}

### 缺少 article_id({n} 篇)
{缺少 article_id 的文章列表,附将分配的 ID 预览}

## 修复建议

{按优先级排列的可执行修复步骤}
```

### 第四步:交互式修复

展示问题后,使用 AskUserQuestion 提供修复选项:

```
发现 {n} 个可自动修复的问题:

🔴 严重(建议立即修复):
  □ 修复 3 个断裂链接(需确认修复方式)
  □ 合并 2 对重复概念(需确认合并内容)

🟡 警告(建议修复):
  □ 补充 7 条缺失索引(自动)
  □ 修复 8 个标题问题(预览建议标题后确认)
  □ 补充 4 篇文章的 frontmatter(自动生成)
  □ 为 12 篇低链接文章推荐关联(需确认)

🟢 提示(可选):
  □ 清理 6 个孤立标签(需确认合并方案)
  □ 为 {n} 篇文章自动分配 article_id(自动)

选择要执行的修复(可多选)
```

**执行修复**:

对用户选择的每项修复:
1. 展示修复预览(将做什么改动)
2. 确认后执行
3. 每项修复一个 commit

### 追加日志

修复完成后追加 `$OBSIDIAN_REPO/wiki/log.md`:

```markdown
## [{日期}] lint | 健康检查
- 健康评分:{n}/100
- 问题总数:{n}
- 已修复:{n}
- 报告:outputs/lint-{日期}.md
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.