claude-code-arcane 1.4.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.
- package/CHANGELOG.md +55 -0
- package/README.md +5 -4
- package/dist/cli.js +2 -0
- package/docs/SKILLS-CATALOG.md +30 -3
- package/docs/USER-GUIDE.md +2 -2
- package/docs/coding-standards.md +26 -0
- package/package.json +2 -1
- package/profiles/job-hunt.yaml +12 -2
- package/profiles/second-brain.yaml +37 -0
- package/rules/drafter-reviewer.md +39 -0
- package/rules/vault-conventions.md +144 -0
- package/skills/brain-dump/SKILL.md +53 -0
- package/skills/cold-outreach/SKILL.md +10 -10
- package/skills/cold-outreach/references/recruiter-playbook.md +5 -5
- package/skills/cover-letter/SKILL.md +8 -8
- package/skills/cv-ats-export/SKILL.md +19 -6
- package/skills/cv-ats-export/scripts/cv_export.py +49 -4
- package/skills/cv-ats-export/scripts/verify_pdf.py +90 -0
- package/skills/cv-tailor/SKILL.md +7 -7
- package/skills/cv-tailor/references/ats-keywords.md +9 -9
- package/skills/hub-note/SKILL.md +68 -0
- package/skills/interview-prep/SKILL.md +7 -7
- package/skills/interview-prep/references/star-framework.md +10 -10
- package/skills/job-aplicar/SKILL.md +88 -0
- package/skills/job-hunt/SKILL.md +20 -13
- package/skills/job-hunt/references/templates/Aplicacion.md +6 -2
- package/skills/job-hunt/references/templates/CV Custom.md +1 -1
- package/skills/job-hunt/references/templates/Contacto.md +1 -1
- package/skills/job-hunt/references/templates/Dashboard.md +19 -15
- package/skills/job-hunt/references/templates/Perfil.md +2 -2
- package/skills/job-outcome/SKILL.md +55 -0
- package/skills/job-scrape/SKILL.md +95 -0
- package/skills/job-scrape/references/dedup-playbook.md +25 -0
- package/skills/job-scrape/references/getonbrd-cli.md +62 -0
- package/skills/job-scrape/references/getonbrd-urls.md +37 -0
- package/skills/job-scrape/references/linkedin-cli.md +64 -0
- package/skills/job-scrape/references/linkedin-urls.md +42 -0
- package/skills/job-scrape/references/seen_jobs.schema.json +68 -0
- package/skills/job-scrape/scripts/getonbrd_search.py +501 -0
- package/skills/job-scrape/scripts/linkedin_search.py +428 -0
- package/skills/job-search/SKILL.md +22 -19
- package/skills/job-search/references/scoring-rubric.md +8 -8
- package/skills/job-upskill/SKILL.md +58 -0
- package/skills/linkedin-optimize/SKILL.md +5 -5
- package/skills/master-profile/SKILL.md +17 -17
- package/skills/network-map/SKILL.md +7 -7
- package/skills/obsidian-bases/SKILL.md +85 -0
- package/skills/obsidian-bases/references/bases-syntax.md +123 -0
- package/skills/obsidian-canvas/SKILL.md +91 -0
- package/skills/obsidian-markdown/SKILL.md +110 -0
- package/skills/pdf-generator/scripts/fill_inspect.py +2 -0
- package/skills/pdf-generator/scripts/render_body.py +2 -0
- package/skills/personal-brand/SKILL.md +10 -10
- package/skills/personal-brand/references/post-pillars.md +14 -14
- package/skills/portfolio-site/SKILL.md +11 -11
- package/skills/review-dump/SKILL.md +108 -0
- package/skills/review-monthly/SKILL.md +56 -0
- package/skills/review-weekly/SKILL.md +91 -0
- package/skills/second-brain/SKILL.md +211 -0
- package/skills/second-brain/hooks/hooks.json +16 -0
- package/skills/second-brain/hooks/validate-note.sh +85 -0
- package/skills/second-brain/references/cross-project.md +57 -0
- package/skills/second-brain/references/templates/Atomic.md +22 -0
- package/skills/second-brain/references/templates/Daily.md +25 -0
- package/skills/second-brain/references/templates/Dashboard.base +70 -0
- package/skills/second-brain/references/templates/Dump.md +11 -0
- package/skills/second-brain/references/templates/Hub.md +22 -0
- package/skills/second-brain/references/templates/Monthly.md +29 -0
- package/skills/second-brain/references/templates/Weekly.md +29 -0
- package/skills/second-brain/references/templates/codebases.md +37 -0
- package/skills/second-brain/references/templates/hot.md +37 -0
- package/skills/second-brain/references/templates/vault-CLAUDE.md +127 -0
- package/skills/vault-audit/SKILL.md +72 -0
- package/skills/vault-audit/scripts/vault_audit.py +539 -0
- package/skills/vault-clip/SKILL.md +73 -0
- package/skills/vault-recall/SKILL.md +82 -0
- package/skills/vault-recall/scripts/vault_index.py +626 -0
- package/skills/vault-tidy/SKILL.md +76 -0
- package/skills/xlsx-generator/scripts/formula_check.py +2 -0
- package/skills/xlsx-generator/scripts/libreoffice_recalc.py +2 -0
- package/skills/xlsx-generator/scripts/xlsx_add_column.py +2 -0
- package/skills/xlsx-generator/scripts/xlsx_insert_row.py +2 -0
- package/skills/xlsx-generator/scripts/xlsx_reader.py +2 -0
- package/skills/zettel/SKILL.md +66 -0
|
@@ -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,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
|
+
-->
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# <NOMBRE DEL VAULT>
|
|
2
|
+
|
|
3
|
+
Vault de Obsidian usado como segundo cerebro. Este archivo es el contrato: Claude Code lo lee al inicio de cada sesión y de acá saca dónde va cada cosa. Si una convención cambia, se cambia acá primero.
|
|
4
|
+
|
|
5
|
+
## Quién soy
|
|
6
|
+
|
|
7
|
+
<Rol, en qué proyectos estoy, qué temas me interesan. Dos o tres líneas: sirve para que las síntesis tengan contexto y no sean genéricas.>
|
|
8
|
+
|
|
9
|
+
## Rutas
|
|
10
|
+
|
|
11
|
+
Contrato de rutas: los skills escriben en **roles**, y esta tabla dice qué carpeta es cada rol en este vault. Si cambiás una carpeta de lugar, se cambia acá y todo lo demás sigue funcionando.
|
|
12
|
+
|
|
13
|
+
| Rol | Ruta en este vault |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `inbox` | `_inbox` |
|
|
16
|
+
| `daily` | `Reflect/Daily` |
|
|
17
|
+
| `weekly` | `Reflect/Weekly` |
|
|
18
|
+
| `monthly` | `Reflect/Monthly` |
|
|
19
|
+
| `atomic` | `03_Resources` |
|
|
20
|
+
| `hubs` | `Hubs` |
|
|
21
|
+
| `projects` | `01_Projects` |
|
|
22
|
+
| `areas` | `02_Areas` |
|
|
23
|
+
| `archive` | `04_Archive` |
|
|
24
|
+
| `templates` | `Templates` |
|
|
25
|
+
|
|
26
|
+
Y tres archivos fijos en la raíz: este `CLAUDE.md` (el contrato), `hot.md` (el caché de contexto reciente, lo reescribe `/review-dump`) y `codebases.md` (el puente a los repos, si hay código).
|
|
27
|
+
|
|
28
|
+
Un rol que este vault no usa se marca `(no usa)` en vez de borrar la fila: así queda explícito que la ausencia fue una decisión.
|
|
29
|
+
|
|
30
|
+
Los scripts reciben esto por flag: `--role hubs=Hubs --role atomic=03_Resources`.
|
|
31
|
+
|
|
32
|
+
## Estructura
|
|
33
|
+
|
|
34
|
+
| Carpeta | Qué vive acá |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `_inbox/` | Captura cruda, un archivo por día (`YYYY-MM-DD dump.md`). Sin estructura, sin tags, sin pensar. El sufijo evita que el nombre choque con el del daily. |
|
|
37
|
+
| `Reflect/Daily/` | Síntesis del día (`YYYY-MM-DD.md`), la crea `/review-dump`. |
|
|
38
|
+
| `Reflect/Weekly/` | Retrospectiva semanal (`YYYY-Www.md`). |
|
|
39
|
+
| `Reflect/Monthly/` | Balance del mes (`YYYY-MM.md`). |
|
|
40
|
+
| `01_Projects/` | Algo con deadline o resultado definido. Cuando cierra, va a `04_Archive/`. |
|
|
41
|
+
| `02_Areas/` | Responsabilidad continua sin fecha de fin (salud, finanzas, un rol). |
|
|
42
|
+
| `03_Resources/` | Notas atómicas: una idea por nota, plano, sin subcarpetas. |
|
|
43
|
+
| `04_Archive/` | Cerrado. Nunca se borra nada, se archiva. |
|
|
44
|
+
| `Hubs/` | Una nota por entidad que importa: persona, herramienta, concepto, empresa. |
|
|
45
|
+
| `Bases/` | Vistas `.base`. |
|
|
46
|
+
| `Templates/` | Mis plantillas. Claude no las edita. |
|
|
47
|
+
|
|
48
|
+
## Contrato de frontmatter
|
|
49
|
+
|
|
50
|
+
Todo campo que se escriba tiene que estar acá. Un campo que no está declarado no se inventa: se propone y se agrega primero.
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
---
|
|
54
|
+
created: YYYY-MM-DD # ISO, nunca se reescribe
|
|
55
|
+
type: daily # daily | weekly | monthly | dump | atomic | hub | project | area | clip
|
|
56
|
+
status: seed # madurez, solo en atomic, hub y clip (ver abajo)
|
|
57
|
+
tags: []
|
|
58
|
+
---
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### `status`: madurez de la nota
|
|
62
|
+
|
|
63
|
+
Solo para `atomic`, `hub` y `clip`. Las notas periódicas (`daily`, `weekly`, `monthly`, `dump`) no lo llevan: son registro, no conocimiento, y no maduran.
|
|
64
|
+
|
|
65
|
+
| Valor | Significa | Efecto |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| `seed` | Apenas plantada, incompleta a propósito | No cuenta como hueca. Si sigue `seed` a los 30 días, el audit la marca: una semilla que no crecio es la falla clasica del vault. |
|
|
68
|
+
| `provisional` | Tiene cuerpo pero no la sostendría en una discusión | Default de una nota recién escrita con contenido |
|
|
69
|
+
| `evergreen` | Dice lo que tiene que decir. Puede quedarse quieta años | **No cuenta como stale.** Es lo que distingue una nota que ya hizo su trabajo de una abandonada. |
|
|
70
|
+
| `contested` | Contradice a otra nota del vault y no está resuelto | El audit la lista para que un review la mire. La contradicción se preserva, no se resuelve sola. |
|
|
71
|
+
| `archived` | Cerrada | Fuera del alcance del audit, viva donde viva |
|
|
72
|
+
|
|
73
|
+
Sin este campo el audit no puede distinguir una nota de referencia que terminó su trabajo de un stub que nunca creció, y reporta las dos como stale.
|
|
74
|
+
|
|
75
|
+
**Los proyectos usan el mismo campo con otro vocabulario** (`activo | pausado | cerrado`): es su ciclo de vida, no su madurez. El audit solo interpreta los cinco valores de arriba, así que un `activo` le resulta inerte y el proyecto se evalúa como cualquier otra nota. Si eso te molesta, renombralo acá y el contrato manda.
|
|
76
|
+
|
|
77
|
+
Campos adicionales por tipo:
|
|
78
|
+
|
|
79
|
+
| `type` | Campos propios |
|
|
80
|
+
|---|---|
|
|
81
|
+
| `project` | `status: activo \| pausado \| cerrado`, `deadline` (opcional), `repos:` si tiene código |
|
|
82
|
+
| `clip` | `source` (URL), `author` (opcional) |
|
|
83
|
+
| `hub` | `aliases` (nombres alternativos de la entidad), `repos:` si la entidad tiene código |
|
|
84
|
+
|
|
85
|
+
`repos:` es el puente al código: la lista de repos que implementan esa entidad. Se traduce a path local en `codebases.md`. **El vault apunta, no copia:** la arquitectura vive en el repo.
|
|
86
|
+
|
|
87
|
+
## Reglas de link
|
|
88
|
+
|
|
89
|
+
- **Los links van hacia arriba, nunca hacia abajo.** Dump linkea a hubs y proyectos. Daily linkea al dump. Weekly linkea a los dailies. Monthly linkea a los weeklies. Los backlinks de Obsidian dan la dirección inversa gratis.
|
|
90
|
+
- **Ninguna nota se cierra sin al menos un `[[wikilink]]`.** Si no hay a qué linkearla, falta un hub file.
|
|
91
|
+
- `[[wikilinks]]` para lo interno, `[texto](url)` solo para URLs externas.
|
|
92
|
+
|
|
93
|
+
## Tareas
|
|
94
|
+
|
|
95
|
+
Las tareas viven en la nota a la que pertenecen, no en una lista central. Una tarea de un proyecto vive en la nota del proyecto; una que apareció en el día vive en el dump de ese día.
|
|
96
|
+
|
|
97
|
+
**Una tarea abierta no se arrastra al día siguiente.** Queda en su día marcada como cancelada (`- [-]`) y se crea de nuevo donde corresponda. No haber hecho algo un día es información.
|
|
98
|
+
|
|
99
|
+
## Qué puede hacer Claude
|
|
100
|
+
|
|
101
|
+
- Crear y editar notas, clasificar el dump, actualizar hub files, generar dailies/weeklies/monthlies, buscar en el vault, proponer links.
|
|
102
|
+
|
|
103
|
+
## Qué no puede hacer Claude
|
|
104
|
+
|
|
105
|
+
- Borrar notas (mueve a `04_Archive/`).
|
|
106
|
+
- Renombrar o mover notas sin que yo lo apruebe.
|
|
107
|
+
- Editar `Templates/` ni nada dentro de `.obsidian/`.
|
|
108
|
+
- Escribir la sección de reflexión de los reviews: los hechos los sintetiza Claude, la interpretación la escribo yo.
|
|
109
|
+
- Editar en masa: los cambios que afectan muchas notas van por `/vault-tidy` con approval.
|
|
110
|
+
|
|
111
|
+
## Plugins instalados
|
|
112
|
+
|
|
113
|
+
<Completado por `/second-brain setup` con la detección real. Lo que no está en esta lista no se usa en las notas.>
|
|
114
|
+
|
|
115
|
+
## Quién escribe qué
|
|
116
|
+
|
|
117
|
+
- **Autorado** (lo escribo yo, Claude no lo toca sin approval): dumps, notas atómicas, hubs, clips, proyectos, este archivo, y la `## Reflexión` de los reviews.
|
|
118
|
+
- **Sintetizado** (Claude lo escribe con mi OK y queda como nota): dailies, weeklies, monthlies, el `## Historial` de los hubs.
|
|
119
|
+
- **Proyectado** (Claude lo reescribe sin preguntar, es derivado y descartable): `hot.md`, `.vault-index.json`, las vistas `.base`. No los edito a mano porque se pisan.
|
|
120
|
+
|
|
121
|
+
## Uso desde otros proyectos
|
|
122
|
+
|
|
123
|
+
Otros repos pueden leer este vault. El orden de lectura es `hot.md` → búsqueda con `vault_index.py` → el hub del tema → la nota. **No se lee el vault para preguntas generales de programación**, y no se escribe en él desde otro proyecto salvo pedido explícito. Receta completa: `/second-brain link`.
|
|
124
|
+
|
|
125
|
+
## Git
|
|
126
|
+
|
|
127
|
+
Este vault es un repo git. Antes de una corrida que escribe varias notas, el árbol tiene que estar limpio: es el único undo confiable.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vault-audit
|
|
3
|
+
description: "Reporte de salud del vault de Obsidian via script Python: huerfanas, links roto, notas stale, tag sprawl, nombres duplicados y frontmatter fuera de contrato. Read-only, no escribe nada. Triggers: auditar el vault, salud del vault, notas huerfanas, links roto, vault audit, que tan sano esta mi vault."
|
|
4
|
+
argument-hint: "[--vault <path>] [--stale-days N] [--seed-days N] [--exempt <dir>] [-n 0]"
|
|
5
|
+
category: "pkm"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Vault Audit - Salud del vault
|
|
11
|
+
|
|
12
|
+
Medís el estado real del vault y explicás qué significan los números. **Este skill es read-only:** no escribe ni una línea en el vault. Los arreglos necesitan approval del usuario y los aplica `/vault-tidy`.
|
|
13
|
+
|
|
14
|
+
Flags: `$ARGUMENTS`
|
|
15
|
+
|
|
16
|
+
## Fase 1 - Correr el script
|
|
17
|
+
|
|
18
|
+
El conteo lo hace Python, no vos: leer nota por nota para contar links cuesta cientos de miles de tokens en un vault real y da números peores.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
python .claude/skills/vault-audit/scripts/vault_audit.py "<vault>" --format json
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Flags útiles: `--stale-days N` (default 180), `--hollow-words N` (default 30), `--task-days N` (default 7), `--seed-days N` (default 30), `--require <campo>` (repetible, default `created` y `type`), `--exempt <carpeta>` (repetible, default `Templates` y `04_Archive`), `-n 0` para no truncar listas, `--audit-all` para auditar también las carpetas exentas.
|
|
25
|
+
|
|
26
|
+
El script solo lee el filesystem: sin dependencias, corre sobre miles de notas en segundos.
|
|
27
|
+
|
|
28
|
+
**Los defaults no son la verdad del vault: el `CLAUDE.md` lo es.** Antes de correr, leer su contrato y traducirlo a flags: los campos de frontmatter a `--require`, y los roles `templates` y `archive` a `--exempt`. Auditar un vault adoptado con los defaults produce hallazgos falsos (sus plantillas aparecen como huérfanas huecas) y esconde los reales.
|
|
29
|
+
|
|
30
|
+
## Fase 2 - Interpretar
|
|
31
|
+
|
|
32
|
+
Un hallazgo no es un problema hasta que sabés por qué está ahí. Las lecturas que importan:
|
|
33
|
+
|
|
34
|
+
| Hallazgo | Qué suele significar | Cuándo NO es un problema |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `orphans` | Notas que nadie linkea y que no linkean nada: el síntoma del vault-cementerio | Casi nunca. Es el hallazgo que más vale atacar. |
|
|
37
|
+
| `no_backlinks` | Nada apunta a la nota, aunque ella sí apunta a otras | Notas de entrada (dashboards, hubs de primer nivel) |
|
|
38
|
+
| `broken_links` | Link a una nota que no existe. Los `aliases` del frontmatter ya se resuelven, igual que en Obsidian, así que un `[[Nacho]]` que apunta al hub "Ignacio Martinez" no aparece acá | **Un link roto es muchas veces una intención, no un error:** es la nota que el usuario todavía no escribió. Distinguí typo de intención antes de proponer nada. |
|
|
39
|
+
| `ambiguous_names` | Dos archivos con el mismo nombre en carpetas distintas | Nunca: hace que todo `[[link corto]]` a ese nombre resuelva de forma impredecible. Es el hallazgo más urgente aunque parezca menor. |
|
|
40
|
+
| `stale` | Sin tocar en 180 días o más. Las `evergreen` **no** aparecen acá: ya dijeron lo que tenían que decir | Referencia que ya hizo su trabajo pero que nadie marcó `evergreen` todavía |
|
|
41
|
+
| `stale_seeds` | Notas en `seed` hace más de 30 días | Casi nunca. Es la falla clásica del vault: las semillas nunca maduran. Es más grave que una huérfana porque no se ve. |
|
|
42
|
+
| `contested` | Notas marcadas como contradictorias y sin resolver | Nunca es un error del vault: es el vault haciendo su trabajo. Va al `/review-monthly`, no a `/vault-tidy`. |
|
|
43
|
+
| `hollow` | Menos de 30 palabras | Semilla reciente. Dejala crecer. |
|
|
44
|
+
| `single_use_tags` | Tags usados una sola vez | Inocuo salvo que sean cientos: ahí hay confusión de vocabulario, no organización. |
|
|
45
|
+
| `stale_open_tasks` | Tareas abiertas en un día que ya cerró | Es la regla de arrastre incumplida: había que cancelarlas en su día. |
|
|
46
|
+
| `missing_frontmatter` | Campos del contrato ausentes | Notas viejas anteriores al contrato |
|
|
47
|
+
| `orphan_attachments` | Imágenes y PDFs que nadie embebe | Ocupan espacio, no rompen nada |
|
|
48
|
+
|
|
49
|
+
El campo `status` del contrato (`seed | provisional | evergreen | contested | archived`) es lo que hace accionables a `stale` y `hollow`: sin él, una nota de referencia que ya cumplió y un stub abandonado se reportan igual. `counts.by_status` te dice cuánto del vault está declarado y cuánto no.
|
|
50
|
+
|
|
51
|
+
Dos métricas de tendencia valen más que cualquier lista: **`avg_links_per_note`** (si es baja, el vault es un archivo de documentos, no una red de ideas) y **`orphan_rate`**. Compará contra el monthly anterior si existe.
|
|
52
|
+
|
|
53
|
+
## Fase 3 - Reportar
|
|
54
|
+
|
|
55
|
+
1. Los conteos primero, en una tabla corta. Sin adornos.
|
|
56
|
+
2. Los 3 a 5 hallazgos que valen la pena, ordenados por impacto real: `ambiguous_names` y `orphans` arriba, `hollow` y `single_use_tags` abajo o directamente omitidos si son ruido.
|
|
57
|
+
3. **Si el reporte trae `truncated`, decirlo con el total real.** Un reporte truncado que no se anuncia se lee como un vault sano, y esa es la única mentira que este skill no puede cometer.
|
|
58
|
+
4. Cerrar con una recomendación concreta: qué arreglaría primero y por qué.
|
|
59
|
+
|
|
60
|
+
Audit COMPLETE cuando el usuario sabe los números, cuáles importan y cuál es el primer arreglo.
|
|
61
|
+
|
|
62
|
+
## Reglas
|
|
63
|
+
|
|
64
|
+
- No escribir en el vault. Ni una nota, ni un frontmatter, ni un link. Para eso está `/vault-tidy`.
|
|
65
|
+
- No dramatizar los números: un vault de 2000 notas con 40 huérfanas está sano.
|
|
66
|
+
- No proponer plugins como solución a un problema de higiene: menos plugins es más sano.
|
|
67
|
+
- No sugerir borrar nada. El vocabulario es archivar.
|
|
68
|
+
- Sin guiones largos en el reporte.
|
|
69
|
+
|
|
70
|
+
## Handoff
|
|
71
|
+
|
|
72
|
+
Con el reporte listo, el siguiente paso es `/vault-tidy` para aplicar los arreglos elegidos con approval item por item. Si el audit muestra muchas huérfanas del mismo tema, el arreglo real es `/hub-note` para el hub que falta. `/review-monthly` corre este audit como parte del cierre del mes.
|