claude-code-arcane 2.0.0 → 2.2.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 (86) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +6 -4
  3. package/agents/audio/audio-director.md +90 -0
  4. package/agents/audio/audio-programmer.md +97 -0
  5. package/agents/audio/audio-qa.md +95 -0
  6. package/agents/audio/composer.md +88 -0
  7. package/agents/audio/technical-sound-designer.md +90 -0
  8. package/agents/audio/voice-director.md +96 -0
  9. package/docs/SKILLS-CATALOG.md +45 -2
  10. package/docs/USER-GUIDE.md +2 -2
  11. package/package.json +1 -1
  12. package/profiles/audio.yaml +45 -0
  13. package/profiles/second-brain.yaml +37 -0
  14. package/rules/gamedev/audio-code.md +45 -0
  15. package/rules/vault-conventions.md +144 -0
  16. package/skills/adaptive-music/SKILL.md +171 -0
  17. package/skills/adaptive-music/references/anti-patterns.md +53 -0
  18. package/skills/audio-audit/SKILL.md +164 -0
  19. package/skills/audio-audit/references/anti-patterns.md +65 -0
  20. package/skills/audio-audit/scripts/check_assets.py +208 -0
  21. package/skills/audio-bible/SKILL.md +119 -0
  22. package/skills/audio-bible/references/anti-patterns.md +39 -0
  23. package/skills/audio-mix/SKILL.md +151 -0
  24. package/skills/audio-mix/references/anti-patterns.md +65 -0
  25. package/skills/audio-spec/SKILL.md +107 -0
  26. package/skills/audio-spec/references/anti-patterns.md +45 -0
  27. package/skills/brain-dump/SKILL.md +53 -0
  28. package/skills/hub-note/SKILL.md +68 -0
  29. package/skills/middleware-integration/SKILL.md +186 -0
  30. package/skills/middleware-integration/references/anti-patterns.md +69 -0
  31. package/skills/midi-compose/SKILL.md +136 -0
  32. package/skills/midi-compose/references/smf-format.md +129 -0
  33. package/skills/midi-compose/scripts/compose_midi.py +326 -0
  34. package/skills/midi-compose/templates/example-composition.json +69 -0
  35. package/skills/music-composition/SKILL.md +106 -0
  36. package/skills/music-composition/references/form.md +57 -0
  37. package/skills/music-composition/references/game-music.md +82 -0
  38. package/skills/music-composition/references/harmony.md +82 -0
  39. package/skills/music-composition/references/melody.md +48 -0
  40. package/skills/music-composition/references/orchestration.md +69 -0
  41. package/skills/music-composition/references/rhythm-groove.md +49 -0
  42. package/skills/obsidian-bases/SKILL.md +85 -0
  43. package/skills/obsidian-bases/references/bases-syntax.md +123 -0
  44. package/skills/obsidian-canvas/SKILL.md +91 -0
  45. package/skills/obsidian-markdown/SKILL.md +110 -0
  46. package/skills/pdf-generator/scripts/fill_inspect.py +2 -0
  47. package/skills/pdf-generator/scripts/render_body.py +2 -0
  48. package/skills/procedural-audio/SKILL.md +157 -0
  49. package/skills/procedural-audio/references/anti-patterns.md +45 -0
  50. package/skills/review-dump/SKILL.md +108 -0
  51. package/skills/review-monthly/SKILL.md +56 -0
  52. package/skills/review-weekly/SKILL.md +91 -0
  53. package/skills/second-brain/SKILL.md +211 -0
  54. package/skills/second-brain/hooks/hooks.json +16 -0
  55. package/skills/second-brain/hooks/validate-note.sh +85 -0
  56. package/skills/second-brain/references/cross-project.md +57 -0
  57. package/skills/second-brain/references/templates/Atomic.md +22 -0
  58. package/skills/second-brain/references/templates/Daily.md +25 -0
  59. package/skills/second-brain/references/templates/Dashboard.base +70 -0
  60. package/skills/second-brain/references/templates/Dump.md +11 -0
  61. package/skills/second-brain/references/templates/Hub.md +22 -0
  62. package/skills/second-brain/references/templates/Monthly.md +29 -0
  63. package/skills/second-brain/references/templates/Weekly.md +29 -0
  64. package/skills/second-brain/references/templates/codebases.md +37 -0
  65. package/skills/second-brain/references/templates/hot.md +37 -0
  66. package/skills/second-brain/references/templates/vault-CLAUDE.md +127 -0
  67. package/skills/sfx-design/SKILL.md +130 -0
  68. package/skills/sfx-design/references/anti-patterns.md +53 -0
  69. package/skills/spatial-audio/SKILL.md +139 -0
  70. package/skills/spatial-audio/references/anti-patterns.md +53 -0
  71. package/skills/ui-sound-design/SKILL.md +133 -0
  72. package/skills/ui-sound-design/references/anti-patterns.md +57 -0
  73. package/skills/vault-audit/SKILL.md +72 -0
  74. package/skills/vault-audit/scripts/vault_audit.py +539 -0
  75. package/skills/vault-clip/SKILL.md +73 -0
  76. package/skills/vault-recall/SKILL.md +82 -0
  77. package/skills/vault-recall/scripts/vault_index.py +626 -0
  78. package/skills/vault-tidy/SKILL.md +76 -0
  79. package/skills/voice-pipeline/SKILL.md +150 -0
  80. package/skills/voice-pipeline/references/anti-patterns.md +69 -0
  81. package/skills/xlsx-generator/scripts/formula_check.py +2 -0
  82. package/skills/xlsx-generator/scripts/libreoffice_recalc.py +2 -0
  83. package/skills/xlsx-generator/scripts/xlsx_add_column.py +2 -0
  84. package/skills/xlsx-generator/scripts/xlsx_insert_row.py +2 -0
  85. package/skills/xlsx-generator/scripts/xlsx_reader.py +2 -0
  86. package/skills/zettel/SKILL.md +66 -0
