claude-code-arcane 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +4 -3
  3. package/docs/SKILLS-CATALOG.md +25 -2
  4. package/docs/USER-GUIDE.md +2 -2
  5. package/package.json +1 -1
  6. package/profiles/second-brain.yaml +37 -0
  7. package/rules/vault-conventions.md +144 -0
  8. package/skills/brain-dump/SKILL.md +53 -0
  9. package/skills/hub-note/SKILL.md +68 -0
  10. package/skills/obsidian-bases/SKILL.md +85 -0
  11. package/skills/obsidian-bases/references/bases-syntax.md +123 -0
  12. package/skills/obsidian-canvas/SKILL.md +91 -0
  13. package/skills/obsidian-markdown/SKILL.md +110 -0
  14. package/skills/pdf-generator/scripts/fill_inspect.py +2 -0
  15. package/skills/pdf-generator/scripts/render_body.py +2 -0
  16. package/skills/review-dump/SKILL.md +108 -0
  17. package/skills/review-monthly/SKILL.md +56 -0
  18. package/skills/review-weekly/SKILL.md +91 -0
  19. package/skills/second-brain/SKILL.md +211 -0
  20. package/skills/second-brain/hooks/hooks.json +16 -0
  21. package/skills/second-brain/hooks/validate-note.sh +85 -0
  22. package/skills/second-brain/references/cross-project.md +57 -0
  23. package/skills/second-brain/references/templates/Atomic.md +22 -0
  24. package/skills/second-brain/references/templates/Daily.md +25 -0
  25. package/skills/second-brain/references/templates/Dashboard.base +70 -0
  26. package/skills/second-brain/references/templates/Dump.md +11 -0
  27. package/skills/second-brain/references/templates/Hub.md +22 -0
  28. package/skills/second-brain/references/templates/Monthly.md +29 -0
  29. package/skills/second-brain/references/templates/Weekly.md +29 -0
  30. package/skills/second-brain/references/templates/codebases.md +37 -0
  31. package/skills/second-brain/references/templates/hot.md +37 -0
  32. package/skills/second-brain/references/templates/vault-CLAUDE.md +127 -0
  33. package/skills/vault-audit/SKILL.md +72 -0
  34. package/skills/vault-audit/scripts/vault_audit.py +539 -0
  35. package/skills/vault-clip/SKILL.md +73 -0
  36. package/skills/vault-recall/SKILL.md +82 -0
  37. package/skills/vault-recall/scripts/vault_index.py +626 -0
  38. package/skills/vault-tidy/SKILL.md +76 -0
  39. package/skills/xlsx-generator/scripts/formula_check.py +2 -0
  40. package/skills/xlsx-generator/scripts/libreoffice_recalc.py +2 -0
  41. package/skills/xlsx-generator/scripts/xlsx_add_column.py +2 -0
  42. package/skills/xlsx-generator/scripts/xlsx_insert_row.py +2 -0
  43. package/skills/xlsx-generator/scripts/xlsx_reader.py +2 -0
  44. package/skills/zettel/SKILL.md +66 -0
