agentsclimarketplace

Bases

Skill Vasallo94/skill-issue/skills/obsidian/bases

A curated marketplace of open Agent Skills (SKILL.md) — the real skills I use day to day, compatible with the open skills ecosystem.

Install
npx -y skills add Vasallo94/skill-issue --skill bases

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Crea y edita archivos Obsidian Bases (.base) para vistas de base de datos sobre las notas del vault. Usar para dashboards, indices de proyecto, trackers de recursos y cualquier vista filtrada o calculada.

SKILL.md

9.3 KB, as published. Nobody here has run it

Obsidian Bases

Skill para crear archivos .base que funcionan como vistas de base de datos sobre las notas del vault. Ideales para notas de tipo indice y dashboards.

Cuando usar esta skill

Cuando el usuario quiera:

  • Crear un dashboard o indice de proyecto
  • Ver notas filtradas por tipo, estado, tags o fechas
  • Montar un tracker de recursos o tareas
  • Crear una vista calculada (dias hasta vencimiento, contadores, etc.)

[!CAUTION] Antes de crear o editar notas, lee las [[.agents/REGLAS_GLOBALES|Reglas Globales]].

Estructura de un archivo .base

Los archivos .base contienen YAML valido con esta estructura:

filters:       # Filtros globales (aplican a TODAS las vistas)
formulas:      # Propiedades calculadas
properties:    # Nombres de visualizacion y configuracion
summaries:     # Formulas de resumen personalizadas
views:         # Una o mas vistas (table, cards, list, map)

Filtros

Los filtros seleccionan que notas aparecen. Se pueden aplicar globalmente o por vista.

Estructura de filtros

# Filtro unico
filters: 'status == "completo"'

# AND: todas las condiciones deben cumplirse
filters:
  and:
    - 'status == "completo"'
    - 'type == "conocimiento"'

# OR: cualquier condicion vale
filters:
  or:
    - file.hasTag("python")
    - file.hasTag("java")

# NOT: excluir coincidencias
filters:
  not:
    - file.hasTag("archivo")

# Anidados
filters:
  and:
    - file.hasTag("proyecto")
    - or:
        - 'status == "en_proceso"'
        - 'status == "borrador"'

Operadores

OperadorDescripcion
==Igual
!=Distinto
>Mayor que
<Menor que
>=Mayor o igual
<=Menor o igual
&&Y logico
||O logico
!Negacion

Propiedades

Tres tipos de propiedades

  1. De la nota — del frontmatter: type, status, tags, created
  2. Del archivo — metadatos del fichero: file.name, file.mtime, etc.
  3. Formulas — valores calculados: formula.mi_formula

Propiedades de archivo

PropiedadTipoDescripcion
file.nameStringNombre del archivo
file.basenameStringNombre sin extension
file.pathStringRuta completa
file.folderStringCarpeta padre
file.extStringExtension
file.sizeNumberTamano en bytes
file.ctimeDateFecha de creacion
file.mtimeDateFecha de modificacion
file.tagsListTags del archivo
file.linksListEnlaces internos
file.backlinksListNotas que enlazan a esta

Formulas

Las formulas calculan valores a partir de propiedades.

formulas:
  # Aritmetica
  total: "precio * cantidad"

  # Condicional
  icono_estado: 'if(status == "completo", "OK", "Pendiente")'

  # Formato de fecha
  creado: 'file.ctime.format("YYYY-MM-DD")'

  # Dias desde creacion
  dias_antiguo: '(now() - file.ctime).days'

  # Dias hasta fecha limite
  dias_hasta_due: 'if(due_date, (date(due_date) - today()).days, "")'

Funciones principales

FuncionFirmaDescripcion
date()date(string): dateParsear string a fecha (YYYY-MM-DD HH:mm:ss)
now()now(): dateFecha y hora actuales
today()today(): dateFecha actual (hora = 00:00:00)
if()if(cond, verdadero, falso?)Condicional
duration()duration(string): durationParsear duracion
file()file(path): fileObtener objeto de archivo
link()link(path, display?): LinkCrear enlace

Aritmetica de fechas

# Unidades: y/year/years, M/month/months, d/day/days,
#           w/week/weeks, h/hour/hours, m/minute/minutes
"now() + \"1 day\""              # Manana
"today() + \"7d\""               # Dentro de una semana
"(now() - file.ctime).days"      # Dias desde creacion

[!WARNING] Restar fechas devuelve un tipo Duration, no un numero. Siempre acceder a .days, .hours, etc. antes de aplicar .round().

# CORRECTO
"(now() - file.ctime).days.round(0)"

# INCORRECTO: Duration no soporta .round() directamente
"(now() - file.ctime).round(0)"

Null checks

Las propiedades pueden no existir en todas las notas. Usar if() para proteger:

# CORRECTO
'if(due_date, (date(due_date) - today()).days, "")'

# INCORRECTO: falla si due_date no existe
"(date(due_date) - today()).days"