@@ -0,0 +1,82 @@
1
+ # Armonía
2
+
3
+ ## Armonía funcional
4
+
5
+ Tres funciones, y todo lo demás es sustitución o adorno:
6
+
7
+ | Función | Grados (mayor) | Efecto |
8
+ |---|---|---|
9
+ | **Tónica** | I, vi, iii | Reposo, llegada |
10
+ | **Subdominante** | IV, ii | Salida, preparación |
11
+ | **Dominante** | V, vii° | Tensión, exige resolución |
12
+
13
+ El movimiento fuerte es subdominante → dominante → tónica. Todo lo demás es demorar, sustituir o negar esa expectativa.
14
+
15
+ **Ritmo armónico** — la velocidad de cambio de acorde es una palanca independiente de la progresión. La misma secuencia a un acorde por compás vs dos por compás cambia la urgencia sin cambiar una nota.
16
+
17
+ ## Cadencias
18
+
19
+ | Cadencia | Movimiento | Efecto |
20
+ |---|---|---|
21
+ | Auténtica perfecta | V → I, con tónica en soprano y bajo | Cierre total |
22
+ | Auténtica imperfecta | V → I invertido o sin tónica arriba | Cierre débil, sigue |
23
+ | Plagal | IV → I | Reposo sin tensión previa; sabor modal/himno |
24
+ | Semicadencia | → V | Pausa abierta, pregunta |
25
+ | Rota | V → vi | Sorpresa, evita el cierre esperado |
26
+ | Suspendida (picardía inversa) | resolución a menor donde se esperaba mayor | Ensombrece |
27
+
28
+ ## Armonía modal
29
+
30
+ Cuando la progresión no quiere funcionalidad, el modo aporta color por su grado característico:
31
+
32
+ | Modo | Grado característico | Carácter |
33
+ |---|---|---|
34
+ | Jónico | — | Neutro, brillante |
35
+ | Dórico | ♮6 (sobre menor) | Menor sin tragedia; folk, aventura |
36
+ | Frigio | ♭2 | Tensión oscura, MENA/flamenco |
37
+ | Lidio | ♯4 | Suspensión luminosa, asombro |
38
+ | Mixolidio | ♭7 | Rock/folk, menos gravedad que jónico |
39
+ | Eólico | ♭6 natural | Menor estándar |
40
+ | Locrio | ♭2 y ♭5 | Inestable, casi inusable como centro |
41
+
42
+ En modal, evitar el V mayor: reintroduce función dominante y colapsa el modo a mayor/menor.
43
+
44
+ ## Armonía cromática
45
+
46
+ - **Acordes prestados** — tomar del menor paralelo en un contexto mayor (♭VI, ♭VII, iv). Ensombrece sin modular
47
+ - **Dominantes secundarias** — V/x tonicaliza cualquier grado. `C - E7 - Am` hace de Am un centro momentáneo
48
+ - **Sustitución tritonal** — reemplazar V7 por el ♭II7. `G7 → D♭7` antes de C: mismo tritono, bajo cromático
49
+ - **Napolitana (♭II)** — color dramático de aproximación a la dominante
50
+ - **Acordes de sexta aumentada** — resolución cromática doble hacia V, muy tensa
51
+
52
+ ## Modulación
53
+
54
+ De más suave a más abrupta:
55
+
56
+ 1. **Directa a tonalidad cercana** (relativo, dominante, subdominante): casi imperceptible
57
+ 2. **Por pivote** — un acorde común a las dos tonalidades reinterpretado. La técnica más limpia
58
+ 3. **Por dominante secundaria** — introducir el V de la nueva tonalidad
59
+ 4. **Cromática por bajo** — mover el bajo por semitonos hasta el nuevo centro
60
+ 5. **Enarmónica** — reinterpretar un acorde ambiguo (disminuido, sexta aumentada) hacia otro lado
61
+ 6. **Truncada / directa lejana** — cortar y arrancar en la nueva tonalidad. Efecto de corte cinematográfico
62
+
63
+ Para juegos, la modulación por pivote es la única que sobrevive a un cambio de estado en tiempo real sin sonar a error.
64
+
65
+ ## Voice leading
66
+
67
+ - Mover cada voz lo mínimo posible; la conducción suave es lo que hace que una progresión "funcione"
68
+ - Resolver las tensiones: 7ª baja por grado, 4ª suspendida baja a 3ª
69
+ - Evitar 5ªs y 8ªs paralelas entre voces exteriores en contexto tonal tradicional (en pop/rock son idiomáticas)
70
+ - Evitar el salto de la voz más aguda junto con el bajo en la misma dirección al llegar a una cadencia
71
+ - Doblar la tónica antes que la 5ª, y la 5ª antes que la 3ª
72
+
73
+ ## Reharmonización
74
+
75
+ Palancas, de menor a mayor impacto:
76
+
77
+ 1. Cambiar inversiones — mismo acorde, bajo distinto
78
+ 2. Agregar extensiones (7, 9, 11, 13) — color sin cambiar función
79
+ 3. Sustituir por función equivalente — I → vi, V → iii
80
+ 4. Insertar dominantes secundarias entre acordes existentes
81
+ 5. Cambiar el modo del acorde — mayor por menor
82
+ 6. Reemplazar la progresión entera manteniendo la melodía: cada nota melódica admite varios acordes
@@ -0,0 +1,48 @@
1
+ # Melodía
2
+
3
+ ## Qué hace que una melodía se pegue
4
+
5
+ Cuatro propiedades, y ninguna es "ser linda":
6
+
7
+ 1. **Perfil reconocible** — la silueta (sube, se sostiene, cae) es identificable sin el ritmo
8
+ 2. **Un gesto memorable** — un salto, una nota fuera de la escala, una síncopa. Un solo evento distintivo, no cinco
9
+ 3. **Repetición con variación** — el oído necesita reconocer antes de que le interese lo nuevo
10
+ 4. **Relación clara con la armonía** — las notas fuertes caen en tiempos fuertes y son consonantes o tensiones que resuelven
11
+
12
+ Si una melodía no se pega, casi siempre falta el punto 2: es fluida, correcta y sin ningún evento que el oído pueda agarrar.
13
+
14
+ ## Construcción
15
+
16
+ **Grados de escala, no notas.** Escribir `5 - 3 - 2 - 1` en vez de `G - E - D - C` la hace portable y expone la estructura.
17
+
18
+ **Balance salto/grado.** Melodía toda por grados conjuntos: suave y anodina. Toda por saltos: instrumental, difícil de cantar. La proporción típica en música vocal memorable es mayoría de grados con 1-2 saltos ubicados en el punto de mayor interés.
19
+
20
+ **Clímax único.** La nota más aguda debería aparecer una vez, y tarde. Si el punto alto llega en el compás 2, no queda a dónde ir.
21
+
22
+ **Registro como recurso finito.** Cada octava que subís es un recurso que se gasta. Guardá el registro alto para el momento que lo necesita.
23
+
24
+ ## Desarrollo motívico
25
+
26
+ Un motivo es una célula de 2-5 notas. Las transformaciones, de más a menos reconocible:
27
+
28
+ | Transformación | Qué hace |
29
+ |---|---|
30
+ | **Repetición literal** | Establece |
31
+ | **Secuencia** | Mismo motivo, otra altura. La herramienta más eficiente |
32
+ | **Transposición diatónica** | Igual pero adaptado a la escala; cambia intervalos |
33
+ | **Inversión** | Espeja los intervalos. Mismo ADN, otro carácter |
34
+ | **Retrogradación** | Al revés. Reconocible solo si el motivo es rítmicamente distintivo |
35
+ | **Aumentación / disminución** | Duplicar o dividir las duraciones. Aumentación = épico; disminución = urgencia |
36
+ | **Fragmentación** | Quedarse con un trozo y repetirlo. Genera desarrollo/tensión |
37
+ | **Ornamentación** | Rellenar con notas de paso. Cuidado: diluye |
38
+
39
+ En música de juego, la aumentación y la fragmentación de un mismo motivo son la forma más barata de tener 4 variantes de un tema con una sola idea.
40
+
41
+ ## Estructura de frase
42
+
43
+ - **Antecedente / consecuente** — 4+4 compases: la primera termina abierta (semicadencia), la segunda cierra. El patrón de pregunta-respuesta más usado
44
+ - **Sentence** — presentación (2), continuación con fragmentación (2), cadencia (4)
45
+ - **Frases asimétricas** (3, 5, 7 compases) — inquietan, útiles para tensión
46
+ - **Elisión** — la última nota de una frase es la primera de la siguiente. Elimina la respiración, encadena
47
+
48
+ **Prosodia (si hay letra):** las sílabas acentuadas caen en tiempos fuertes y en notas largas. Una melodía que pelea con el acento natural de la palabra suena mal aunque la armonía sea perfecta. Las vocales abiertas soportan notas agudas y largas; las cerradas no.
@@ -0,0 +1,69 @@
1
+ # Orquestación
2
+
3
+ ## Rangos y carácter
4
+
5
+ Rangos prácticos (no extremos virtuosos). El **carácter cambia por registro** en el mismo instrumento — es lo que más se ignora.
6
+
7
+ | Instrumento | Rango práctico | Registro grave | Registro agudo |
8
+ |---|---|---|---|
9
+ | Flauta | C4 – C7 | Aireado, débil, se tapa | Brillante, penetrante |
10
+ | Clarinete | D3 – C6 | Oscuro, cálido, único | Estridente si se fuerza |
11
+ | Oboe | B♭3 – G6 | Nasal, presente | Tenso |
12
+ | Fagot | B♭1 – E5 | Sombrío, cómico | Vulnerable, expresivo |
13
+ | Corno | F2 – F5 | Noble, difuso | Heroico, esfuerzo audible |
14
+ | Trompeta | E3 – C6 | Sólido | Brillante, corta cualquier textura |
15
+ | Trombón | E2 – F4 | Grave, potente | Cantabile |
16
+ | Violín | G3 – E7 | Cálido (cuerda G) | Brillante; muy agudo = tensión |
17
+ | Viola | C3 – E6 | Ronco, melancólico | Delgado |
18
+ | Cello | C2 – C6 | Profundo | El registro más expresivo de la orquesta |
19
+ | Contrabajo | E1 – G4 | Fundamento | Raro, tenso |
20
+ | Voz (soprano) | C4 – A5 | Débil | Potente, esfuerzo audible |
21
+ | Voz (barítono) | A2 – F4 | Cómodo | Intenso |
22
+
23
+ ## Densidad de arreglo
24
+
25
+ **La regla que resuelve el 80% de los problemas: menos elementos, mejor definidos.**
26
+
27
+ | Nivel | Elementos simultáneos | Uso |
28
+ |---|---|---|
29
+ | Íntimo | 1-2 | Momentos de máxima atención |
30
+ | Cámara | 3-5 | Estándar de gameplay sostenido |
31
+ | Pleno | 6-10 | Clímax |
32
+ | Tutti | todo | Una vez, y corto |
33
+
34
+ En música de juego, el nivel de densidad es la palanca adaptativa más eficiente: subir y bajar capas sin cambiar el material.
35
+
36
+ ## Voicing y textura
37
+
38
+ - **Espaciado natural** — intervalos amplios abajo, cerrados arriba. Copia la serie armónica; suena limpio automáticamente
39
+ - **No apilar en el mismo registro** — cuatro instrumentos entre C4 y C5 producen barro. Separar por octavas
40
+ - **Doblar con intención** — al unísono para peso, a la octava para brillo, en 3ªs/6ªs para dulzura. Doblar todo es no doblar nada
41
+ - **Registro medio saturado** — 500 Hz-2 kHz es donde vive el diálogo. En un juego, la música debería *dejar ese rango relativamente libre* si hay VO simultáneo (ver `/audio-mix`)
42
+
43
+ ## Combinaciones que funcionan
44
+
45
+ | Combinación | Efecto |
46
+ |---|---|
47
+ | Cello + corno (unísono) | Calidez con peso |
48
+ | Clarinete grave + viola | Oscuridad ambigua |
49
+ | Flauta + violín (octava) | Brillo aireado |
50
+ | Pizzicato + arpa/mallets | Puntillismo, curiosidad |
51
+ | Cuerdas con sordina + coro suave | Distancia, memoria |
52
+ | Trompas en 5ªs abiertas | Épica; cliché si se abusa |
53
+ | Solo + silencio | Máxima atención |
54
+
55
+ ## Escritura coral / vocal
56
+
57
+ - Rango cómodo, no extremo: la tesitura sostenida importa más que la nota más alta
58
+ - Voice leading estricto: las voces internas se mueven lo mínimo
59
+ - Texto inteligible pide notas más largas y registro medio
60
+ - Vocales abiertas (a, o) para agudos y notas largas; cerradas (i, u) suenan tensas arriba
61
+
62
+ ## Producción-aware
63
+
64
+ Si el material va a un mix con SFX y diálogo encima:
65
+
66
+ - Dejar espacio en 500 Hz-2 kHz cuando puede haber VO
67
+ - El sub (20-60 Hz) suele estar reservado a impactos — no llenarlo con música
68
+ - Los transientes agudos compiten con feedback de UI: si el arreglo tiene mucho hi-hat/percusión brillante, el UI se pierde
69
+ - Arreglos densos sobreviven mal a la compresión lossy de plataforma: el detalle en 6-20 kHz es lo primero que se va
@@ -0,0 +1,49 @@
1
+ # Ritmo y Groove
2
+
3
+ ## Qué es el groove
4
+
5
+ La relación entre una grilla implícita y dónde caen los eventos reales. Sin grilla no hay groove; sin desvío tampoco.
6
+
7
+ Tres capas independientes:
8
+
9
+ 1. **Pulso** — el tempo y su subdivisión
10
+ 2. **Patrón** — qué subdivisiones se atacan
11
+ 3. **Feel** — cuánto se corren los ataques respecto de la grilla, y cómo se acentúan
12
+
13
+ Un patrón correcto con feel plano suena a máquina. El mismo patrón con los backbeats 8-15 ms atrasados y acentuados suena a banda.
14
+
15
+ ## Recursos rítmicos
16
+
17
+ | Recurso | Qué hace |
18
+ |---|---|
19
+ | **Síncopa** | Acentuar una subdivisión débil. El motor de casi todo groove popular |
20
+ | **Anticipación** | Adelantar un ataque medio pulso antes del tiempo fuerte |
21
+ | **Hemiola** | Agrupar 3 donde el metro dice 2 (o al revés). Tensión sin cambiar tempo |
22
+ | **Desplazamiento** | Correr un patrón entero N subdivisiones. Mismo material, otro lugar |
23
+ | **Aumentación / disminución** | Duplicar o partir las duraciones del patrón |
24
+ | **Silencio en el downbeat** | El recurso más fuerte y el menos usado |
25
+ | **Polirritmia** | Dos ciclos de distinta longitud simultáneos (3:2, 4:3). El compuesto se repite cada MCM |
26
+ | **Cross-rhythm** | El acento contradice el metro sostenidamente |
27
+
28
+ ## Feel y microtiming
29
+
30
+ - **Swing** — la primera corchea del par se alarga. Cuantificable como ratio (50:50 recto, ~60:40 swing suave, 66:33 swing fuerte, hasta tresillo)
31
+ - **Laid back** — atacar unos ms después de la grilla. Sensación de relajación, peso
32
+ - **Push** — atacar antes. Urgencia, ansiedad
33
+ - **Flam** — dos instrumentos casi al unísono, corridos unos ms. Engorda el ataque
34
+
35
+ Un desvío de 10-30 ms es feel. Arriba de ~50 ms se percibe como error o como otra subdivisión.
36
+
37
+ ## Métricas impares
38
+
39
+ - **5/4, 7/8** — se sienten como agrupaciones asimétricas (5 = 3+2 o 2+3; 7 = 2+2+3, 3+2+2...). La agrupación importa más que el número
40
+ - **Métrica mixta** — alternar compases. Funciona si el patrón de alternancia es reconocible
41
+ - **Metro aditivo** — construir por células (2+2+3) en vez de dividir el compás
42
+
43
+ Para juegos, las métricas impares complican la sincronización de música adaptativa: los sync points en compás/beat asumen un metro estable. Si el metro cambia, definir los puntos de transición en cues explícitos.
44
+
45
+ ## Groove en el arreglo
46
+
47
+ - **Interlock** — cada instrumento ocupa subdivisiones que los otros dejan libres. El groove emerge del conjunto, no de una parte
48
+ - **Densidad como dinámica** — más subdivisiones atacadas = más energía, sin subir volumen
49
+ - **Espacio** — el groove vive en los silencios. Un patrón con todas las subdivisiones llenas no groovea, machaca
@@ -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.
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: obsidian-canvas
3
+ description: "Crea y edita archivos .canvas (JSON Canvas): nodos de nota, texto, archivo y link, grupos y edges con direccion y color. Triggers: obsidian canvas, json canvas, mapa visual, diagrama de notas, archivo .canvas, pizarra obsidian."
4
+ argument-hint: "[create <descripcion> | explain <archivo.canvas> | edit <archivo.canvas>]"
5
+ category: "pkm"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit
8
+ ---
9
+
10
+ # Obsidian Canvas - JSON Canvas
11
+
12
+ Un `.canvas` es JSON plano con dos arrays: `nodes` y `edges`. El formato es JSON Canvas, un spec abierto, así que el archivo se puede generar y leer sin Obsidian. Adaptado de `kepano/obsidian-skills` al formato de este repo.
13
+
14
+ Modo: `$ARGUMENTS`
15
+
16
+ ## Modos
17
+
18
+ - **`create`**: generar un canvas nuevo desde una descripción o desde un conjunto de notas del vault.
19
+ - **`explain`**: leer un canvas y describir su estructura en texto. Read-only.
20
+ - **`edit`**: agregar o reacomodar nodos de un canvas existente. Pedí approval antes de escribir, y avisá que un canvas abierto en Obsidian sobrescribe el archivo al guardar: hay que cerrarlo antes.
21
+
22
+ ## Estructura
23
+
24
+ ```json
25
+ {
26
+ "nodes": [
27
+ {
28
+ "id": "n1",
29
+ "type": "file",
30
+ "file": "03_Resources/Indices parciales.md",
31
+ "x": 0, "y": 0, "width": 400, "height": 300
32
+ },
33
+ {
34
+ "id": "n2",
35
+ "type": "text",
36
+ "text": "Hipotesis: el costo esta en las lecturas",
37
+ "x": 480, "y": 0, "width": 300, "height": 120,
38
+ "color": "4"
39
+ },
40
+ {
41
+ "id": "g1",
42
+ "type": "group",
43
+ "label": "Investigacion",
44
+ "x": -40, "y": -60, "width": 900, "height": 440
45
+ }
46
+ ],
47
+ "edges": [
48
+ {
49
+ "id": "e1",
50
+ "fromNode": "n1", "fromSide": "right",
51
+ "toNode": "n2", "toSide": "left",
52
+ "label": "sugiere"
53
+ }
54
+ ]
55
+ }
56
+ ```
57
+
58
+ **Nodos.** Campos obligatorios: `id`, `type`, `x`, `y`, `width`, `height`. Tipos:
59
+
60
+ | `type` | Campo propio |
61
+ |---|---|
62
+ | `text` | `text` (markdown) |
63
+ | `file` | `file` (ruta en el vault), `subpath` opcional para un heading o bloque |
64
+ | `link` | `url` |
65
+ | `group` | `label`, `background`, `backgroundStyle` opcionales |
66
+
67
+ **Edges.** Obligatorio `id`, `fromNode`, `toNode`. Opcionales: `fromSide` y `toSide` (`top`, `right`, `bottom`, `left`), `fromEnd`/`toEnd` (`none`, `arrow`), `label`, `color`.
68
+
69
+ **Color.** Un preset `"1"` a `"6"` (rojo, naranja, amarillo, verde, cyan, violeta) o un hex `"#ff0000"`.
70
+
71
+ **Coordenadas.** El eje Y crece hacia abajo. Un grupo no contiene nodos por referencia: los contiene **geométricamente**, por solaparse con su rectángulo. Si movés un nodo fuera del rectángulo, sale del grupo.
72
+
73
+ ## Reglas para generar uno usable
74
+
75
+ - **Los `id` tienen que ser únicos.** Si se repiten, Obsidian se queda con uno solo y el resto desaparece sin error.
76
+ - **Layout en grilla, no apilado en el origen.** Separar los nodos al menos 60px: un canvas con todo en `x: 0, y: 0` se abre como una pila ilegible y reacomodarlo a mano cuesta más que generarlo de nuevo.
77
+ - **Verificar que cada `file` exista** antes de escribir el canvas: un nodo que apunta a una nota inexistente renderiza vacío.
78
+ - Un canvas es para pensar visualmente, no para almacenar conocimiento. Lo que se aprende en un canvas se escribe después como nota atómica.
79
+
80
+ Canvas READY cuando el JSON es válido, los ids son únicos, las rutas existen y el usuario confirmó que abre bien en Obsidian.
81
+
82
+ ## Reglas
83
+
84
+ - No inventar campos que el spec no define: Obsidian los ignora y ensucia el archivo.
85
+ - No reescribir un canvas entero para agregar un nodo: `Edit` sobre el array.
86
+ - Pedí approval antes de escribir o sobrescribir un `.canvas`, y verificá que no esté abierto en Obsidian.
87
+ - Sin guiones largos en labels ni en nodos de texto.
88
+
89
+ ## Handoff
90
+
91
+ Si lo que hacía falta era una vista tabular y no un mapa visual, el skill correcto es `/obsidian-bases`. Cuando el canvas dejó una conclusión, el siguiente paso es `/zettel` para escribirla como nota atómica: el canvas es el andamio, la nota es lo que queda.
@@ -0,0 +1,110 @@
1
+ ---
2
+ name: obsidian-markdown
3
+ description: "Sintaxis de Obsidian Flavored Markdown: wikilinks, embeds, callouts, block IDs, propiedades, tags, highlights, math y mermaid. Valida o corrige una nota. Triggers: sintaxis obsidian, wikilink, callout, embed, block id, obsidian markdown, esto renderiza bien en obsidian, frontmatter obsidian."
4
+ argument-hint: "[reference | check <archivo> | fix <archivo>]"
5
+ category: "pkm"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit
8
+ ---
9
+
10
+ # Obsidian Markdown - Sintaxis nativa
11
+
12
+ Obsidian extiende CommonMark y GFM. Este skill cubre **solo las extensiones propias de Obsidian**: el markdown estándar (títulos, negrita, listas, tablas, código) se da por sabido. Adaptado de `kepano/obsidian-skills` al formato de este repo.
13
+
14
+ Modo y archivo: `$ARGUMENTS`
15
+
16
+ ## Modos
17
+
18
+ - **`reference`** (default): responder la duda de sintaxis con la tabla de abajo, sin tocar archivos.
19
+ - **`check <archivo>`**: leer la nota y reportar qué no va a renderizar. Read-only.
20
+ - **`fix <archivo>`**: corregir lo que `check` encontró. Pedí approval antes de escribir, mostrando el diff propuesto.
21
+
22
+ ## Links y embeds
23
+
24
+ ```markdown
25
+ [[Nota]] link interno
26
+ [[Nota|Texto visible]] alias
27
+ [[Nota#Titulo]] link a un heading
28
+ [[Nota#^block-id]] link a un bloque
29
+ [[#Titulo en esta nota]] link interno a la misma nota
30
+
31
+ ![[Nota]] embed de la nota completa
32
+ ![[Nota#Titulo]] embed de una seccion
33
+ ![[imagen.png|300]] embed con ancho
34
+ ![[doc.pdf#page=3]] embed de una pagina de PDF
35
+ ```
36
+
37
+ Un block ID se define agregando `^mi-id` al final del párrafo. En listas y citas va en una línea aparte después del bloque.
38
+
39
+ **`[[wikilinks]]` para lo interno, `[texto](url)` solo para URLs externas.** No es estilo: Obsidian actualiza los wikilinks cuando renombrás una nota dentro de la app, y no toca los markdown links.
40
+
41
+ ## Callouts
42
+
43
+ ```markdown
44
+ > [!note]
45
+ > Callout basico.
46
+
47
+ > [!warning] Titulo propio
48
+ > Con titulo custom.
49
+
50
+ > [!faq]- Colapsado por default
51
+ > El `-` lo colapsa, el `+` lo abre.
52
+ ```
53
+
54
+ Tipos: `note`, `tip`, `info`, `warning`, `danger`, `bug`, `example`, `quote`, `success`, `failure`, `question`, `abstract`, `todo`. Un tipo inventado renderiza como `note` sin avisar, y ese es el error de callout más común.
55
+
56
+ ## Propiedades (frontmatter)
57
+
58
+ ```yaml
59
+ ---
60
+ title: Mi nota
61
+ date: 2026-07-27
62
+ tags:
63
+ - proyecto
64
+ - activo
65
+ aliases:
66
+ - Nombre alternativo
67
+ cssclasses:
68
+ - custom
69
+ ---
70
+ ```
71
+
72
+ `tags`, `aliases` y `cssclasses` son las tres propiedades que Obsidian entiende de forma nativa. El resto son campos propios y los consume Bases o Dataview.
73
+
74
+ ## Resto de la sintaxis propia
75
+
76
+ ```markdown
77
+ #tag #anidado/tag tags inline (no pueden empezar con numero)
78
+ ==resaltado== highlight
79
+ %%comentario%% invisible en lectura
80
+ $e^{i\pi}+1=0$ y $$...$$ math LaTeX inline y en bloque
81
+ texto[^1] / ^[nota inline] footnotes
82
+ ```
83
+
84
+ Los bloques ` ```mermaid ` renderizan diagramas nativamente.
85
+
86
+ ## Qué revisa `check`
87
+
88
+ | Check | Qué busca | Verdict |
89
+ |---|---|---|
90
+ | Tipo de callout | `> [!tipo]` con un tipo que no existe | FAIL: renderiza como `note` |
91
+ | Links externos como wikilink | `[[https://...]]` | FAIL: no resuelve |
92
+ | Links internos como markdown | `[texto](Nota.md)` dentro del vault | CONCERNS: se rompe al renombrar |
93
+ | Frontmatter | Abre con `---` en la primera línea y cierra | FAIL si no cierra: Obsidian lo muestra como texto |
94
+ | `tags` con `#` en frontmatter | `tags: [#foo]` | CONCERNS: el `#` no va en frontmatter |
95
+ | Block IDs | Duplicados en la misma nota | FAIL: el link resuelve al primero |
96
+ | Embeds de imagen | Ancho no numérico (`![[img.png|grande]]`) | CONCERNS: se ignora |
97
+ | Espacios en `[[ Nota ]]` | Espacios internos al principio o final del target | CONCERNS: puede no resolver |
98
+
99
+ Nota COMPLIANT cuando ninguna de estas falla.
100
+
101
+ ## Reglas
102
+
103
+ - No reformatear la nota entera cuando el pedido es arreglar un detalle: `Edit` sobre citas textuales, no `Write` del archivo completo.
104
+ - No convertir markdown links externos a wikilinks: los externos van como markdown link.
105
+ - No inventar tipos de callout ni propiedades que Obsidian no reconoce.
106
+ - Sin guiones largos en lo que agregues.
107
+
108
+ ## Handoff
109
+
110
+ Si la duda era de vistas agregadas y no de sintaxis de nota, el skill correcto es `/obsidian-bases`; si era de un canvas, `/obsidian-canvas`. Cuando la nota queda COMPLIANT, seguí con el flujo que la produjo (`/zettel`, `/review-dump` o `/vault-clip`).
@@ -12,6 +12,8 @@ allowed values (for checkboxes / dropdowns), and page number.
12
12
  Exit codes: 0 success, 1 bad args / file not found, 2 dep missing, 3 read error
13
13
  """
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import argparse
16
18
  import json
17
19
  import sys