obsidian-librarian
Curador automatico do vault. Roda apos qualquer escrita, le a doutrina (CLAUDE.md
do vault), valida o que foi escrito, corrige o que e deterministico, e mantem o
_INDEX.md vivo.
Quando usar
- Apos qualquer
Write ou Edit em path dentro de um vault-master (disparo
automatico via hook post-vault-write.py).
- Quando o usuario invoca
/obsidian-master-kit:sync.
- Quando o usuario diz "atualiza o indice", "roda o bibliotecario", "sincroniza o
vault".
Quando nao usar
- Em paths fora de um vault-master (o hook protege, mas valide antes por seguranca).
- Se a ultima invocacao foi ha menos de 5 segundos — dedupe para evitar loops.
Fluxo canonico
Passo 1: Detecte o vault
Caminhe para cima a partir do arquivo modificado procurando .obsidian-master/marker.json.
Esse arquivo marca a raiz do vault. Se nao achar, aborta silenciosamente — nao e
vault-master.
Passo 2: Leia a doutrina
Leia <vault-root>/CLAUDE.md inteiro. Dali voce extrai:
- Schema de frontmatter (campos obrigatorios, valores validos)
- Schema de tags (hierarquia canonica)
- Mapa de pastas (qual area cada pasta representa)
- Regras de linking (todo arquivo linka pelo menos para o MOC da area)
Essas sao regras locais do vault — podem divergir do default do kit se o humano
tiver editado.
Passo 3: Invoque o script de indexacao
python3 ${CLAUDE_PLUGIN_ROOT}/skills/obsidian-librarian/scripts/update_index.py \
--vault "<vault-root>" \
[--since <ISO-timestamp>]
O script faz a parte deterministica:
- Walka o vault, le todo
.md
- Parseia frontmatter (YAML)
- Valida campos obrigatorios (
created, updated, area, type, status, tags)
- Normaliza tags (lowercase, sem
# prefix no frontmatter)
- Atualiza campo
updated com mtime do arquivo se estiver desatualizado
- Calcula estatisticas: contagem por area, MOCs ativos, notas orfas (sem wiki-link pra
MOC), ultimas 10 adicoes
- Reescreve
<vault-root>/_INDEX.md
- Atualiza
<vault-root>/.obsidian-master/last-sync.json
- Reporta em stdout (JSON) as issues que precisam intervencao humana ou LLM
Passo 4: Trate as issues reportadas
O script retorna JSON como:
{
"updated_index": true,
"notes_scanned": 42,
"orphans": ["02 - Pesquisas e Estudos/Ativas/Nota Solta.md"],
"missing_frontmatter_fields": [
{"file": "01 - Profissional/Projetos/X.md", "missing": ["status"]}
],
"unknown_tags": [
{"file": "02 - Pesquisas e Estudos/Ativas/Y.md", "tags": ["random/custom"]}
],
"area_folder_mismatch": [],
"last_sync": "2026-04-15T14:20:00"
}
Para cada categoria:
- orphans: consulte as referencias (em
references/linking-rules.md) sobre como
sugerir um MOC. Adicione linha em ## Relacionado da nota apontando para o MOC da
area. Se a nota nao cabe em nenhuma area existente, escale para o usuario.
- missing_frontmatter_fields: adicione os campos faltando seguindo os defaults
de
references/frontmatter-schema.md:
status ausente → draft
tags ausente → []
updated ausente → data de hoje (mas o script ja faz isso)
- Nunca chute
area ou type — escale pro usuario.
- unknown_tags: compare com o schema em
CLAUDE.md do vault. Se a tag nao bate,
sugira a tag canonica mais proxima em 1 comentario para o usuario; nao altere sem
permissao (tags podem ter significado semantico que o humano escolheu).
- area_folder_mismatch: a nota tem
area: pesquisa mas esta em 01 - Profissional/.
Nunca mova sem perguntar — reporte ao usuario.
Passo 5: Reporte curto ao usuario
Depois que o script rodou e voce tratou as issues, imprima 1 bloco conciso:
Librarian synced:
- 42 notas escaneadas, _INDEX.md atualizado
- 2 orfas linkadas ao MOC apropriado
- 1 frontmatter preenchido (status: draft)
- 1 tag desconhecida reportada (esperando sua decisao)
Mais que isso e ruido — a pessoa quer saber que o vault esta ok, nao um relatorio
de auditoria.
Guardrails — regras inviolaveis
- Nunca deleta conteudo humano. Nem 1 linha, nem 1 palavra.
- Nunca edita o
CLAUDE.md do vault. Territorio humano.
- Nunca move arquivos entre areas sem confirmacao. Mismatch de area e um
sinalizador, nao uma licenca pra mover.
- Nunca chuta campos semanticos (
area, type, aliases, conteudo do corpo).
- Se o script falha, reporte o erro e pare. Nao tente "consertar" o vault na
marra — prefere halt a corromper.
Referencias bundled
references/obsidian-conventions.md — convencoes oficiais do Obsidian destiladas
references/frontmatter-schema.md — schema canonico do kit (fonte de verdade
quando o vault nao tem override)
references/linking-rules.md — regras de wiki-link, backlinks, aliases, MOCs
1---2name: obsidian-librarian3description: Esta skill deve ser usada quando o usuario diz "sincroniza o vault", "roda o bibliotecario", "atualiza o indice do Obsidian", "valida as notas que acabei de escrever", ou invoca /obsidian-master-kit:sync. Tambem e acionada automaticamente apos qualquer Write/Edit dentro de um vault obsidian-master-kit (via hook PostToolUse). Le o CLAUDE.md do vault como memoria, valida frontmatter, normaliza tags, garante wiki-link para o MOC da area, reescreve _INDEX.md vivo e reporta desvios que exigem decisao humana. NAO deleta conteudo humano. NAO edita o CLAUDE.md do vault.4---56# obsidian-librarian78Curador automatico do vault. Roda apos qualquer escrita, le a doutrina (`CLAUDE.md`9do vault), valida o que foi escrito, corrige o que e deterministico, e mantem o10`_INDEX.md` vivo.1112## Quando usar1314- Apos qualquer `Write` ou `Edit` em path dentro de um vault-master (disparo15 automatico via hook `post-vault-write.py`).16- Quando o usuario invoca `/obsidian-master-kit:sync`.17- Quando o usuario diz "atualiza o indice", "roda o bibliotecario", "sincroniza o18 vault".1920## Quando **nao** usar2122- Em paths fora de um vault-master (o hook protege, mas valide antes por seguranca).23- Se a ultima invocacao foi ha menos de 5 segundos — dedupe para evitar loops.2425## Fluxo canonico2627### Passo 1: Detecte o vault2829Caminhe para cima a partir do arquivo modificado procurando `.obsidian-master/marker.json`.30Esse arquivo marca a raiz do vault. Se nao achar, aborta silenciosamente — nao e31vault-master.3233### Passo 2: Leia a doutrina3435Leia `<vault-root>/CLAUDE.md` inteiro. Dali voce extrai:3637- Schema de frontmatter (campos obrigatorios, valores validos)38- Schema de tags (hierarquia canonica)39- Mapa de pastas (qual area cada pasta representa)40- Regras de linking (todo arquivo linka pelo menos para o MOC da area)4142Essas sao regras locais do vault — podem divergir do default do kit se o humano43tiver editado.4445### Passo 3: Invoque o script de indexacao4647```bash48python3 ${CLAUDE_PLUGIN_ROOT}/skills/obsidian-librarian/scripts/update_index.py \49 --vault "<vault-root>" \50 [--since <ISO-timestamp>]51```5253O script faz a parte deterministica:54- Walka o vault, le todo `.md`55- Parseia frontmatter (YAML)56- Valida campos obrigatorios (`created`, `updated`, `area`, `type`, `status`, `tags`)57- Normaliza tags (lowercase, sem `#` prefix no frontmatter)58- Atualiza campo `updated` com mtime do arquivo se estiver desatualizado59- Calcula estatisticas: contagem por area, MOCs ativos, notas orfas (sem wiki-link pra60 MOC), ultimas 10 adicoes61- Reescreve `<vault-root>/_INDEX.md`62- Atualiza `<vault-root>/.obsidian-master/last-sync.json`63- Reporta em stdout (JSON) as issues que precisam intervencao humana ou LLM6465### Passo 4: Trate as issues reportadas6667O script retorna JSON como:6869```json70{71 "updated_index": true,72 "notes_scanned": 42,73 "orphans": ["02 - Pesquisas e Estudos/Ativas/Nota Solta.md"],74 "missing_frontmatter_fields": [75 {"file": "01 - Profissional/Projetos/X.md", "missing": ["status"]}76 ],77 "unknown_tags": [78 {"file": "02 - Pesquisas e Estudos/Ativas/Y.md", "tags": ["random/custom"]}79 ],80 "area_folder_mismatch": [],81 "last_sync": "2026-04-15T14:20:00"82}83```8485Para cada categoria:8687- **orphans**: consulte as referencias (em `references/linking-rules.md`) sobre como88 sugerir um MOC. Adicione linha em `## Relacionado` da nota apontando para o MOC da89 area. Se a nota nao cabe em nenhuma area existente, escale para o usuario.90- **missing_frontmatter_fields**: adicione os campos faltando seguindo os defaults91 de `references/frontmatter-schema.md`:92 - `status` ausente → `draft`93 - `tags` ausente → `[]`94 - `updated` ausente → data de hoje (mas o script ja faz isso)95 - **Nunca** chute `area` ou `type` — escale pro usuario.96- **unknown_tags**: compare com o schema em `CLAUDE.md` do vault. Se a tag nao bate,97 sugira a tag canonica mais proxima em 1 comentario para o usuario; nao altere sem98 permissao (tags podem ter significado semantico que o humano escolheu).99- **area_folder_mismatch**: a nota tem `area: pesquisa` mas esta em `01 - Profissional/`.100 **Nunca mova sem perguntar** — reporte ao usuario.101102### Passo 5: Reporte curto ao usuario103104Depois que o script rodou e voce tratou as issues, imprima 1 bloco conciso:105106```107Librarian synced:108- 42 notas escaneadas, _INDEX.md atualizado109- 2 orfas linkadas ao MOC apropriado110- 1 frontmatter preenchido (status: draft)111- 1 tag desconhecida reportada (esperando sua decisao)112```113114Mais que isso e ruido — a pessoa quer saber que o vault esta ok, nao um relatorio115de auditoria.116117## Guardrails — regras inviolaveis1181191. **Nunca deleta conteudo humano.** Nem 1 linha, nem 1 palavra.1202. **Nunca edita o `CLAUDE.md` do vault.** Territorio humano.1213. **Nunca move arquivos entre areas sem confirmacao.** Mismatch de area e um122 sinalizador, nao uma licenca pra mover.1234. **Nunca chuta campos semanticos** (`area`, `type`, `aliases`, conteudo do corpo).1245. Se o script falha, reporte o erro e pare. Nao tente "consertar" o vault na125 marra — prefere halt a corromper.126127## Referencias bundled128129- `references/obsidian-conventions.md` — convencoes oficiais do Obsidian destiladas130- `references/frontmatter-schema.md` — schema canonico do kit (fonte de verdade131 quando o vault nao tem override)132- `references/linking-rules.md` — regras de wiki-link, backlinks, aliases, MOCs