| name | moc |
| description | 扫描目录生成 Obsidian MOC(Map of Content)索引笔记,包含按子目录分组的 wikilink 列表和 Mermaid 结构图。触发时机:用户要求创建 MOC、索引文件夹、映射目录结构、或导航 Obsidian vault 中的笔记时。 |
Skill: moc(目录索引生成)
触发时机
用户要求为某个目录生成 MOC、索引、目录地图时。
输入
执行步骤
Step 1: 确认目标目录
- 用户已指定路径 → 直接使用
- 未指定 → 询问:"要索引哪个目录?"
- 确认目录存在(
ls 或 find 检查)
Step 2: 确认输出位置 + 检查已有 MOC
- 询问用户:"MOC 文件保存到哪里?"
- 默认建议:
{target_dir}/{dir_name} MOC.md
- 用户可以指定任意路径和文件名(必须在 vault 内)
- 检查指定路径是否已存在文件:
- 已存在 → 进入修改模式:
- Read 已有 MOC 文件,理解现有结构
- 继续执行 Step 3 扫描目录
- 在 Step 5 中对比新旧文件列表,原位更新:
- 新增的笔记 → 追加到对应分组的列表末尾
- 已删除的笔记 → 从列表中移除对应行
- 笔记数跨越 15 阈值 → 刷新 Mermaid 图表策略
- 更新 frontmatter
updated: 字段为当前日期
- 保留用户手动添加的其他内容(自定义描述、额外章节等)
- 不存在 → 进入新建模式:继续 Step 3-5 创建新 MOC
Step 3: 扫描目录
用 find 递归扫描目标目录下所有 .md 文件:
排除规则(必须):
- 隐藏目录/文件:忽略所有以
. 开头的路径(.obsidian、.git、.claude、.learnings 等)
- 已有 MOC 文件:跳过文件名以
MOC.md 结尾或名为 _index.md 的文件
- 使用
find {dir} -not -path '*/\.*' -name '*.md' 获取文件列表
分组规则:
- 按文件相对于目标目录的第一级子目录分组
- 直接在目标目录根下的文件归入
根目录 组
元数据提取:
- 标题:读取每个文件的前 5 行,提取第一个
# 开头的标题;无 H1 则用文件名(不含扩展名)
- Tags:读取 YAML frontmatter 中的
tags 字段
Step 4: 构建 MOC 内容
按以下顺序生成内容:
4a. YAML frontmatter
---
title: "{目录名} MOC"
tags: [moc]
created: {当前日期}
updated: {当前日期}
---
4b. ## 目录结构 — Mermaid 图表
| 笔记总数 | 图表策略 |
|---|
| ≤15 | 画出完整层级:目录 → 子目录 → 具体笔记节点。对笔记节点应用 class NodeName internal-link; 使其可点击。 |
| >15 | 降维:仅画出目录和子目录节点及其关系,不画具体笔记节点。避免 50+ 节点的"面条图"。 |
graph TD
Root[{目录名}]
Root --> SubA[子目录A]
Root --> SubB[子目录B]
SubA --> Note1[笔记1]
SubA --> Note2[笔记2]
class Note1,Note2 internal-link;
4c. ## 笔记索引 — 按组列出
### {组名}
- [[笔记标题]] #tag1 #tag2
- [[另一篇笔记]]
- 用文件名(不含
.md)作为 wikilink 显示文本
- 若有 frontmatter tags,以 inline
#tag 形式追加在链接后
4d. ## 概览
- 📂 目录:`{path}`
- 📝 笔记总数:{N}
- 📁 子目录数:{M}
- 📅 生成日期:{YYYY-MM-DD}
Step 5: 写入 / 修改文件
新建模式(目标路径无已有文件):
- 写入新文件到用户指定路径
- 使用 Obsidian Markdown 规范(wikilink、frontmatter、Mermaid)
修改模式(目标路径已有 MOC 文件):
- 使用
Edit 工具原位更新已有文件,最小 diff
- 更新内容:
- 新增笔记 → 在对应分组的
### {组名} 列表末尾追加 - [[新笔记]]
- 已删除笔记 → 移除对应行(该笔记文件在目录中已不存在)
- Mermaid 图表:若笔记数从 ≤15 变为 >15(或反过来),替换图表策略
- 概览统计:更新笔记总数、子目录数、生成日期
- Frontmatter:更新
updated: 字段为当前日期
- 保留用户手动添加的内容:自定义描述、额外章节、注释等不做任何改动
- 若目录结构无变化(无新增/无删除),只更新
updated: 日期并告知用户
产出
- 用户指定路径下的 MOC 索引文件(新建或已更新)
/update 联动
当用户对已有 MOC 执行 /update --mode refresh 时,触发本技能的修改模式:
- 重新扫描目录
- 刷新 笔记索引 列表(新增/移除变更的笔记)
- 若笔记数跨越 15 阈值,同步更新 Mermaid 图表策略
- 更新 frontmatter
updated 字段
- 保留用户手动添加的内容
禁止行为
- 不要扫描隐藏目录(
. 开头)
- 不要把生成的 MOC 文件列入自己的索引
- 不要移动或重命名任何笔记文件
- 不要对 >15 篇笔记的目录绘制完整 Mermaid 节点图
- 不要在未询问用户的情况下覆盖已有 MOC 文件
- 修改模式下不要删除用户手动添加的自定义内容