vault-distilllisted
Install: claude install-skill lllloo/obsidian-memory
# Synthesizing Notes to MOC
**每次呼叫做一件事**,用 vault 狀態 + 使用者意圖決定當前步驟,不在單次呼叫內執行迴圈。重複呼叫才推進到下一步。
## 狀態偵測(每次呼叫最先執行)
```bash
[ -f "vault-map.md" ] || { echo "ERROR: cwd 不在 repo root"; exit 1; }
```
**Step 0:預設=推薦主題(F)**
**只要使用者沒指定具體主題、也沒下動詞快捷詞,預設一律走步驟 F**。包含:
- 純 `/vault-distill` 無 args
- 訊息只是泛問:「有什麼建議的主題」/「推薦主題」/「有什麼可以做」/「有什麼主題可以整合」/「來看看吧」/「整理一下」等
- 訊息只說「整合筆記」「做個 MOC」但沒指名主題
→ **立刻跳步驟 F**,不掃描 MOC、不詢問、不列清單。
→ F 跑完後若使用者選了主題再進 A/B/C/D/E。
**Why**:絕大多數呼叫情境下,使用者並不記得 vault 有哪些待整合的群,先問「要做什麼主題」是把工作丟回給使用者;直接推薦才有資訊價值。
**Step 1:動詞快捷路由**
若使用者訊息含動詞快捷(`review`/`fix`/`校正`/`verify`/`dispose` + 主題名稱),直接路由對應步驟(B/C/D/E),不掃描 MOC、不詢問。
**Step 2:指定主題時掃描現有 MOC**
**僅當使��者明確指定了主題名稱**(例:「整合 Claude Code Skills 的筆記」、「distill 動效相關」)且沒下動詞時,才執行以下掃描:
先嘗試讀取 `.vault-distill/state.json`(gitignored,不存在時靜默略過)取出 `mocs` 鍵清單,再分兩處掃描合併結果:
- `rg -l "^\s*- moc" Cards --include="*.md" --glob='!**/index.md'`
- `rg -l "^\s*- moc" Topics --include="*.md" --glob='!**/index.md'`
state.json 的 `round` 與 `candidates` 欄位直接傳給後續步驟(省去跨 session 輪數推算)。詳細 schema 見 `references/state-schema.md`。
額外偵測半成品:
- 含 `draft: true` 的 MOC → 標記為「進行中」
依指定主題與既有 MOC 的對應關係路由:
**指定主題尚無對應 MOC**
→ 直接進 **A**(生成 v0)
**指定主題已有 1 個對應 MOC**
→ 問:「<主題> MOC 已存在,要做什麼?」,選項:review / fix / 校正 / 處理原筆記
→ 依回答進 B / C / D / E
**指定主題對應多個 MOC(同義詞或子主題並存)**
→ 列出清單(標注所在位置 Cards/ 或 Topics/),問:「要繼續哪一個?」
→ 確認後再問同上選項,路由到 B / C / D / E
---
## 步驟 A:生成 v0
**觸發**:`Cards/<主題>.md` 不存在。
### A1. 蒐集候選
先讀 `vault-map.md` 了解 vault 結構,再用 Glob / Grep 找候選(pattern / path 為獨立參數):
-