Главная · Скиллы · obsidian-bases

obsidian-basesObsidian Bases Kepano

kepano/obsidian-skills

Obsidian Bases.

Установка

npx -y skills add kepano/obsidian-skills --skill obsidian-bases --agent claude-code

Obsidian Bases

Создание и редактирование файлов Obsidian Bases (.base): представления, фильтры, формулы, сводки. Используйте при работе с .base файлами, создании табличных/карточных представлений заметок.

Рабочий процесс

  1. Создать .base файл в хранилище с корректным YAML
  2. Определить область через filters (по тегу, папке, свойству, дате)
  3. Добавить формулы в секцию formulas (опционально)
  4. Настроить представления: table, cards, list, map
  5. Проверить: валидный YAML, все referenced свойства и формулы существуют
  6. Открыть в Obsidian для подтверждения корректного рендеринга

Схема файла

# Глобальные фильтры применяются ко ВСЕМ представлениям
filters:
  and:
    - 'status == "active"'
    - not:
        - 'file.hasTag("archived")'

# Формулы — вычисляемые свойства
formulas:
  formula_name: 'expression'

# Отображаемые имена и настройки свойств
properties:
  property_name:
    displayName: "Отображаемое имя"
  formula.formula_name:
    displayName: "Имя формулы"

# Кастомные сводные формулы
summaries:
  custom_summary_name: 'values.mean().round(3)'

# Одно или несколько представлений
views:
  - type: table | cards | list | map
    name: "Имя представления"
    limit: 10
    groupBy:
      property: property_name
      direction: ASC | DESC
    filters:
      and:
        - 'status == "active"'
    order:
      - file.name
      - property_name
      - formula.formula_name
    summaries:
      property_name: Average

Синтаксис фильтров

# Одиночный фильтр
filters: 'status == "done"'

# AND — все условия должны быть истинны
filters:
  and:
    - 'status == "done"'
    - 'priority > 3'

# OR — любое условие может быть истинным
filters:
  or:
    - 'file.hasTag("book")'
    - 'file.hasTag("article")'

# NOT — исключить совпадающие элементы
filters:
  not:
    - 'file.hasTag("archived")'

# Вложенные фильтры
filters:
  or:
    - file.hasTag("tag")
    - and:
        - file.hasTag("book")
        - file.hasLink("Textbook")

Операторы фильтров

ОператорОписание
==равно
!=не равно
>, <, >=, <=сравнение
&&, ||, !логические операторы

Свойства

Три типа свойств:

  1. Свойства заметки — из frontmatter: note.author или просто author
  2. Свойства файла — метаданные: file.name, file.mtime и др.
  3. Формулы — вычисляемые значения: formula.my_formula

Ссылка на файловые свойства

СвойствоТипОписание
file.nameStringИмя файла
file.basenameStringИмя без расширения
file.pathStringПолный путь
file.folderStringПуть к папке
file.sizeNumberРазмер в байтах
file.ctimeDateВремя создания
file.mtimeDateВремя изменения
file.tagsListВсе теги файла
file.linksListВнутренние ссылки
file.backlinksListСсылки на этот файл

Синтаксис формул

formulas:
  # Простая арифметика
  total: "price * quantity"

  # Условная логика
  status_icon: 'if(done, "✅", "⏳")'

  # Форматирование строк
  formatted_price: 'if(price, price.toFixed(2) + " руб.")'

  # Форматирование дат
  created: 'file.ctime.format("YYYY-MM-DD")'

  # Дней с момента создания (.days для Duration)
  days_old: '(now() - file.ctime).days'

  # Дней до дедлайна
  days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'

Ключевые функции

ФункцияОписание
date(string)Парсит строку в дату
now()Текущие дата и время
today()Текущая дата (время 00:00:00)
if(cond, true, false?)Условное выражение
duration(string)Парсит строку длительности
file(path)Получить объект файла
link(path, display?)Создать ссылку

Тип Duration

Вычитание двух дат возвращает Duration, не число.

# ПРАВИЛЬНО — доступ к .days, затем числовые функции
"(date(due_date) - today()).days"
"(now() - file.ctime).days.round(0)"

# НЕПРАВИЛЬНО — Duration не поддерживает .round() напрямую
# "(now() - file.ctime).round(0)"  ← ошибка

Типы представлений

# Таблица
views:
  - type: table
    name: "Мои задачи"
    order: [file.name, status, due_date]
    summaries: {price: Sum}

# Карточки
views:
  - type: cards
    name: "Галерея"
    order: [file.name, cover_image, description]

# Список
views:
  - type: list
    name: "Простой список"
    order: [file.name, status]

Встраивание

![[MyBase.base]]
![[MyBase.base#Имя представления]]

Правила кавычек YAML

  • Одинарные кавычки для формул с двойными кавычками внутри: 'if(done, "Yes", "No")'
  • Двойные кавычки для простых строк: "Имя представления"

Устранение неполадок

Синтаксические ошибки YAML

# НЕПРАВИЛЬНО — двоеточие в неквотированной строке
displayName: Status: Active

# ПРАВИЛЬНО
displayName: "Status: Active"

Частые ошибки формул

# НЕПРАВИЛЬНО — Duration не число
"(now() - file.ctime).round(0)"

# ПРАВИЛЬНО — сначала .days, потом round
"(now() - file.ctime).days.round(0)"

# НЕПРАВИЛЬНО — свойство может отсутствовать
"(date(due_date) - today()).days"

# ПРАВИЛЬНО — защита через if()
'if(due_date, (date(due_date) - today()).days, "")'

Готовые примеры

Трекер задач

filters:
  and:
    - file.hasTag("task")
    - 'file.ext == "md"'

formulas:
  days_until_due: 'if(due, (date(due) - today()).days, "")'
  is_overdue: 'if(due, date(due) < today() && status != "done", false)'
  priority_label: 'if(priority == 1, "🔴 High", if(priority == 2, "🟡 Medium", "🟢 Low"))'

views:
  - type: table
    name: "Активные задачи"
    filters:
      and: ['status != "done"']
    order: [file.name, status, formula.priority_label, due, formula.days_until_due]
    groupBy: {property: status, direction: ASC}

Список чтения

filters:
  or:
    - file.hasTag("book")
    - file.hasTag("article")

formulas:
  reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
  status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))'

views:
  - type: cards
    name: "Библиотека"
    order: [cover, file.name, author, formula.status_icon]

Из того же репозитория