Tipos de vista

Table

views:
  - type: table
    name: "Mi Tabla"
    order:
      - file.name
      - status
      - created
    summaries:
      precio: Sum

Cards

views:
  - type: cards
    name: "Galeria"
    order:
      - file.name
      - cover
      - tags

List

views:
  - type: list
    name: "Lista Simple"
    order:
      - file.name
      - status

Resumenes predefinidos

NombreTipo inputDescripcion
AverageNumberMedia
SumNumberSuma
Min / MaxNumberMinimo / Maximo
MedianNumberMediana
Earliest / LatestDateMas antigua / reciente
Checked / UncheckedBooleanConteo de verdadero/falso
Empty / FilledAnyConteo de vacios/llenos
UniqueAnyConteo de valores unicos

Incrustar bases en notas

![[MiBase.base]]
![[MiBase.base#Nombre de Vista]]

Reglas YAML

  • Usar comillas simples para formulas con comillas dobles: 'if(done, "Si", "No")'
  • Usar comillas dobles para strings simples: "Mi Vista"
  • Escapar comillas anidadas correctamente

Ejemplos para nuestro vault

Dashboard de proyecto

Ubicacion: 02_Proyectos/<proyecto>/Dashboard.base

filters:
  and:
    - file.inFolder("02_Proyectos/Alpha")
    - 'file.ext == "md"'

formulas:
  dias_sin_editar: '(now() - file.mtime).days.round(0)'
  tipo_label: 'if(type == "adr", "ADR", if(type == "doc-proyecto", "Doc", if(type == "reunion", "Reunion", type)))'

properties:
  formula.dias_sin_editar:
    displayName: "Dias sin editar"
  formula.tipo_label:
    displayName: "Tipo"

views:
  - type: table
    name: "Todas las notas"
    order:
      - file.name
      - status
      - formula.tipo_label
      - formula.dias_sin_editar
      - file.mtime
    groupBy:
      property: status
      direction: ASC

  - type: table
    name: "ADRs"
    filters:
      and:
        - 'type == "adr"'
    order:
      - file.name
      - status
      - created

Tracker de recursos

Ubicacion: 04_Recursos/Tracker.base

filters:
  and:
    - 'type == "recurso"'
    - 'file.ext == "md"'

formulas:
  dias_desde_captura: '(now() - file.ctime).days.round(0)'
  procesado: 'if(status == "completo", "Si", if(status == "en_proceso", "En curso", "Pendiente"))'

properties:
  source_type:
    displayName: "Tipo de fuente"
  formula.procesado:
    displayName: "Procesado"
  formula.dias_desde_captura:
    displayName: "Dias"

views:
  - type: table
    name: "Pendientes de procesar"
    filters:
      and:
        - 'status == "borrador"'
    order:
      - file.name
      - source_type
      - formula.dias_desde_captura
      - tags

  - type: table
    name: "Todos los recursos"
    order:
      - file.name
      - formula.procesado
      - source_type
      - tags
    summaries:
      formula.dias_desde_captura: Average

  - type: cards
    name: "Galeria"
    order:
      - file.name
      - source_type
      - formula.procesado

Indice de conocimiento

Ubicacion: 03_Conocimiento/Indice.base

filters:
  and:
    - file.inFolder("03_Conocimiento")
    - 'file.ext == "md"'

formulas:
  backlink_count: 'file.backlinks.length'
  dias_sin_editar: '(now() - file.mtime).days.round(0)'
  necesita_revision: 'if((now() - file.mtime).days > 180, "Revisar", "")'

properties:
  formula.backlink_count:
    displayName: "Backlinks"
  formula.necesita_revision:
    displayName: "Estado"

views:
  - type: table
    name: "Por popularidad"
    order:
      - file.name
      - tags
      - formula.backlink_count
      - formula.dias_sin_editar
      - formula.necesita_revision
    groupBy:
      property: file.folder
      direction: ASC

  - type: table
    name: "Necesitan revision"
    filters:
      and:
        - 'formula.necesita_revision != ""'
    order:
      - file.name
      - file.mtime
      - formula.dias_sin_editar

Notas estancadas (para lint del organizador)

Ubicacion: 00_Sistema/Estancadas.base

filters:
  and:
    - 'file.ext == "md"'
    - or:
        - 'status == "borrador"'
        - 'status == "en_proceso"'

formulas:
  dias_sin_editar: '(now() - file.mtime).days.round(0)'
  urgencia: 'if((now() - file.mtime).days > 90, "Critico", if((now() - file.mtime).days > 30, "Revisar", "OK"))'

properties:
  formula.urgencia:
    displayName: "Urgencia"

views:
  - type: table
    name: "Notas estancadas"
    filters:
      and:
        - 'formula.dias_sin_editar > 30'
    order:
      - file.name
      - status
      - type
      - formula.dias_sin_editar
      - formula.urgencia
      - file.folder
    groupBy:
      property: formula.urgencia
      direction: DESC

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.