bases — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited bases (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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 el usuario quiera:
[!CAUTION] Antes de crear o editar notas, lee las [[.agents/REGLAS_GLOBALES|Reglas Globales]].
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)Los filtros seleccionan que notas aparecen. Se pueden aplicar globalmente o por vista.
# 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"'| Operador | Descripcion | ||
|---|---|---|---|
== | Igual | ||
!= | Distinto | ||
> | Mayor que | ||
< | Menor que | ||
>= | Mayor o igual | ||
<= | Menor o igual | ||
&& | Y logico | ||
| `\ | \ | ` | O logico |
! | Negacion |
type, status, tags, createdfile.name, file.mtime, etc.formula.mi_formula| Propiedad | Tipo | Descripcion |
|---|---|---|
file.name | String | Nombre del archivo |
file.basename | String | Nombre sin extension |
file.path | String | Ruta completa |
file.folder | String | Carpeta padre |
file.ext | String | Extension |
file.size | Number | Tamano en bytes |
file.ctime | Date | Fecha de creacion |
file.mtime | Date | Fecha de modificacion |
file.tags | List | Tags del archivo |
file.links | List | Enlaces internos |
file.backlinks | List | Notas que enlazan a esta |
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, "")'| Funcion | Firma | Descripcion |
|---|---|---|
date() | date(string): date | Parsear string a fecha (YYYY-MM-DD HH:mm:ss) |
now() | now(): date | Fecha y hora actuales |
today() | today(): date | Fecha actual (hora = 00:00:00) |
if() | if(cond, verdadero, falso?) | Condicional |
duration() | duration(string): duration | Parsear duracion |
file() | file(path): file | Obtener objeto de archivo |
link() | link(path, display?): Link | Crear enlace |
# 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)"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"views:
- type: table
name: "Mi Tabla"
order:
- file.name
- status
- created
summaries:
precio: Sumviews:
- type: cards
name: "Galeria"
order:
- file.name
- cover
- tagsviews:
- type: list
name: "Lista Simple"
order:
- file.name
- status| Nombre | Tipo input | Descripcion |
|---|---|---|
Average | Number | Media |
Sum | Number | Suma |
Min / Max | Number | Minimo / Maximo |
Median | Number | Mediana |
Earliest / Latest | Date | Mas antigua / reciente |
Checked / Unchecked | Boolean | Conteo de verdadero/falso |
Empty / Filled | Any | Conteo de vacios/llenos |
Unique | Any | Conteo de valores unicos |
![[MiBase.base]]
![[MiBase.base#Nombre de Vista]]'if(done, "Si", "No")'"Mi Vista"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
- createdUbicacion: 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.procesadoUbicacion: 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_editarUbicacion: 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~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.