@@ -0,0 +1,211 @@
1
+ ---
2
+ name: second-brain
3
+ description: "Entry point del segundo cerebro en Obsidian. Crea o adopta un vault (PARA + Zettelkasten + hub files), escribe su CLAUDE.md, detecta que plugins hay instalados, conecta otros proyectos al mismo vault y rutea al skill correcto. Triggers: second brain, segundo cerebro, setup vault obsidian, organizar mi vault, empezar vault, adoptar mi vault."
4
+ argument-hint: "[setup | adopt | status | next | link]"
5
+ category: "pkm"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit
8
+ ---
9
+
10
+ # Second Brain - Vault Orchestrator
11
+
12
+ Sos el punto de entrada del segundo cerebro. Tu trabajo es: ubicar (o crear) el vault, entender en que estado esta, y rutear al skill correcto. No hacés todo vos, orquestás.
13
+
14
+ Aplica la rule `vault-conventions` en toda escritura.
15
+
16
+ ## Idioma
17
+
18
+ Comunicación con el usuario en **español**. Las notas del vault van en el idioma en que el usuario escribe sus dumps: detectalo del contenido existente y no lo cambies.
19
+
20
+ ## Ubicar el vault
21
+
22
+ En este orden: flag `--vault <path>`, env `OBSIDIAN_VAULT`, o el directorio actual si contiene `.obsidian/`. Si no hay ninguno, preguntar antes de asumir. Un directorio sin `.obsidian/` no es un vault: es una carpeta con markdown, y hay que avisarlo.
23
+
24
+ ## El vault
25
+
26
+ ```
27
+ CLAUDE.md contrato del vault: estructura, frontmatter, reglas de link
28
+ hot.md cache de contexto reciente, lo reescribe /review-dump
29
+ _inbox/ captura cruda, un archivo por dia (YYYY-MM-DD dump.md)
30
+ Reflect/
31
+ Daily/ sintesis del dia, la crea /review-dump
32
+ Weekly/ retrospectiva semanal
33
+ Monthly/ patrones y balance del mes
34
+ 01_Projects/ con deadline o resultado definido [PARA]
35
+ 02_Areas/ responsabilidades continuas [PARA]
36
+ 03_Resources/ notas atomicas, plano, sin subcarpetas [Zettelkasten]
37
+ 04_Archive/ cerrado, nunca borrado [PARA]
38
+ Hubs/ una nota por entidad que importa
39
+ Bases/ vistas .base
40
+ Templates/ plantillas del usuario
41
+ ```
42
+
43
+ Ese árbol es el **default del `setup`**, no una imposición: el `## Rutas` del `CLAUDE.md` del vault mapea cada rol (`inbox`, `daily`, `hubs`...) a la carpeta que lo cumple, y los skills leen ese mapeo. Un vault adoptado conserva sus nombres y todo sigue funcionando.
44
+
45
+ Dos frameworks, dos capas: **PARA es la capa de navegación** (toda nota tiene una casa) y **Zettelkasten es la capa de conocimiento** (las notas atómicas viven planas en `03_Resources/` y se conectan por links). Los **hub files** son el tejido entre las dos: una nota por entidad que importa (persona, herramienta, concepto, empresa) que acumula conocimiento con el tiempo.
46
+
47
+ Las carpetas agrupan por propósito, los links agrupan por significado: una nota vive en una carpeta y linkea a muchas.
48
+
49
+ ## Detección de capacidades
50
+
51
+ Antes de generar cualquier vista o sintaxis que dependa de un plugin, leer `.obsidian/core-plugins.json` y `.obsidian/community-plugins.json` y adaptar:
52
+
53
+ | Si está | Usar para | Si no está |
54
+ |---|---|---|
55
+ | `bases` (core, Obsidian 1.9+) | dashboards y vistas agregadas (`.base`) | tabla markdown estática en el dashboard |
56
+ | `dataview` | campos inline y texto computado que Bases no expresa | reformular la vista para que la exprese Bases |
57
+ | `obsidian-tasks-plugin` | sintaxis de fechas y prioridad en tareas | checkboxes markdown planos |
58
+ | `templater-obsidian` | templates de alta frecuencia (daily) | los skills escriben el archivo directo |
59
+ | `omnisearch` | ofrecerlo para búsqueda difusa desde la UI de Obsidian | `/vault-recall`, que rankea sin depender de plugins |
60
+
61
+ Nunca mencionar en una nota una sintaxis de un plugin que el usuario no tiene instalado: queda como texto roto en la vista de lectura. Registrar el resultado de la detección en el `CLAUDE.md` del vault para no repetirla cada sesión.
62
+
63
+ ## Modos
64
+
65
+ ### `setup` - Crear el vault
66
+ 1. Confirmar el path del vault y si ya existe `.obsidian/` (si no existe, avisar que Obsidian tiene que abrirlo una vez para inicializarse).
67
+ 2. Correr la detección de capacidades.
68
+ 3. Crear el árbol de carpetas.
69
+ 4. Copiar los templates de `references/templates/` a `Templates/` del vault.
70
+ 5. Escribir el `CLAUDE.md` del vault desde `references/templates/vault-CLAUDE.md`, completando **el `## Rutas`** (rol a carpeta), el contrato de frontmatter y los plugins detectados. El `## Rutas` no es decorativo: es de donde todos los demás skills sacan dónde escribir.
71
+ 6. Si hay `bases`, crear `Bases/Dashboard.base` con las vistas de tareas abiertas y notas recientes (delegar la sintaxis a `/obsidian-bases`).
72
+ 7. Crear `hot.md` desde `references/templates/hot.md`, vacío. Es el caché que abre las sesiones siguientes (ver abajo).
73
+ 8. Si el usuario escribe código, crear `codebases.md` desde su template: es el puente del vault al repo, y lo que evita que la arquitectura se copie al vault.
74
+ 9. **Construir el índice** para que la primera búsqueda y el primer review no paguen la indexación completa:
75
+ ```bash
76
+ python .claude/skills/vault-recall/scripts/vault_index.py "<vault>" refresh
77
+ ```
78
+ 10. **Ofrecer el hook de validación** (opcional, ver abajo).
79
+ 11. Verificar que el vault sea un repo git; si no lo es, recomendarlo y explicar por qué (es el undo de cualquier corrida). Preguntar además si el vault se sincroniza y, si la respuesta es sí, aplicar las reglas de sync de abajo **antes** de escribir nada más.
80
+
81
+ Pedir approval antes de escribir. Verdict: vault READY cuando existen el árbol, los templates y el `CLAUDE.md` con su `## Rutas`.
82
+
83
+ ### `adopt` - Adoptar un vault existente
84
+ Para un vault ya armado, con o sin estructura coherente. No migra nada por su cuenta.
85
+
86
+ 1. Mapear lo que hay: `Glob` de carpetas de primer nivel, conteo de notas por carpeta, campos de frontmatter en uso (`Grep`), convención de nombres de las notas periódicas, tags más usados.
87
+ 2. **Mapear rol a carpeta**, que es el entregable central de este modo. Para cada rol (`inbox`, `daily`, `weekly`, `monthly`, `atomic`, `hubs`, `projects`, `areas`, `archive`, `templates`), proponer qué carpeta del vault lo cumple hoy, y marcar `(no usa)` los que no existen. Confirmar el mapeo con el usuario item por item: es la traducción de la que dependen todos los demás skills, y un rol mal mapeado hace que escriban en la carpeta equivocada sin error visible.
88
+ 3. Correr `/vault-audit` con los flags que salen de ese mapeo (`--exempt` para `templates` y `archive`, `--require` con los campos de frontmatter que el vault ya usa) para tener métricas reales y no hallazgos falsos.
89
+ 4. Reportar el mapeo y proponer **una de dos** rutas, con el costo de cada una:
90
+ - **Adoptar la estructura existente:** escribir el `CLAUDE.md` con el `## Rutas` que acabás de mapear. Cero movimiento de archivos, cero links roto. Es la opción por default.
91
+ - **Migrar a la estructura de `setup`:** plan explícito de qué carpeta va a dónde, ejecutado por `/vault-tidy` con approval item por item, en un repo git limpio.
92
+ 5. Escribir el `CLAUDE.md` de la ruta elegida, con el `## Rutas` completo. Nunca mover archivos en este modo.
93
+ 6. Construir el índice (`vault_index.py refresh`) pasando el mapeo: `--role hubs=<carpeta> --role atomic=<carpeta> ...`.
94
+
95
+ Verdict: vault READY cuando el `CLAUDE.md` describe las convenciones reales del vault, no las ideales, y su `## Rutas` cubre los diez roles o los marca como no usados.
96
+
97
+ ### `status` - Dónde estoy
98
+ 1. Leer `hot.md` primero: son 40 líneas y responden "dónde estaba" sin abrir nada más. Si está vacío o desactualizado, seguir igual y decirlo.
99
+ 2. Leer el `CLAUDE.md` del vault para resolver los roles.
100
+ 3. Correr `vault_index.py "<vault>" inventory --format text`: ya devuelve los dumps sin daily, el último weekly y monthly, y los hubs con sus alias. Es una llamada en vez de varios `Glob`, y no crece con el vault.
101
+ 4. Reportar eso más las tareas abiertas y los proyectos sin actividad reciente.
102
+ 5. Recomendar la acción de mayor impacto.
103
+
104
+ ### `next` - Qué hago ahora
105
+ Según el estado, recomendar el skill siguiente (ver routing).
106
+
107
+ ### `link` - Conectar otro proyecto al vault
108
+ Para usar el mismo segundo cerebro desde cualquier repo, sin duplicar notas.
109
+
110
+ 1. Confirmar el path del vault y que el proyecto actual no sea el vault mismo.
111
+ 2. Leer `references/cross-project.md` y proponer el snippet, con el path real completado.
112
+ 3. Con approval, agregarlo al `CLAUDE.md` **del proyecto actual** (crear el archivo si no existe). Nunca se toca el vault en este modo.
113
+ 4. Explicar las dos reglas que hacen que esto funcione: la cascada de lectura (`hot.md` → búsqueda → hub → nota) y que **el vault no se lee para preguntas generales de programación**. Sin la segunda, cada consulta paga el costo del vault sin recibir nada.
114
+
115
+ Verdict: proyecto READY cuando su `CLAUDE.md` declara el path, la cascada y el límite de escritura.
116
+
117
+ ## El puente al código (`repos:`)
118
+
119
+ Una nota de hub o de proyecto que tenga código declara `repos:` en su frontmatter, y `codebases.md` traduce cada repo a su path local, cómo se corre y si tiene un grafo consultable. Es la dirección inversa de `/second-brain link`: ese modo hace que un repo lea el vault, esto hace que el vault sepa dónde está el repo.
120
+
121
+ La regla que lo sostiene es **el vault apunta, no copia**: la arquitectura vive en el repo y se desactualiza el día que alguien mergea. Y si el repo tiene un grafo de código, consultarlo es la primera parada antes de mandar subagentes a explorar: un relevamiento cuesta del orden de 100k tokens, una consulta al grafo uno o dos mil.
122
+
123
+ ## El caché caliente (`hot.md`)
124
+
125
+ Un archivo corto en la raíz del vault con dónde estabas: en qué trabajás, qué notas cambiaron, qué hilos siguen abiertos, qué tareas viven. Lo reescribe `/review-dump` al cerrar el día y lo lee `/second-brain status`, además de cualquier otro proyecto conectado con `link`.
126
+
127
+ Idea tomada de `AgriciDaniel/claude-obsidian`, y es la que resuelve el agujero del ciclo: los tres reviews devuelven algo **cuando vos los pedís**. El caché devuelve algo al abrir la sesión, sin pedirlo.
128
+
129
+ Cuatro reglas, duras porque es lo único del vault que se reescribe sin preguntar:
130
+
131
+ - **Techo de 40 líneas.** Si no entra, hay que resumir más, no agrandar el techo.
132
+ - **Nada de secretos ni transcripciones crudas**, aunque aparezcan en un dump.
133
+ - **Ninguna afirmación sin su link.** El caché no crea conocimiento, apunta al que existe.
134
+ - **Se reescribe completo.** Un caché al que se le agrega al final es un log, y un log nadie lo lee.
135
+
136
+ Es descartable por diseño: si contradice una nota, la nota gana, y borrarlo no pierde nada porque se regenera.
137
+
138
+ ## Sync: dos reglas que evitan el 90% de los problemas
139
+
140
+ Si el vault se sincroniza (Drive, iCloud, Dropbox, Obsidian Sync, git), dos cosas rompen de forma reproducible:
141
+
142
+ 1. **`.obsidian/` no se sincroniza.** Es config por máquina (plugins, tema, layout) y es la fuente número uno de conflictos. El patrón que lo resuelve es tener la raíz del vault local y meter el contenido compartido adentro por symlink:
143
+
144
+ ```
145
+ ~/ObsidianVault/ raiz local, nunca se sincroniza
146
+ ├── .obsidian/ TU config, queda local
147
+ └── contenido/ symlink a la carpeta sincronizada
148
+ ```
149
+
150
+ Obsidian sigue el symlink y lee las notas; la config nunca sale de tu máquina. Si el vault es solo tuyo y usás git, la alternativa es `.gitignore` con `.obsidian/`, `.vault-index.json` y `.trash/`.
151
+
152
+ 2. **Un solo transporte.** Nunca dos mecanismos de sync sobre la misma carpeta (Drive + Obsidian Sync, o iCloud + git con auto-commit): producen reversiones aleatorias que después nadie puede explicar.
153
+
154
+ Y si el vault se comparte con otras personas: **un escritor por nota**. Ningún sync mergea markdown; el segundo que guarda genera una copia en conflicto. Este profile asume vault personal, y ese es su límite honesto: para equipo hace falta declarar dueño por nota y aceptar que la co-edición no existe.
155
+
156
+ ## Hook de validación (opcional)
157
+
158
+ El profile trae un `PostToolUse` que revisa cada nota escrita en el vault: frontmatter presente, `created` y `type` declarados, y al menos un `[[wikilink]]` salvo en los dumps. Avisa por stderr y **nunca bloquea la escritura**.
159
+
160
+ Sirve para lo que los skills no cubren: las notas que escribís a mano o desde otra sesión. Para activarlo, agregar a `.claude/settings.json` **del vault** el contenido de `.claude/skills/second-brain/hooks/hooks.json`:
161
+
162
+ ```json
163
+ "PostToolUse": [
164
+ {
165
+ "matcher": "Write|Edit",
166
+ "hooks": [
167
+ { "type": "command", "command": "bash .claude/skills/second-brain/hooks/validate-note.sh", "timeout": 5 }
168
+ ]
169
+ }
170
+ ]
171
+ ```
172
+
173
+ Es opt-in a propósito y va en el settings del vault, no en el del repo: un hook que corre en cada `Write` de cualquier proyecto es peso que nadie pidió. Ofrecelo en el `setup`, explicá que es solo un warning, y respetá el no.
174
+
175
+ ## Routing
176
+
177
+ | Situación | Skill |
178
+ |---|---|
179
+ | No hay vault | `/second-brain setup` |
180
+ | Vault existente sin `CLAUDE.md` | `/second-brain adopt` |
181
+ | Capturar algo ahora, sin pensar dónde va | `/brain-dump` |
182
+ | Procesar el dump del día y crear el daily | `/review-dump` |
183
+ | Cerrar la semana | `/review-weekly` |
184
+ | Cerrar el mes | `/review-monthly` |
185
+ | Una idea del dump merece nota propia | `/zettel` |
186
+ | Una entidad se repite en varios dumps | `/hub-note` |
187
+ | Guardar un artículo o página web | `/vault-clip` |
188
+ | Encontrar algo que ya escribiste | `/vault-recall` |
189
+ | Usar el vault desde otro proyecto | `/second-brain link` |
190
+ | Saber qué tan sano está el vault | `/vault-audit` |
191
+ | Aplicar los arreglos que propuso el audit | `/vault-tidy` |
192
+ | Dudas de sintaxis Obsidian, Bases o Canvas | `/obsidian-markdown`, `/obsidian-bases`, `/obsidian-canvas` |
193
+
194
+ ## Ciclo estándar
195
+
196
+ Durante el día: `/brain-dump` cuantas veces haga falta (o escribir directo en `_inbox/YYYY-MM-DD.md`).
197
+ A la noche: `/review-dump` clasifica, actualiza hubs y crea el daily.
198
+ Fin de semana: `/review-weekly`. Fin de mes: `/review-monthly`.
199
+ Cada tanto: `/vault-audit` y, si hace falta, `/vault-tidy`.
200
+
201
+ ## Reglas
202
+
203
+ - Nunca reorganizar carpetas ni renombrar notas sin approval: rompe `[[wikilinks]]` en silencio.
204
+ - La captura tiene que quedar sin fricción. Si el usuario tiene que decidir dónde va algo mientras lo escribe, el sistema ya falló.
205
+ - No apilar frameworks. PARA + Zettelkasten + hub files es el techo; agregar GTD o CODE encima es la causa número uno de que estos sistemas se abandonen.
206
+ - Un plugin de más es deuda: no recomendar ninguno que el vault no necesite para lo que el usuario efectivamente hace.
207
+ - Máximo accionable: el usuario siempre termina sabiendo qué skill correr next.
208
+
209
+ ## Handoff
210
+
211
+ Pedí approval antes de escribir o sobrescribir archivos del vault. Cuando el vault queda READY, el siguiente paso es `/brain-dump` para la primera captura, y `/review-dump` a la noche para cerrar el ciclo completo por primera vez.
@@ -0,0 +1,16 @@
1
+ {
2
+ "hooks": {
3
+ "PostToolUse": [
4
+ {
5
+ "matcher": "Write|Edit",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "bash .claude/skills/second-brain/hooks/validate-note.sh",
10
+ "timeout": 5
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env bash
2
+ # PostToolUse guard for notes written into an Obsidian vault.
3
+ #
4
+ # Warns, never blocks: a note half-written is still worth keeping, and a hook
5
+ # that rejects writes turns capture into a fight. Everything here is a warning on
6
+ # stderr and the exit code is always 0.
7
+ #
8
+ # Only fires for .md files that live under a directory containing .obsidian/, so
9
+ # it stays silent in a code repo even when the profile is installed there.
10
+ set +e
11
+
12
+ VAULT_MARKER=".obsidian"
13
+
14
+ find_vault_root() {
15
+ local dir="$1"
16
+ while [[ -n "$dir" && "$dir" != "/" && "$dir" != "." ]]; do
17
+ [[ -d "$dir/$VAULT_MARKER" ]] && { echo "$dir"; return 0; }
18
+ local parent
19
+ parent=$(dirname "$dir")
20
+ [[ "$parent" == "$dir" ]] && break
21
+ dir="$parent"
22
+ done
23
+ return 1
24
+ }
25
+
26
+ frontmatter_of() {
27
+ # Lines between the opening --- on line 1 and the next ---. Empty if the note
28
+ # has no frontmatter at all.
29
+ awk 'NR==1 && $0!="---" {exit} NR==1 {next} /^---$/ {exit} {print}' "$1" 2>/dev/null
30
+ }
31
+
32
+ main() {
33
+ local INPUT FILE
34
+ INPUT=$(cat 2>/dev/null) || true
35
+ FILE=$(echo "$INPUT" | grep -oE '"file_path"\s*:\s*"[^"]*"' | head -1 | sed 's/.*"file_path"\s*:\s*"//;s/"$//') || true
36
+
37
+ [[ -z "$FILE" ]] && return 0
38
+ [[ "$FILE" != *.md ]] && return 0
39
+ [[ ! -f "$FILE" ]] && return 0
40
+
41
+ # Windows paths arrive backslash-escaped inside the JSON payload.
42
+ FILE=$(echo "$FILE" | sed 's|\\\\|/|g; s|\\|/|g')
43
+ [[ ! -f "$FILE" ]] && return 0
44
+
45
+ local ROOT REL
46
+ ROOT=$(find_vault_root "$(dirname "$FILE")") || return 0
47
+ REL=${FILE#"$ROOT"/}
48
+
49
+ # Templates are hollow and unlinked by design; vault config is not a note.
50
+ case "$REL" in
51
+ Templates/*|*/Templates/*|.obsidian/*) return 0 ;;
52
+ esac
53
+
54
+ local FM
55
+ FM=$(frontmatter_of "$FILE")
56
+
57
+ if [[ -z "$FM" ]]; then
58
+ echo "WARN [vault] $REL has no frontmatter: the vault contract expects created and type" >&2
59
+ return 0
60
+ fi
61
+
62
+ local MISSING=""
63
+ echo "$FM" | grep -qE '^created:' || MISSING="created"
64
+ echo "$FM" | grep -qE '^type:' || MISSING="${MISSING:+$MISSING, }type"
65
+ [[ -n "$MISSING" ]] && \
66
+ echo "WARN [vault] $REL is missing frontmatter field(s): $MISSING" >&2
67
+
68
+ # A raw dump is allowed to have no links: /review-dump is what adds them.
69
+ local TYPE
70
+ TYPE=$(echo "$FM" | grep -E '^type:' | head -1 | sed 's/^type:[[:space:]]*//;s/["'\'']//g')
71
+ case "$TYPE" in
72
+ dump|"") return 0 ;;
73
+ esac
74
+ case "$REL" in
75
+ _inbox/*) return 0 ;;
76
+ esac
77
+
78
+ if ! grep -q '\[\[' "$FILE" 2>/dev/null; then
79
+ echo "WARN [vault] $REL has no wikilink: an unlinked note is an orphan the day it is written" >&2
80
+ fi
81
+ }
82
+ # stderr is left alone on purpose: it is the whole output of this hook. Some
83
+ # hooks in hooks/ swallow it; here that would make the guard invisible.
84
+ main
85
+ exit 0
@@ -0,0 +1,57 @@
1
+ # Un vault, todos los proyectos
2
+
3
+ El vault no sirve solo cuando estás sentado en él. Sirve cuando estás en otro repo y necesitás algo que ya pensaste. Esta es la receta para que cualquier proyecto lea el mismo segundo cerebro, sin duplicar nada.
4
+
5
+ Adaptado del patrón de `AgriciDaniel/claude-obsidian` (MIT), con la cascada de lectura y la regla de exclusión que son la parte que importa.
6
+
7
+ ## El snippet
8
+
9
+ Pegar esto en el `CLAUDE.md` **del otro proyecto**, con el path real:
10
+
11
+ ```markdown
12
+ ## Segundo cerebro
13
+
14
+ Vault: `~/ruta/al/vault`
15
+
16
+ Cuando necesites contexto que no está en este repo, en este orden y parando en
17
+ cuanto alcance:
18
+
19
+ 1. `hot.md` del vault: caché de contexto reciente, corto por diseño.
20
+ 2. `python <vault>/.claude/skills/vault-recall/scripts/vault_index.py "<vault>" search "<consulta>"`
21
+ para encontrar las notas relevantes por relevancia, no por keyword.
22
+ 3. El hub del tema en `Hubs/`, y de ahí a las notas que linkea.
23
+ 4. Solo entonces, la nota específica.
24
+
25
+ NO leas el vault para preguntas generales de programación. Es memoria personal,
26
+ no documentación técnica: si la respuesta está en los docs del lenguaje o en este
27
+ repo, el vault no aporta y solo gasta contexto.
28
+
29
+ Nunca escribas en el vault desde este proyecto sin que yo lo pida explícitamente.
30
+ ```
31
+
32
+ ## Por qué la cascada, y por qué en ese orden
33
+
34
+ Cada escalón es más caro que el anterior. `hot.md` son 40 líneas y cubre "qué estaba haciendo". La búsqueda cuesta una llamada y devuelve rutas, no contenido. El hub cuesta una lectura y te da el mapa del tema. La nota específica es lo único que trae texto completo.
35
+
36
+ Sin la cascada, un agente con acceso al vault hace lo que haría cualquiera sin instrucciones: `Glob` de todo y leer lo que parezca relacionado. En un vault de mil notas eso es la sesión entera gastada antes de empezar.
37
+
38
+ ## Por qué la regla de exclusión es la línea más importante
39
+
40
+ `NO leas el vault para preguntas generales de programación`.
41
+
42
+ Sin eso, el vault se convierte en un lugar más donde buscar antes de responder cualquier cosa, y cada consulta paga el costo sin recibir nada. El vault aporta cuando la respuesta depende de **tu** historia: una decisión que tomaste, una persona con la que hablaste, algo que ya te pasó. Para saber cómo funciona un `Promise.all`, no.
43
+
44
+ ## Escritura desde otro proyecto
45
+
46
+ Por default, **solo lectura**. Un proyecto que escribe en el vault sin que se lo pidas mete notas sin frontmatter, sin links y sin que nadie las revise, que es exactamente el material del que están hechas las huérfanas.
47
+
48
+ Cuando quieras capturar algo al vault desde otro repo, hay dos caminos:
49
+
50
+ - **Recomendado:** `/brain-dump` con `--vault <path>`. Va al dump del día, sin clasificar, y lo procesa el review a la noche como cualquier otra captura.
51
+ - **Si te molesta pasar el path:** un servidor MCP de Obsidian (por ejemplo `@bitbonsai/mcpvault`) te deja tocar el vault desde cualquier sesión. Cuesta una dependencia y latencia, y hay que aclarar en el `CLAUDE.md` del proyecto que solo se usa para capturar, no para reorganizar.
52
+
53
+ ## Lo que no hay que hacer
54
+
55
+ - **No copiar notas del vault al repo.** Dos copias divergen y ninguna gana.
56
+ - **No apuntar el proyecto a una subcarpeta del vault** para "acotar". Rompe la resolución de `[[wikilinks]]`, que es global al vault.
57
+ - **No dejar que un proyecto corra `/vault-tidy` ni `/review-dump`.** Esos escriben en volumen y necesitan al usuario mirando. Desde otro repo, el vault se lee.
@@ -0,0 +1,22 @@
1
+ ---
2
+ created: {{date:YYYY-MM-DD}}
3
+ type: atomic
4
+ tags: []
5
+ ---
6
+
7
+ # <Título que afirma la idea, no que la nombra>
8
+
9
+ <La idea en tus palabras, en un párrafo. Si necesitás dos títulos `##` que no se relacionan, son dos notas.>
10
+
11
+ ## Por qué me importa
12
+
13
+ <Una o dos líneas: qué problema tuyo toca esto. Es lo que hace que la nota sea tuya y no un resumen.>
14
+
15
+ ## Relacionado
16
+
17
+ - [[Hub del tema]]
18
+ - <otras notas atómicas con las que discute o a las que refuerza>
19
+
20
+ ## Fuente
21
+
22
+ <Link al clip, al libro, a la conversación. Si salió de tu cabeza, decilo.>
@@ -0,0 +1,25 @@
1
+ ---
2
+ created: {{date:YYYY-MM-DD}}
3
+ type: daily
4
+ tags: []
5
+ ---
6
+
7
+ # {{date:YYYY-MM-DD}}
8
+
9
+ Dump del día: [[{{date:YYYY-MM-DD}} dump]]
10
+
11
+ ## Qué pasó
12
+
13
+ <Síntesis en 3 a 5 líneas, escrita por /review-dump a partir del dump. Hechos, no interpretación.>
14
+
15
+ ## Notas creadas
16
+
17
+ <Links a las notas que salieron del dump de hoy.>
18
+
19
+ ## Tareas del día
20
+
21
+ <Tareas que quedaron en este día, con su estado real. Las no hechas quedan como `- [-]`, no se mueven.>
22
+
23
+ ## Reflexión
24
+
25
+ <Esta sección la escribe el usuario. Claude no la toca.>
@@ -0,0 +1,70 @@
1
+ filters:
2
+ and:
3
+ - '!file.inFolder("Templates")'
4
+ - '!file.inFolder("04_Archive")'
5
+
6
+ formulas:
7
+ dias_sin_tocar: '(now() - file.mtime).days'
8
+
9
+ properties:
10
+ status:
11
+ displayName: Madurez
12
+ formula.dias_sin_tocar:
13
+ displayName: "Dias sin tocar"
14
+ file.mtime:
15
+ displayName: Modificada
16
+
17
+ views:
18
+ - type: table
19
+ name: "Semillas que no crecieron"
20
+ filters:
21
+ and:
22
+ - 'status == "seed"'
23
+ - "formula.dias_sin_tocar > 30"
24
+ order:
25
+ - file.name
26
+ - formula.dias_sin_tocar
27
+ - created
28
+ summaries:
29
+ formula.dias_sin_tocar: Average
30
+
31
+ - type: table
32
+ name: "Contradicciones abiertas"
33
+ filters:
34
+ - 'status == "contested"'
35
+ order:
36
+ - file.name
37
+ - created
38
+
39
+ - type: table
40
+ name: "Tocado esta semana"
41
+ limit: 30
42
+ filters:
43
+ - "file.mtime > now() - 7d"
44
+ order:
45
+ - file.mtime
46
+ - file.name
47
+ - status
48
+
49
+ - type: table
50
+ name: "Conocimiento por madurez"
51
+ filters:
52
+ - 'type == "atomic" || type == "hub" || type == "clip"'
53
+ groupBy:
54
+ property: status
55
+ direction: ASC
56
+ order:
57
+ - file.name
58
+ - type
59
+ - formula.dias_sin_tocar
60
+
61
+ - type: table
62
+ name: "Proyectos activos"
63
+ filters:
64
+ and:
65
+ - 'type == "project"'
66
+ - 'status != "cerrado"'
67
+ order:
68
+ - file.name
69
+ - status
70
+ - deadline
@@ -0,0 +1,11 @@
1
+ ---
2
+ created: {{date:YYYY-MM-DD}}
3
+ type: dump
4
+ tags: []
5
+ ---
6
+
7
+ # {{date:YYYY-MM-DD}} dump
8
+
9
+ <!-- Tirá todo acá. Sin tags, sin decidir dónde va, sin orden. Una línea por cosa.
10
+ Tareas como `- [ ] ...`. Lo clasifica /review-dump a la noche. -->
11
+
@@ -0,0 +1,22 @@
1
+ ---
2
+ created: {{date:YYYY-MM-DD}}
3
+ type: hub
4
+ tags: []
5
+ aliases: []
6
+ ---
7
+
8
+ # <Nombre de la entidad>
9
+
10
+ <Qué es y por qué tiene una nota propia, en una o dos líneas.>
11
+
12
+ ## Estado actual
13
+
14
+ <Lo que hay que saber hoy sobre esto. Esta sección se reescribe, no se acumula.>
15
+
16
+ ## Notas
17
+
18
+ <Links a las notas atómicas y proyectos de este tema. Acá sí se acumula.>
19
+
20
+ ## Historial
21
+
22
+ <Línea por evento, formato `- YYYY-MM-DD - qué pasó`, agregado por /review-dump cuando la entidad aparece en un dump. Lo más nuevo arriba.>
@@ -0,0 +1,29 @@
1
+ ---
2
+ created: {{date:YYYY-MM-DD}}
3
+ type: monthly
4
+ tags: []
5
+ ---
6
+
7
+ # {{date:YYYY-MM}}
8
+
9
+ Weeklies del mes: <links a los weeklies>
10
+
11
+ ## Patrones
12
+
13
+ <Lo que se repitió a lo largo del mes y no se ve en una sola semana.>
14
+
15
+ ## Logros
16
+
17
+ <Lo que efectivamente se cerró, con link a la nota que lo respalda.>
18
+
19
+ ## Ideas para adelante
20
+
21
+ <Semillas: lo que apareció este mes y merece seguimiento el mes que viene.>
22
+
23
+ ## Salud del vault
24
+
25
+ <Resumen de la última corrida de /vault-audit: huérfanas, stale, tareas viejas abiertas.>
26
+
27
+ ## Reflexión
28
+
29
+ <Esta sección la escribe el usuario.>
@@ -0,0 +1,29 @@
1
+ ---
2
+ created: {{date:YYYY-MM-DD}}
3
+ type: weekly
4
+ tags: []
5
+ ---
6
+
7
+ # {{date:YYYY}}-W{{date:ww}}
8
+
9
+ Dailies de la semana: <links a los dailies existentes>
10
+
11
+ ## Temas de la semana
12
+
13
+ <Los 3 a 5 temas que se repitieron, cada uno con los dailies donde aparece.>
14
+
15
+ ## Hilos abiertos
16
+
17
+ <Lo que quedó sin cerrar y sigue vivo. Distinto de una tarea: es una pregunta o decisión pendiente.>
18
+
19
+ ## Tareas: hechas y no hechas
20
+
21
+ <Conteo y detalle. Las no hechas se nombran, no se esconden.>
22
+
23
+ ## Notas que crecieron
24
+
25
+ <Hub files y notas atómicas que recibieron contenido esta semana.>
26
+
27
+ ## Reflexión
28
+
29
+ <Esta sección la escribe el usuario.>
@@ -0,0 +1,37 @@
1
+ ---
2
+ created: {{date:YYYY-MM-DD}}
3
+ type: codebases
4
+ ---
5
+
6
+ # Codebases
7
+
8
+ Puente del vault al código. Las notas de hub y de proyecto declaran `repos:` en su frontmatter; esta tabla dice qué es cada repo y dónde está en esta máquina.
9
+
10
+ **El vault apunta, no copia.** Acá no va arquitectura, ni estructura de carpetas, ni explicaciones de módulos: eso vive en el repo y se desactualiza el día que alguien mergea. Acá va solo lo que el repo no te puede decir: dónde está local, cómo se corre, y qué te vas a llevar puesto.
11
+
12
+ | Repo | Path local | Rama | Cómo correr | Grafo | Notas |
13
+ |---|---|---|---|---|---|
14
+ | `<repo>` | `~/code/<repo>` | `main` | `npm run dev` | `graphify` | `<gotcha en una línea>` |
15
+
16
+ ## Antes de explorar un repo, consultá su grafo
17
+
18
+ Si el repo tiene un grafo de código consultable, **esa es la primera parada, no un subagente explorando**. Un relevamiento de arquitectura con subagentes cuesta del orden de 100k tokens y minutos; una consulta al grafo cuesta uno o dos mil y es instantánea.
19
+
20
+ ```bash
21
+ graphify query "que conecta X con Y" --budget 2000
22
+ graphify explain "<Simbolo>"
23
+ ```
24
+
25
+ Y si el repo tiene una capa curada de arquitectura (por ejemplo `exploracion/ARQUITECTURA.md`), leela después del grafo: ahí viven las decisiones y los gotchas que un AST no ve. Si tu cambio invalida algo de lo que documenta, actualizarla es parte del cambio.
26
+
27
+ ## Qué va en el vault y qué va en el repo
28
+
29
+ | Pregunta | La responde |
30
+ |---|---|
31
+ | ¿Qué hace esto y para quién? | El vault: el hub del tema |
32
+ | ¿Por qué está hecho así? | El vault: la decisión, en una nota atómica |
33
+ | ¿Qué archivos toco? | El repo: el grafo |
34
+ | ¿Qué se rompe si cambio esto? | El repo: el grafo |
35
+ | ¿Cómo lo corro y qué me va a explotar? | Esta tabla |
36
+
37
+ Si te encontrás copiando arquitectura al vault, la pregunta que estabas contestando era del repo.
@@ -0,0 +1,37 @@
1
+ ---
2
+ type: cache
3
+ updated: {{date:YYYY-MM-DD}}
4
+ ---
5
+
6
+ # Contexto reciente
7
+
8
+ > [!warning] Esto es un caché, no una nota
9
+ > Lo reescribe `/review-dump` al cerrar el día. Si contradice a una nota, **la nota gana**. Se puede borrar sin perder nada: se regenera. No lo edites a mano, no lo linkees desde otras notas.
10
+
11
+ ## Dónde estoy
12
+
13
+ <Dos o tres líneas: en qué está trabajando el usuario ahora. Reescrito cada vez, no acumulado.>
14
+
15
+ ## Cambió en los últimos días
16
+
17
+ <Links a las notas creadas o tocadas, con una línea de qué cambió en cada una. Máximo 10.>
18
+
19
+ ## Hilos abiertos
20
+
21
+ <Preguntas y decisiones pendientes, con link a donde aparecieron. Máximo 5. Un hilo que se cierra se saca de acá.>
22
+
23
+ ## Tareas vivas
24
+
25
+ <Las tareas abiertas que siguen vigentes, con link a su nota. No las canceladas.>
26
+
27
+ <!--
28
+ Reglas de este archivo, y son duras porque es lo único del vault que un agente
29
+ reescribe sin preguntar:
30
+
31
+ - Techo de 40 lineas. Si no entra, es que hay que resumir mas, no agrandar el techo.
32
+ - Nada de secretos, tokens, ni credenciales, aunque aparezcan en un dump.
33
+ - Nada de transcripciones crudas ni de texto pegado de terceros.
34
+ - Ninguna afirmacion sin su link a la nota que la respalda. Este archivo no crea
35
+ conocimiento: apunta al que ya existe.
36
+ - Se reescribe completo, no se le agrega al final. Un caché que crece es un log.
37
+ -->