$npx -y skills add owenliang60-ship-it/knowledge-mgmt --skill lintObsidian Vault 全量体检。扫描断链、孤岛、缺标签、噪声标签、Clipping 库存、MOC 完整性,产出健康报告。当用户说"lint"、"体检"、"vault 检查"、"健康检查"时触发。
| 1 | # /lint — Vault 健康体检 |
| 2 | |
| 3 | > 参考规则:先读取 vault 根目录 `SCHEMA.md` 获取完整检查项定义。 |
| 4 | |
| 5 | ## 执行流程 |
| 6 | |
| 7 | ### Step 1: 读取 Schema |
| 8 | |
| 9 | ```bash |
| 10 | obsidian read path="SCHEMA.md" |
| 11 | ``` |
| 12 | |
| 13 | 确认当前检查项清单和标签体系定义。 |
| 14 | |
| 15 | ### Step 2: 全量扫描 |
| 16 | |
| 17 | 并行执行以下检查(使用 Obsidian CLI + subagent 加速): |
| 18 | |
| 19 | #### 2a: 链接检查 |
| 20 | ```bash |
| 21 | # 断链:搜索所有 wikilink,检查目标是否存在 |
| 22 | obsidian search query="[[" |
| 23 | # 孤岛:检查 Cards/ 下零 backlink 的文件 |
| 24 | # 对每个 Card: obsidian backlinks path="Cards/{name}.md" |
| 25 | ``` |
| 26 | |
| 27 | #### 2b: 标签检查 |
| 28 | ```bash |
| 29 | # 扫描所有 Cards,检查 frontmatter 中是否有 type/ 和 domain/ 标签 |
| 30 | # 扫描所有标签,找出不属于四维体系的噪声标签 |
| 31 | obsidian tags path="Cards/" |
| 32 | ``` |
| 33 | |
| 34 | #### 2c: 格式检查 |
| 35 | ```bash |
| 36 | # 扫描所有 .md 文件,检查是否有 frontmatter(以 --- 开头) |
| 37 | obsidian files folder="Cards" |
| 38 | # 逐个读取检查 frontmatter |
| 39 | ``` |
| 40 | |
| 41 | #### 2d: Clipping 库存 |
| 42 | ```bash |
| 43 | # 统计待研究 / 已研究数量(按文件夹区分) |
| 44 | obsidian files folder="Clippings" # 待研究(根目录下的 .md 文件) |
| 45 | obsidian files folder="Clippings/已研究" # 已研究 |
| 46 | # 检查超过 30 天未研究的(按 created 字段判断) |
| 47 | ``` |
| 48 | |
| 49 | #### 2e: MOC 完整性 |
| 50 | ```bash |
| 51 | # 读取每个 MOC 文件 |
| 52 | # 检查是否有 Card 被遗漏(有 domain 标签但不在对应 MOC 中) |
| 53 | # 检查 MOC 中的链接是否有效 |
| 54 | ``` |
| 55 | |
| 56 | #### 2f: 空链统计(知识缺口) |
| 57 | ```bash |
| 58 | # 收集所有指向不存在页面的 [[wikilink]] |
| 59 | # 按 domain 分组统计 |
| 60 | ``` |
| 61 | |
| 62 | ### Step 3: 安全写入 |
| 63 | |
| 64 | Lint 可自动执行的(无需用户确认): |
| 65 | 1. 生成健康报告 |
| 66 | |
| 67 | Lint **不能自动执行的**(只报告): |
| 68 | - 修复断链、补标签、建 Card、修改/删除任何内容 |
| 69 | |
| 70 | ### Step 4: 生成健康报告 |
| 71 | |
| 72 | 产出格式: |
| 73 | |
| 74 | ```markdown |
| 75 | --- |
| 76 | title: "Vault Health Report YYYY-MM-DD" |
| 77 | tags: |
| 78 | - type/health-report |
| 79 | date: YYYY-MM-DD |
| 80 | --- |
| 81 | |
| 82 | ## 总览 |
| 83 | |
| 84 | - 健康评分: XX/100 |
| 85 | - Cards: {总数} | Clippings: {unread数} unread / {read数} read |
| 86 | - 断链: {数量} | 孤岛: {数量} | 噪声标签: {数量} |
| 87 | |
| 88 | ## 🔴 需要修复(高严重度) |
| 89 | |
| 90 | {断链清单、缺标签 Card 清单、缺 frontmatter 文件清单、MOC 链接失效} |
| 91 | |
| 92 | ## 🟡 建议改善(中严重度) |
| 93 | |
| 94 | {孤岛 Card、噪声标签、超 30 天 unread Clippings、MOC 遗漏} |
| 95 | |
| 96 | ## 🟢 信息 |
| 97 | |
| 98 | {Clipping 库存统计、空链统计} |
| 99 | |
| 100 | ## 📚 研究缺口建议 |
| 101 | |
| 102 | {按 domain 分组的空链热点,建议研究方向} |
| 103 | ``` |
| 104 | |
| 105 | ### Step 5: 存入 Vault |
| 106 | |
| 107 | ```bash |
| 108 | obsidian create path="Cards/Vault Health Report YYYY-MM-DD.md" content="..." overwrite |
| 109 | ``` |
| 110 | |
| 111 | ### Step 6: 输出摘要 |
| 112 | |
| 113 | 向用户展示报告核心数据和需要关注的高优先级项目。 |
| 114 | |
| 115 | ## 评分规则 |
| 116 | |
| 117 | | 扣分项 | 每个扣分 | |
| 118 | |--------|----------| |
| 119 | | 断链 | -3 | |
| 120 | | 缺 frontmatter | -2 | |
| 121 | | 缺四维标签 | -1 | |
| 122 | | 孤岛 Card | -0.5 | |
| 123 | | 噪声标签 | -1 | |
| 124 | | MOC 遗漏 | -0.5 | |
| 125 | |
| 126 | 满分 100,扣完为止,最低 0 分。 |
| 127 | |
| 128 | ## Cron 模式 |
| 129 | |
| 130 | 被 cron 调用时(非用户手动触发),行为与手动相同,但: |
| 131 | - 报告自动写入 `Journal/Vault Health Report YYYY-MM-DD.md`(而非 Cards/),避免每日例行报告在 Cards/ 堆积产生噪声 |
| 132 | - 不输出到对话(无用户在场) |
| 133 | - **不做任何"顺手修复"**:Step 3 的 lint 写入边界(只能写健康报告、不能补标签 / 不能改 / 不能建其他 Card)在 cron 模式下**完全适用**,和手动模式无差别 |