# Ob Tidy

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

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

---


<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>**委托 ob-router skill** 解析当前激活仓库路径，扫描 wiki/ 目录下所有文件。</gsd:phase>
  <gsd:phase>运行十四项健康检查：标题清晰度、文章结构、断裂链接、孤立文章、低链接文章、重复概念、缺失概念、长文章、缺失索引、Frontmatter 规范、标签体系、内容新鲜度、偏好规则遵循度、缺少 article_id。</gsd:phase>
  <gsd:phase>生成健康报告，展示问题清单（按优先级排序）。</gsd:phase>
  <gsd:phase>对可自动修复的问题提供修复选项，等待用户确认后执行。</gsd:phase>
</gsd:workflow>

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

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

## 配置检查

**【硬约束】仓库路径一律委托 ob-router skill 解析，本 skill 不自行读取路径文件。**

调用 ob-router skill 获取 `$OBSIDIAN_REPO`：
- ob-router 内部处理优先级（ob-router.json → CLAUDE.md → 询问）
- 若 ob-router.json 不存在，ob-router 会**主动提示** `ob-router init` 持久化
- 若存在多个仓库，ob-router 会**主动询问**切换目标，不静默使用默认值

将 ob-router 返回的路径保存为 `$OBSIDIAN_REPO`，后续全程使用此变量。
4. 检查 `$OBSIDIAN_REPO/wiki/` 目录是否存在
5. 如果不存在，提示用户先运行 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` 存在，读取偏好规则作为个性化检查依据

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

扫描时必须读取 [references/check-catalog.md](references/check-catalog.md)，逐项执行其中的十四项检查，不得只抽样检查。检查按五个维度组织：

1. 可读性
2. 链接与引用
3. 内容质量
4. 组织与规范
5. 元数据完整性

每个问题都沿用参考文件规定的检测方式、严重级别和修复建议。

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

**健康评分**：根据 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
```

