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
package/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ # [2.1.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.0.0...v2.1.0) (2026-08-04)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **ci:** group concurrency by branch name so a push really runs once ([54a83b7](https://github.com/SebastianLuser/claude-code-arcane/commit/54a83b729c9a82213880cf02de0bf44098040d38))
7
+ * **ci:** scope the concurrency group per event, not per branch ([1ce5273](https://github.com/SebastianLuser/claude-code-arcane/commit/1ce52739a7182f29b51af68b00b6164fc6911b72)), closes [#7](https://github.com/SebastianLuser/claude-code-arcane/issues/7)
8
+
9
+
10
+ ### Features
11
+
12
+ * related notes, doc-count and python-floor guards, .base dashboard ([f4fe5c6](https://github.com/SebastianLuser/claude-code-arcane/commit/f4fe5c65deedf0ad247aaa31edfb2498183092e1))
13
+ * **second-brain:** add a hot context cache, note maturity, and cross-project reads ([9b1669f](https://github.com/SebastianLuser/claude-code-arcane/commit/9b1669f2b9808d2815a653fa34acd62531274bd0))
14
+ * **second-brain:** add Obsidian second brain profile ([882c836](https://github.com/SebastianLuser/claude-code-arcane/commit/882c83680efcb3d345888486423fad3d73f2d176))
15
+ * **second-brain:** resolve paths by role, add ranked recall, cache the inventory ([f4c9c7c](https://github.com/SebastianLuser/claude-code-arcane/commit/f4c9c7c8bbf27a4388598cdec50ed9a1141bdf7a))
16
+ * **second-brain:** who-writes-what classes, a code bridge, and sync rules ([03236d2](https://github.com/SebastianLuser/claude-code-arcane/commit/03236d20fdcee3aa55e1b26056021a0334c5497d))
17
+
1
18
  # [2.0.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v1.4.0...v2.0.0) (2026-07-27)
2
19
 
3
20
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Claude Code Arcane
2
2
 
3
- > **337 skills, 87 agents, 15 hooks and 20 rules for Claude Code — selective deploy by profile.**
3
+ > **375 skills, 92 agents, 16 hooks and 25 rules for Claude Code — selective deploy by profile.**
4
4
 
5
5
  A configuration harness installable via `npx`. Pick a **profile** that matches your stack and only the relevant tools get installed into your project's `.claude/` directory.
6
6
 
@@ -194,6 +194,7 @@ Once installed, manage the installation from within a Claude Code session:
194
194
  | `+regulatory` | ISO 13485, GDPR, FDA, SOC 2, ISMS, QMS, MDR | 13 | regulatory |
195
195
  | `+job-hunt` | Job search end-to-end — master profile, ATS CV with verification, job scraping with dedup, LinkedIn, portfolio, cover letters, outreach, interview prep | 16 | — |
196
196
  | `+ecommerce` | Commerce end-to-end agnóstico de lenguaje — data model, checkout, inventario, órdenes, pagos, promociones, shipping/tax, listings, analytics, feeds, storefront, suscripciones | 12 | ecommerce |
197
+ | `+second-brain` | Second brain en Obsidian — captura sin fricción, reviews diario/semanal/mensual, notas atómicas y hub files (PARA + Zettelkasten), búsqueda con ranking, caché de contexto entre sesiones, auditoría de salud del vault, sintaxis nativa (markdown, Bases, Canvas) | 14 | — |
197
198
  | `+self-improving` | Agent self-improvement and skill extraction | 2 | — |
198
199
  | `+statusline` | Claude Code status bar (branch, division, session info) | 0 | — |
199
200
 
@@ -348,11 +349,11 @@ claude-code-arcane/
348
349
  │ ├── manifest.ts # Read/write arcane-manifest.json
349
350
  │ ├── types.ts # TypeScript interfaces
350
351
  │ └── utils.ts # Cross-platform helpers
351
- ├── skills/ # 333 skills (flat, one dir per skill)
352
+ ├── skills/ # 375 skills (flat, one dir per skill)
352
353
  ├── profiles/ # 29 profiles (YAML)
353
354
  ├── agents/ # 13 dirs, 86+ agents (Markdown)
354
355
  ├── hooks/ # 15 lifecycle hooks (Bash)
355
- ├── rules/ # 20 rules (Markdown)
356
+ ├── rules/ # 25 rules (Markdown)
356
357
  ├── templates/ # Gamedev templates
357
358
  ├── docs/ # Documentation
358
359
  └── skills-selftest/ # QA framework
@@ -1,6 +1,8 @@
1
1
  # Skills Catalog — Claude Code Arcane
2
2
 
3
- Catalogo completo de los 337 skills disponibles para proyectos consumidores. Organizados por division.
3
+ Los 375 skills disponibles para proyectos consumidores, organizados por division.
4
+
5
+ La tabla cubre 333: hay 42 skills instalables que todavia no estan catalogados aca. Un test de CI (`src/__tests__/doc-counts.test.ts`) verifica que estos numeros coincidan con el filesystem y que el header de cada seccion coincida con sus filas.
4
6
 
5
7
  ## Como ejecutar un skill
6
8
 
@@ -98,7 +100,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
98
100
 
99
101
  ---
100
102
 
101
- ## General (55 skills)
103
+ ## General (54 skills)
102
104
 
103
105
  | Skill | Descripcion | Uso |
104
106
  |-------|-------------|-----|
@@ -455,6 +457,27 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
455
457
 
456
458
  ---
457
459
 
460
+ ## Second Brain (14 skills)
461
+
462
+ | Skill | Descripcion | Uso |
463
+ |-------|-------------|-----|
464
+ | `/second-brain` | Entry point: crea o adopta el vault (PARA + Zettelkasten + hub files), escribe su CLAUDE.md y su cache hot.md, detecta plugins, conecta otros proyectos al mismo vault y rutea | `[setup\|adopt\|status\|next\|link]` |
465
+ | `/brain-dump` | Captura sin friccion al dump del dia: sin tags, sin clasificar, sin decidir donde va | `[texto a capturar]` |
466
+ | `/review-dump` | Procesa el dump: clasifica item por item con confirmacion, actualiza hubs, rutea tareas y crea el daily | `[today\|YYYY-MM-DD]` |
467
+ | `/review-weekly` | Retrospectiva semanal: temas recurrentes, hilos abiertos y tareas hechas vs no hechas | `[current\|YYYY-Www\|YYYY-MM-DD]` |
468
+ | `/review-monthly` | Retrospectiva mensual: patrones, logros con evidencia, semillas y salud del vault | `[current\|YYYY-MM]` |
469
+ | `/zettel` | Nota atomica con el criterio de cuando una idea pasa de nota de proyecto a permanente | `[idea\|ruta#seccion\|dump YYYY-MM-DD]` |
470
+ | `/hub-note` | Hub file (MOC) por entidad que importa: el tejido entre PARA y Zettelkasten | `[entidad] [--update]` |
471
+ | `/vault-recall` | Busqueda con ranking (BM25, acentos plegados, expansion por alias) y notas relacionadas por vocabulario compartido, via indice cacheado | `<consulta> \| related <nota> [-n N]` |
472
+ | `/vault-clip` | URL a nota limpia: contenido sin menus ni banners, con resumen propio y fuente | `<url> [--full\|--summary]` |
473
+ | `/vault-audit` | Reporte de salud via script Python: huerfanas, links roto, stale, semillas que no crecieron, contradicciones, tag sprawl, nombres duplicados. Read-only | `[--vault <path>] [--stale-days N]` |
474
+ | `/vault-tidy` | Aplica los arreglos del audit con approval item por item. Nunca borra, archiva | `[orphans\|broken\|duplicates\|tasks\|frontmatter\|archive\|all]` |
475
+ | `/obsidian-markdown` | Sintaxis Obsidian: wikilinks, embeds, callouts, block IDs, propiedades. Valida o corrige una nota | `[reference\|check <archivo>\|fix <archivo>]` |
476
+ | `/obsidian-bases` | Archivos .base: vistas, filtros, formulas y summaries. Incluye migracion desde Dataview | `[create <desc>\|explain <archivo>\|migrate <query>]` |
477
+ | `/obsidian-canvas` | Archivos .canvas (JSON Canvas): nodos, grupos y edges con direccion y color | `[create <desc>\|explain <archivo>\|edit <archivo>]` |
478
+
479
+ ---
480
+
458
481
  ## E-Commerce (12 skills)
459
482
 
460
483
  | Skill | Descripcion | Uso |
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## What is Arcane?
4
4
 
5
- Arcane is a configuration harness for [Claude Code](https://docs.anthropic.com/en/docs/claude-code). It provides a curated library of **337 skills**, **87 agents**, **15 hooks**, and **20 rules** that you selectively deploy into any project. Instead of shipping everything to every project (wasting tokens and degrading performance), you pick a **profile** that matches your stack and only the relevant tools get installed.
5
+ Arcane is a configuration harness for [Claude Code](https://docs.anthropic.com/en/docs/claude-code). It provides a curated library of **375 skills**, **92 agents**, **16 hooks**, and **25 rules** that you selectively deploy into any project. Instead of shipping everything to every project (wasting tokens and degrading performance), you pick a **profile** that matches your stack and only the relevant tools get installed.
6
6
 
7
7
  ## Table of Contents
8
8
 
@@ -536,7 +536,7 @@ Yes, and it's recommended. This way everyone on the team gets the same Claude Co
536
536
 
537
537
  ### How many tokens does a profile consume?
538
538
 
539
- Each skill adds ~30-100 tokens to the system prompt. A typical base profile (20-30 skills) adds ~1-2k tokens. The core profile adds ~500 tokens. Compare that to loading all 333 skills, which is why selective deploy matters.
539
+ Each skill adds ~30-100 tokens to the system prompt. A typical base profile (20-30 skills) adds ~1-2k tokens. The core profile adds ~500 tokens. Compare that to loading all 375 skills, which is why selective deploy matters.
540
540
 
541
541
  ### Why replace instead of merge on install?
542
542
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-arcane",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Skills, agents, hooks and rules for Claude Code — installable via npx arcane",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,37 @@
1
+ name: second-brain
2
+ description: "Second Brain — vault de Obsidian gestionado con Claude Code: captura sin friccion, reviews diario/semanal/mensual, notas atomicas y hub files (PARA + Zettelkasten), busqueda con ranking, captura web, auditoria de salud del vault y sintaxis nativa de Obsidian (markdown, Bases, Canvas)"
3
+ type: addon
4
+
5
+ skills:
6
+ - second-brain
7
+ - brain-dump
8
+ - review-dump
9
+ - review-weekly
10
+ - review-monthly
11
+ - zettel
12
+ - hub-note
13
+ - vault-recall
14
+ - vault-clip
15
+ - vault-audit
16
+ - vault-tidy
17
+ - obsidian-markdown
18
+ - obsidian-bases
19
+ - obsidian-canvas
20
+
21
+ rules:
22
+ universal:
23
+ - vault-conventions
24
+ gamedev:
25
+ []
26
+
27
+ agents:
28
+ []
29
+
30
+ permissions:
31
+ allow:
32
+ - "Bash(python *vault_audit.py*)"
33
+ - "Bash(python3 *vault_audit.py*)"
34
+ - "Bash(python *vault_index.py*)"
35
+ - "Bash(python3 *vault_index.py*)"
36
+ deny:
37
+ []
@@ -0,0 +1,144 @@
1
+ # Vault Conventions Rule (second brain en Obsidian)
2
+
3
+ Reglas que gobiernan toda escritura dentro de un vault de Obsidian. Existen porque un agente que escribe notas sin restricciones degrada el vault mas rapido de lo que lo construye: linkea todo con todo, arrastra tareas en silencio y renombra archivos rompiendo `[[wikilinks]]`.
4
+
5
+ Las rutas son relativas al vault (`--vault`, env `OBSIDIAN_VAULT`, o el directorio actual si contiene `.obsidian/`).
6
+
7
+ ## Cuando aplica
8
+
9
+ - Cualquier skill del profile `second-brain` que cree o edite notas.
10
+ - Cualquier escritura en un directorio que contenga `.obsidian/`, incluso desde otro skill.
11
+ - NO aplica a los archivos de configuracion del vault (`.obsidian/**`): no se tocan nunca sin pedido explicito del usuario.
12
+
13
+ ## Quién escribe cada archivo
14
+
15
+ Antes de tocar cualquier cosa, la pregunta es de quién es ese archivo. Hay tres clases y el permiso de escritura es distinto en cada una. Adaptado de la distinción **autorado / proyectado** de la base de conocimiento de producto de Educabot, que es la que hace que un agente y una persona escriban en el mismo repositorio sin pisarse.
16
+
17
+ | Clase | Quién escribe | Qué puede hacer el agente | Ejemplos |
18
+ |---|---|---|---|
19
+ | **Autorado** | La persona. Cambia lento | **Nada sin approval.** Ni reformatear, ni "mejorar" | Dumps, notas atómicas, hubs, clips, proyectos, el `CLAUDE.md` del vault, la sección `## Reflexión` de los reviews |
20
+ | **Sintetizado** | El agente, con approval, y queda como nota permanente | Proponer y escribir tras el OK. Idempotente: correr dos veces no duplica | Dailies, weeklies, monthlies, el `## Historial` de un hub |
21
+ | **Proyectado** | El agente, sin preguntar. Derivado y descartable | Reescribir completo cuando corresponda | `hot.md`, el índice `.vault-index.json`, las vistas `.base` |
22
+
23
+ Tres consecuencias que resuelven las dudas que aparecen en la práctica:
24
+
25
+ - **Lo proyectado no se edita a mano.** Si el usuario lo edita, el próximo review lo pisa. Por eso `hot.md` lleva la advertencia adentro.
26
+ - **Lo proyectado no es fuente de verdad.** Si contradice a una nota, la nota gana. Se puede borrar sin perder nada.
27
+ - **Lo autorado no se toca ni para arreglarlo.** Si una nota del usuario tiene el frontmatter roto, se propone el arreglo; no se aplica solo. La excepción son las categorías que `/vault-tidy` aplica con approval item por item.
28
+
29
+ Si no sabés en qué clase cae un archivo, es autorado. El default es no escribir.
30
+
31
+ ## El vault apunta, no copia
32
+
33
+ Cuando algo ya tiene una fuente de verdad afuera, el vault guarda **el puntero y el porqué**, nunca una copia:
34
+
35
+ | Contenido | Fuente de verdad | En el vault |
36
+ |---|---|---|
37
+ | Código y arquitectura | El repo | `repos:` en el frontmatter, y `codebases.md` con el path local |
38
+ | Tickets, estados, sprints | Jira, ClickUp, Linear | Link, y la decisión que salió de ahí |
39
+ | Diseños | Figma | Link en la nota del tema |
40
+ | Artículos, papers | La web | El clip, con `source:` y **tu** resumen |
41
+
42
+ Una copia se desactualiza en silencio y después hay dos verdades y ninguna gana. Lo que sí acumula el vault es lo que ninguna de esas fuentes tiene: **qué decidiste, por qué, y qué aprendiste**. Eso no vive en Jira ni en el código.
43
+
44
+ ## Resolución de rutas: roles, no carpetas
45
+
46
+ Ningún skill escribe en una ruta literal. Escribe en un **rol**, y el `## Rutas` del `CLAUDE.md` del vault dice qué carpeta es ese rol en este vault. Es lo que hace que un vault adoptado con otra estructura funcione sin tocar los skills.
47
+
48
+ | Rol | Qué contiene | Default del `setup` |
49
+ |---|---|---|
50
+ | `inbox` | captura cruda del día | `_inbox` |
51
+ | `daily` | síntesis diaria | `Reflect/Daily` |
52
+ | `weekly` | retrospectiva semanal | `Reflect/Weekly` |
53
+ | `monthly` | balance mensual | `Reflect/Monthly` |
54
+ | `atomic` | notas atómicas | `03_Resources` |
55
+ | `hubs` | hub files por entidad | `Hubs` |
56
+ | `projects` | proyectos con deadline | `01_Projects` |
57
+ | `areas` | responsabilidades continuas | `02_Areas` |
58
+ | `archive` | cerrado, nunca borrado | `04_Archive` |
59
+ | `templates` | plantillas del usuario | `Templates` |
60
+
61
+ Orden de resolución, sin excepciones:
62
+
63
+ 1. El `## Rutas` del `CLAUDE.md` del vault.
64
+ 2. Si el vault no lo declara, el default de la tabla, **avisándole al usuario que se está asumiendo**.
65
+ 3. Si el rol no existe en este vault (no todos tienen `areas`), preguntar antes de crear la carpeta.
66
+
67
+ Los scripts reciben el mapeo por flag (`--role hubs=People`), nunca lo adivinan. **Si el `CLAUDE.md` del vault declara rutas distintas del default y un skill escribe en el default igual, eso es un bug del skill, no una preferencia.**
68
+
69
+ ## Las tres reglas de estructura
70
+
71
+ ### 1. Los links van hacia arriba, nunca hacia abajo
72
+
73
+ Cada nota linkea a su contexto, no a su detalle:
74
+
75
+ | Desde | Linkea a | Nunca a |
76
+ |---|---|---|
77
+ | Nota de `_inbox/` (dump) | hub files, proyectos, areas | otros dumps |
78
+ | Daily | el dump del dia, notas creadas ese dia | otros dailies |
79
+ | Weekly | los dailies de la semana | notas atomicas sueltas |
80
+ | Monthly | los weeklies del mes | dailies |
81
+ | Hub file | notas atomicas y proyectos del tema | dumps ni dailies |
82
+
83
+ Sin esta regla el agente crea links bidireccionales en todas las direcciones y el grafo se vuelve ruido: cada nota apunta a todo y ninguna relacion significa nada. Los backlinks de Obsidian ya dan la direccion inversa gratis, no hay que escribirla.
84
+
85
+ ### 2. Ninguna nota se cierra sin al menos un `[[wikilink]]`
86
+
87
+ Es la unica regla que previene las huerfanas de raiz. Si al terminar una nota no hay a que linkearla, esa es la senal de que falta un hub file: crear el hub (ver `/hub-note`) antes de cerrar la nota, o dejarla en `_inbox/` en vez de archivarla en `03_Resources/`.
88
+
89
+ Excepcion: los dumps crudos de `_inbox/` pueden nacer sin links, porque los agrega `/review-dump`.
90
+
91
+ ### 3. Las tareas no hechas no se arrastran en silencio
92
+
93
+ Una tarea abierta en el dump del lunes que sigue abierta el martes **se queda en el lunes**, marcada como cancelada (`- [-]`), y se crea de nuevo en el martes. No se mueve.
94
+
95
+ No haber hecho algo un dia determinado es informacion. Arrastrar la tarea hacia adelante produce una lista limpia y una historia falsa.
96
+
97
+ ## Que no puede hacer el agente
98
+
99
+ - **Nunca borrar una nota.** Mover a `04_Archive/` preservando el nombre. El borrado es decision del usuario, siempre.
100
+ - **Nunca renombrar ni mover una nota sin approval explicito.** Rompe `[[wikilinks]]` en silencio: Obsidian solo los actualiza cuando el rename ocurre dentro de la app.
101
+ - **Nunca editar en masa.** Una corrida toca las notas de esa corrida. Los cambios que afectan a muchas notas se proponen como plan y los aplica `/vault-tidy` con approval item por item.
102
+ - **Nunca tocar `Templates/`** salvo pedido explicito: son el contrato del usuario, no del agente.
103
+ - **Nunca reescribir la seccion de reflexion del usuario.** Los reviews sintetizan hechos; la interpretacion la escribe el usuario.
104
+
105
+ ## Contrato de frontmatter
106
+
107
+ Todo campo que un skill escriba tiene que estar declarado en el `CLAUDE.md` del vault. Un campo que no esta en el contrato no se inventa: se propone y se agrega al contrato primero.
108
+
109
+ Minimo por tipo de nota:
110
+
111
+ ```yaml
112
+ ---
113
+ created: 2026-07-27 # ISO, nunca se reescribe
114
+ type: daily # daily | weekly | monthly | dump | atomic | hub | project | area | clip
115
+ tags: []
116
+ ---
117
+ ```
118
+
119
+ Los tipos con campos propios (`status` en proyectos, `source` en clips) los declara el skill que los crea.
120
+
121
+ ## Convenciones de escritura
122
+
123
+ - Nada de guiones largos: si un texto generado trae em-dash o en-dash, normalizar a `-` antes de escribir.
124
+ - `[[wikilinks]]` para todo lo interno, `[texto](url)` solo para URLs externas. Obsidian trackea renames de wikilinks, no de markdown links.
125
+ - Fechas ISO (`YYYY-MM-DD`) en frontmatter y en nombres de archivo de notas periodicas.
126
+ - Una idea por nota atomica. Si una nota necesita dos titulos de nivel `##` que no se relacionan, son dos notas.
127
+
128
+ ## La estructura no la sostiene este archivo
129
+
130
+ Una convención que solo vive en un documento se muere en tres meses. Lo que la sostiene es lo que corre:
131
+
132
+ | Convención | Qué la hace cumplir |
133
+ |---|---|
134
+ | Frontmatter completo, notas con al menos un link | El hook `PostToolUse` de `second-brain`, al escribir |
135
+ | Huérfanas, links roto, nombres duplicados, semillas que no crecen | `/vault-audit`, cada vez que se corre |
136
+ | Contradicciones sin resolver | `status: contested`, que el audit lista y el monthly mira |
137
+ | Rutas por rol | El `## Rutas` del contrato, que los skills leen antes de escribir |
138
+ | Tareas que no se arrastran | El paso de tareas de `/review-dump`, y `stale_open_tasks` en el audit |
139
+
140
+ Si una regla nueva de este archivo no tiene una columna derecha, es una intención, no una regla. Antes de agregarla, preguntá qué la va a hacer cumplir.
141
+
142
+ ## Git como red de seguridad
143
+
144
+ El vault deberia ser un repo git. Antes de una corrida que escribe varias notas (`/review-dump`, `/vault-tidy`), verificar que el arbol este limpio y avisar al usuario si no lo esta. Es lo que permite deshacer una corrida completa sin revisar nota por nota.
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: brain-dump
3
+ description: "Captura sin friccion al dump del dia en el vault de Obsidian: tareas, ideas, links, transcripciones. Sin tags, sin decidir donde va. Triggers: anota, capturar, brain dump, tirame esto al vault, apunta esto, agregar al inbox, dump del dia."
4
+ argument-hint: "[texto a capturar]"
5
+ category: "pkm"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Write, Edit
8
+ ---
9
+
10
+ # Brain Dump - Captura sin fricción
11
+
12
+ Agregás lo que el usuario te pasa al dump del día y te callás. Este skill existe para que capturar cueste cero: el momento en que el usuario tiene que pensar "¿dónde va esto?", el sistema ya falló.
13
+
14
+ Contenido a capturar: `$ARGUMENTS`
15
+
16
+ Aplica la rule `vault-conventions`.
17
+
18
+ **Rutas por rol:** el destino se nombra por rol (`inbox`, `templates`), y la ruta real sale del `## Rutas` del `CLAUDE.md` del vault. Los defaults entre paréntesis solo aplican si el vault no declara otra cosa.
19
+
20
+ ## Pasos
21
+
22
+ 1. **Ubicar el vault.** Flag `--vault <path>`, env `OBSIDIAN_VAULT`, o el directorio actual si contiene `.obsidian/`. Si no hay vault, decirlo en una línea y ofrecer `/second-brain setup`. No inventar una carpeta.
23
+
24
+ 2. **Resolver el rol `inbox`.** Leer el `## Rutas` del `CLAUDE.md` del vault. Es lo único que hace falta leer del contrato acá, y cuesta una lectura: escribir en `_inbox/` cuando el vault usa otra carpeta deja la captura en un lugar que ningún review va a mirar. Si el vault no tiene `CLAUDE.md`, usar el default y avisar en la misma línea de confirmación.
25
+
26
+ 3. **Abrir el dump de hoy.** `<inbox>/YYYY-MM-DD dump.md` (default `_inbox/`) con la fecha de hoy. El dump se llama `YYYY-MM-DD dump.md` y no `YYYY-MM-DD.md` a propósito: el daily de ese día ya se llama `YYYY-MM-DD.md`, y dos archivos con el mismo nombre hacen que `[[2026-07-28]]` resuelva de forma impredecible en todo el vault. Es la colisión que el audit reporta como `ambiguous_names`, y sin el sufijo pasaría todos los días. Si el vault ya tiene dumps con el nombre viejo, seguir su convención y avisarlo, en vez de partir la serie en dos.
27
+
28
+ Si no existe, crearlo desde `<templates>/Dump.md` (default `Templates/`), o con el frontmatter mínimo `created`, `type: dump`, `tags: []` si el template no está.
29
+
30
+ 4. **Agregar el contenido al final**, una línea por cosa, sin reordenar ni reescribir lo que ya había:
31
+ - Lo que suena a tarea va como `- [ ] <texto>`. Lo que suena a idea, nota o link va como `- <texto>`.
32
+ - URLs sueltas se dejan crudas, con el título de la página al lado solo si el usuario lo dio. No abrir la URL: eso es `/vault-clip`.
33
+ - Se preserva la redacción del usuario. No corregís su ortografía ni su registro, no resumís, no traducís.
34
+
35
+ 5. **Si no vino contenido en `$ARGUMENTS`**, preguntar qué capturar en una sola línea y esperar. No abrir un cuestionario.
36
+
37
+ 6. **Confirmar en una línea** qué se agregó y a qué archivo. Nada más: el usuario está en medio de otra cosa.
38
+
39
+ ## Approval
40
+
41
+ La invocación del skill es la aprobación para agregar al dump de hoy: pedir confirmación en cada captura destruiría el punto del skill. Los límites son estrictos en cambio para todo lo demás: **pedí approval explícito antes de escribir fuera del rol `inbox`**, antes de editar líneas que ya estaban en el dump, y antes de crear cualquier nota en los roles `atomic` o `hubs`. Clasificar es trabajo de `/review-dump`, no de acá.
42
+
43
+ ## Reglas
44
+
45
+ - No clasificar, no taggear, no linkear, no crear notas nuevas. Nada de eso pasa en la captura.
46
+ - No juzgar el contenido ni sugerir mejoras. Es un dump, no un borrador.
47
+ - Nunca reescribir ni reordenar lo que ya estaba en el archivo: solo append.
48
+ - Sin guiones largos en lo que agregues de tu parte.
49
+ - Si el usuario captura algo que claramente es una tarea de un proyecto que existe, **igual va al dump**. La ruteada la hace el review, así el usuario nunca decide en el momento.
50
+
51
+ ## Handoff
52
+
53
+ Captura COMPLETE cuando el contenido está en el dump del día. A la noche, o cuando el usuario quiera cerrar el día, el siguiente paso es `/review-dump` para clasificar todo lo capturado y generar el daily.
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: hub-note
3
+ description: "Crea o actualiza un hub file (MOC) del vault: una nota por entidad que importa (persona, herramienta, concepto, empresa) que acumula conocimiento y conecta PARA con Zettelkasten. Triggers: hub file, MOC, mapa de contenido, nota de entidad, crear hub de, actualizar hub, nota de persona."
4
+ argument-hint: "[entidad] [--update]"
5
+ category: "pkm"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit
8
+ ---
9
+
10
+ # Hub Note - Tejido conectivo del vault
11
+
12
+ Un hub file es una nota por entidad que importa. No contiene conocimiento propio: contiene **el estado actual** de esa entidad y **los links** a todo lo que se sabe de ella. Es lo que hace que PARA (carpetas) y Zettelkasten (notas planas) convivan sin pelearse.
13
+
14
+ Entidad: `$ARGUMENTS`
15
+
16
+ Aplica la rule `vault-conventions`.
17
+
18
+ **Rutas por rol:** los destinos se nombran por rol y la ruta real de cada uno sale del `## Rutas` del `CLAUDE.md` del vault (leelo antes de escribir). Los defaults entre paréntesis solo aplican si el vault no declara otra cosa.
19
+
20
+ ## Fase 1 - Decidir si la entidad merece hub
21
+
22
+ El criterio es la recurrencia, no la importancia: **la entidad apareció en tres dumps o notas distintas**. Antes de eso es una mención, y un hub por mención produce cientos de notas de una línea que nadie visita.
23
+
24
+ 1. Buscar la entidad con `/vault-recall` si está disponible, o `Grep` en los roles `inbox`, `daily` y `atomic` (defaults `_inbox/`, `Reflect/Daily/`, `03_Resources/`) por el nombre y sus variantes.
25
+ 2. Contar apariciones y reportarlas con los links.
26
+ 3. Si hay menos de tres, decirlo y proponer esperar. Si el usuario quiere el hub igual (una persona nueva en el equipo, un proyecto que arranca), se crea: la anticipación es un motivo válido, la duda no.
27
+
28
+ Verdict: PASS si hay tres apariciones o una razón explícita del usuario.
29
+
30
+ ## Fase 2 - Buscar el hub existente
31
+
32
+ `Glob` en `<hubs>` (default `Hubs/`) y revisar los `aliases` del frontmatter de los hubs que haya. Las entidades llegan con nombres distintos ("Educabot", "educabot", "EB"): si ya existe un hub para la entidad bajo otro nombre, **actualizar ese** y agregar el nombre nuevo a `aliases`. Nunca crear un segundo hub para la misma entidad: es el duplicado más caro del vault, porque parte el conocimiento en dos lugares que nadie reconcilia.
33
+
34
+ ## Fase 3 - Escribir
35
+
36
+ Con approval, crear o actualizar el hub en `<hubs>` (default `Hubs/`) desde `<templates>/Hub.md`.
37
+
38
+ Al **crear**:
39
+ - Título: el nombre canónico de la entidad. Las variantes van a `aliases`.
40
+ - Una o dos líneas de qué es y por qué tiene nota propia.
41
+ - `## Estado actual`: lo que hay que saber hoy.
42
+ - `## Notas`: links a las notas atómicas y proyectos del tema que ya existan (los que encontraste en la fase 1).
43
+ - `## Historial`: una línea por aparición relevante, formato `- YYYY-MM-DD - qué pasó`, lo más nuevo arriba.
44
+ - `status`: `seed` al crearlo, `provisional` cuando ya acumuló contenido. Un hub que el usuario mantiene al día puede quedar `evergreen`, pero lo marca él.
45
+ - `repos:` si la entidad tiene código (una herramienta propia, un proyecto, un servicio). Es el puente al repo, y se traduce a path local en `codebases.md` del vault. **No copies arquitectura al hub:** el hub dice qué es y por qué, el repo dice cómo está hecho, y el que copia se desactualiza.
46
+
47
+ Al **actualizar** (`--update`, o cuando el hub ya existe):
48
+ - Agregar la entrada nueva al `## Historial`, sin duplicar una que ya esté con la misma fecha y el mismo contenido.
49
+ - **`## Estado actual` se reescribe, no se acumula.** Es la sección que responde "qué sé hoy de esto"; si se convierte en un log, el hub deja de servir para lo único que sirve. Lo que se reemplaza y sigue siendo relevante baja al historial.
50
+ - `## Notas`: agregar los links nuevos.
51
+
52
+ ## Fase 4 - Conectar
53
+
54
+ - El hub linkea hacia las notas atómicas y los proyectos. Los dumps y dailies linkean **hacia** el hub. El hub no linkea a dumps ni a dailies: son registro, no conocimiento, y llenan el hub de ruido en un mes.
55
+ - Si el hub cubre un tema amplio y ya pasó las 30 o 40 entradas en `## Notas`, proponer partirlo en sub-hubs por subtema. Un hub que nadie puede leer de arriba a abajo dejó de ser un mapa.
56
+
57
+ Hub COMPLETE cuando tiene estado actual, al menos un link saliente, y las apariciones encontradas quedaron en el historial.
58
+
59
+ ## Reglas
60
+
61
+ - Un hub por entidad. Los alias van al frontmatter, no a un hub nuevo.
62
+ - El hub no acumula conocimiento propio: si querés explicar una idea, es una nota atómica (`/zettel`) linkeada desde acá.
63
+ - Nunca borrar entradas del historial: si algo dejó de ser cierto, se agrega la entrada nueva.
64
+ - Sin guiones largos.
65
+
66
+ ## Handoff
67
+
68
+ Con el hub listo, el siguiente paso es `/zettel` para las ideas del tema que todavía no tienen nota propia, o volver a `/review-dump` si esto salió procesando el día. `/vault-audit` va a usar los hubs para distinguir una huérfana real de una nota que simplemente todavía no fue linkeada.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: obsidian-bases
3
+ description: "Crea y edita archivos .base de Obsidian: vistas table/cards/list/map, filtros, formulas y summaries sobre las propiedades de las notas. Incluye migracion desde queries de Dataview. Triggers: obsidian bases, archivo .base, base de datos en obsidian, vista de notas, dashboard obsidian, migrar dataview."
4
+ argument-hint: "[create <descripcion> | explain <archivo.base> | migrate <query dataview>]"
5
+ category: "pkm"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit
8
+ ---
9
+
10
+ # Obsidian Bases - Vistas nativas
11
+
12
+ Bases es el core plugin de Obsidian (1.9+) que convierte las propiedades de las notas en tablas y cards vivas. No se instala nada. Adaptado de `kepano/obsidian-skills` al formato de este repo.
13
+
14
+ Modo: `$ARGUMENTS`
15
+
16
+ La referencia completa de sintaxis está en `references/bases-syntax.md`. Leela antes de escribir un `.base`: la mitad de los errores son de quoting de YAML, no de lógica.
17
+
18
+ ## Fase 1 - Verificar que Bases esté disponible
19
+
20
+ Leer `.obsidian/core-plugins.json` del vault. Si `bases` no está habilitado, decirlo y ofrecer las dos salidas: habilitarlo (es core, no requiere instalar) o resolver la vista con una tabla markdown estática. **Nunca escribir un `.base` en un vault que no lo tiene habilitado:** queda como un archivo que Obsidian muestra en crudo.
21
+
22
+ ## Fase 2 - Modos
23
+
24
+ ### `create` - Vista nueva
25
+ 1. Entender qué pregunta responde la vista. Una vista sin pregunta concreta termina siendo una tabla de todo el vault que nadie mira.
26
+ 2. **Verificar que las propiedades existan**: `Grep` en el frontmatter del vault por los campos que vas a filtrar. Filtrar por una propiedad que ninguna nota declara produce una vista vacía y parece un bug de Bases.
27
+ 3. Escribir el `.base` en `Bases/`, con approval antes de crear el archivo.
28
+ 4. Avisar que hay que abrirlo en Obsidian para confirmar que renderiza: la sintaxis se valida ahí, no acá.
29
+
30
+ ### `explain` - Leer un `.base` existente
31
+ Traducir el archivo a lenguaje llano: qué notas entran, qué columnas muestra, qué calcula cada fórmula. Read-only.
32
+
33
+ ### `migrate` - Desde Dataview
34
+ Traducir la query, y **decir explícitamente qué no se puede traducir**. Bases no cubre campos inline (`campo:: valor` en medio de la nota) ni texto computado ni `dataviewjs`. Si la query depende de eso, la respuesta honesta es que se quede en Dataview: una migración a medias deja al usuario con una vista que miente.
35
+
36
+ ## Estructura de un `.base`
37
+
38
+ ```yaml
39
+ filters:
40
+ and:
41
+ - file.inFolder("03_Resources")
42
+ - 'type == "atomic"'
43
+
44
+ formulas:
45
+ edad_dias: '(now() - file.mtime).days'
46
+
47
+ properties:
48
+ formula.edad_dias:
49
+ displayName: "Dias sin tocar"
50
+
51
+ views:
52
+ - type: table
53
+ name: "Notas atomicas"
54
+ filters:
55
+ not:
56
+ - file.hasTag("archivada")
57
+ order:
58
+ - file.name
59
+ - created
60
+ - formula.edad_dias
61
+ summaries:
62
+ formula.edad_dias: Average
63
+ ```
64
+
65
+ Los cinco bloques top-level son `filters`, `formulas`, `properties`, `summaries` y `views`. Los filtros globales aplican a todas las vistas; cada vista puede agregar los suyos.
66
+
67
+ ## Los tres errores que se repiten
68
+
69
+ 1. **Quoting de YAML.** Cualquier expresión con `:`, `{`, `}`, `[`, `]` va entre comillas. Si la expresión ya tiene comillas dobles adentro, el string va en comillas simples: `'if(done, "Si", "No")'`.
70
+ 2. **Duraciones.** Restar dos fechas da una `Duration`, no un número: hay que acceder al campo antes de operar (`.days`, `.hours`). `round(now() - file.mtime)` falla; `(now() - file.mtime).days` funciona.
71
+ 3. **Nulls.** Una propiedad ausente rompe la fórmula. Envolver en `if(propiedad, ...)` cuando el campo puede faltar, que en un vault real es casi siempre.
72
+
73
+ Una fórmula referenciada en `order` que no está declarada en `formulas` falla en silencio: la columna simplemente no aparece.
74
+
75
+ ## Reglas
76
+
77
+ - `file.backlinks` es caro: no lo pongas en una vista que se abre seguido.
78
+ - No crear una vista que dependa de una propiedad que el vault todavía no usa: primero se agrega al contrato de frontmatter del `CLAUDE.md`.
79
+ - Un `.base` por pregunta. Un archivo con ocho vistas es un dashboard que nadie lee.
80
+ - Pedí approval antes de escribir o sobrescribir un `.base`.
81
+ - Sin guiones largos.
82
+
83
+ ## Handoff
84
+
85
+ Base READY cuando el archivo existe y el usuario confirmó que renderiza en Obsidian. Si la vista necesitaba campos que las notas no tienen, el siguiente paso es actualizar el contrato de frontmatter con `/second-brain` y completar las notas con `/vault-tidy frontmatter`.
@@ -0,0 +1,123 @@
1
+ # Bases Syntax Reference
2
+
3
+ Referencia de la sintaxis de los archivos `.base` de Obsidian (core plugin, 1.9+). Fuente: `https://obsidian.md/help/bases/syntax`.
4
+
5
+ ## Bloques top-level
6
+
7
+ | Bloque | Qué hace |
8
+ |---|---|
9
+ | `filters` | Condiciones globales, aplican a todas las vistas. Opcional. |
10
+ | `formulas` | Propiedades calculadas, disponibles en todas las vistas. |
11
+ | `properties` | Configuración de display de una propiedad (`displayName`). |
12
+ | `summaries` | Fórmulas de agregación propias. |
13
+ | `views` | Lista de vistas: cómo se renderizan los datos. |
14
+
15
+ Sin `filters`, la base incluye **todos** los archivos del vault.
16
+
17
+ ## Filtros
18
+
19
+ Un objeto de filtro contiene `and`, `or` o `not`, y cada uno una lista de objetos de filtro o de statements (strings). Se anidan.
20
+
21
+ ```yaml
22
+ filters:
23
+ or:
24
+ - file.hasTag("tag")
25
+ - and:
26
+ - file.hasTag("book")
27
+ - file.hasLink("Textbook")
28
+ - not:
29
+ - file.hasTag("book")
30
+ - file.inFolder("Required Reading")
31
+ ```
32
+
33
+ Operadores:
34
+
35
+ - Aritméticos: `+`, `-`, `*`, `/`, `%`, `()`
36
+ - Comparación: `==`, `!=`, `>`, `<`, `>=`, `<=`
37
+ - Booleanos: `!`, `&&`, `||`
38
+ - Fechas: sumar o restar duraciones con `+` y `-`. Unidades: `y/year/years`, `M/month/months`, `w/week/weeks`, `d/day/days`, `h/hour/hours`, `m/minute/minutes`, `s/second/seconds`
39
+
40
+ ## Propiedades
41
+
42
+ Tres orígenes:
43
+
44
+ | Forma | Origen |
45
+ |---|---|
46
+ | `note.propiedad` o `propiedad` | frontmatter de la nota |
47
+ | `file.*` | metadata del archivo |
48
+ | `formula.nombre` | fórmula declarada en `formulas` |
49
+
50
+ Propiedades de archivo: `file.name`, `file.path`, `file.folder`, `file.ext`, `file.size`, `file.ctime`, `file.mtime`, `file.tags`, `file.links`, `file.embeds`, `file.backlinks`.
51
+
52
+ `file.backlinks` es costoso de calcular: evitarlo en vistas de uso frecuente.
53
+
54
+ Tipos de dato: strings (entre comillas), números, booleanos (`true`/`false`), fechas, duraciones, objetos, listas, y files/links.
55
+
56
+ ## Fórmulas
57
+
58
+ ```yaml
59
+ formulas:
60
+ formatted_price: 'if(price, price.toFixed(2) + " dollars")'
61
+ ppu: "(price / age).toFixed(2)"
62
+ ```
63
+
64
+ Funciones habituales: `if()`, `date()`, `now()`, `duration()`, además de los métodos de cada tipo (`toFixed`, `round`, `mean`).
65
+
66
+ Tres trampas:
67
+
68
+ 1. **Duraciones:** una resta de fechas devuelve `Duration`. Hay que acceder al campo numérico antes de operar: `(now() - file.mtime).days`, no `round(now() - file.mtime)`.
69
+ 2. **Nulls:** una propiedad ausente rompe la fórmula. Envolver en `if(propiedad, ...)`.
70
+ 3. **Referencias:** una `formula.x` usada en `order` pero no declarada en `formulas` falla en silencio, la columna no aparece.
71
+
72
+ ## Vistas
73
+
74
+ ```yaml
75
+ views:
76
+ - type: table
77
+ name: "My table"
78
+ limit: 10
79
+ groupBy:
80
+ property: note.age
81
+ direction: DESC
82
+ filters:
83
+ and:
84
+ - 'status != "done"'
85
+ - or:
86
+ - "formula.ppu > 5"
87
+ - "price > 2.1"
88
+ order:
89
+ - file.name
90
+ - note.age
91
+ - formula.ppu
92
+ summaries:
93
+ formula.ppu: Average
94
+ ```
95
+
96
+ Claves de una vista: `type`, `name`, `limit`, `groupBy`, `filters`, `order`, `summaries`.
97
+
98
+ Tipos: `table` (columnas), `cards` (galería), `list` (lista simple), `map` (geográfico).
99
+
100
+ ## Summaries por default
101
+
102
+ - Numéricos: Average, Min, Max, Sum, Range, Median, Stddev
103
+ - Fechas: Earliest, Latest
104
+ - Booleanos: Checked, Unchecked
105
+ - Cualquier tipo: Empty, Filled, Unique
106
+
107
+ Propios:
108
+
109
+ ```yaml
110
+ summaries:
111
+ customAverage: 'values.mean().round(3)'
112
+ ```
113
+
114
+ ## Quoting de YAML
115
+
116
+ Cualquier expresión que contenga `:`, `{`, `}`, `[`, `]` va entre comillas. Si la expresión tiene comillas dobles adentro, el string va entre comillas simples:
117
+
118
+ ```yaml
119
+ formulas:
120
+ label: 'if(done, "Yes", "No")'
121
+ ```
122
+
123
+ Es la causa número uno de un `.base` que no carga.